سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

CMS نویس مرجعی برای آموزش برنامه نویسی وب و PHP، توسعه افزونه‌های اختصاصی وردپرس، طراحی ورک‌فلو و اتوماسیون با n8n و توسعه CMS های اختصاصی است. هدف ما ارائه آموزش‌های کاربردی و راهکارهای حرفه‌ای برای توسعه‌دهندگان، کسب‌وکارها و علاقه‌مندان به دنیای برنامه‌نویسی است.

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
CRUD در PHP و MySQL چیست؟ آموزش INSERT، SELECT، UPDATE و DELETE با مثال عملی

CRUD در PHP و MySQL چیست؟ آموزش INSERT، SELECT، UPDATE و DELETE با مثال عملی

ممدیر کل سیستم ۶ مهر ۱۴۰۵ ۲۰ دقیقه مطالعه ۱ بازدید
CRUD در PHP و MySQL چیست؟ آموزش INSERT، SELECT، UPDATE و DELETE با مثال عملی

تقریباً هر برنامه تحت وبی که با داده‌های کاربران، محصولات، سفارش‌ها، مقالات یا اطلاعات حساب کاربری سروکار دارد، به چهار عملیات اصلی نیاز دارد: ایجاد، خواندن، ویرایش و حذف اطلاعات.

این چهار عملیات با اصطلاح CRUD شناخته می‌شوند.

CRUD مخفف چهار عملیات زیر است:

  • Create → ایجاد اطلاعات
  • Read → خواندن اطلاعات
  • Update → ویرایش اطلاعات
  • Delete → حذف اطلاعات

در PHP معمولاً برای انجام این عملیات روی داده‌های MySQL از کتابخانه‌هایی مانند PDO یا MySQLi استفاده می‌شود.

در این مقاله یک سیستم CRUD ساده را با PHP + MySQL + PDO پیاده‌سازی می‌کنیم و با مفاهیمی مانند SELECT، INSERT، UPDATE، DELETE و Prepared Statement آشنا می‌شویم.


CRUD چیست؟

CRUD یک مفهوم عمومی در برنامه‌نویسی و طراحی نرم‌افزار است که چهار عملیات اصلی کار با داده را مشخص می‌کند.

فرض کنید یک فروشگاه اینترنتی داریم و اطلاعات محصولات در MySQL ذخیره شده است.

برای مدیریت محصولات باید بتوانیم:

  1. محصول جدید ایجاد کنیم.
  2. محصولات موجود را مشاهده کنیم.
  3. اطلاعات یک محصول را ویرایش کنیم.
  4. محصول را حذف کنیم.

این دقیقاً همان CRUD است.

عملیاتمفهومSQL
Createایجاد دادهINSERT
Readخواندن دادهSELECT
Updateویرایش دادهUPDATE
Deleteحذف دادهDELETE

بنابراین می‌توان گفت CRUD ارتباط بسیار مستقیمی با دستورات اصلی SQL دارد.


# CRUD در PHP و MySQL چگونه کار می‌کند؟

معمولاً ساختار کلی به شکل زیر است:


کاربر

  ↓

فرم HTML

  ↓

PHP

  ↓

PDO

  ↓

MySQL

  ↓

Database

برای مثال وقتی کاربر یک محصول جدید ایجاد می‌کند:


فرم ایجاد محصول

       ↓

      PHP

       ↓

   اعتبارسنجی

       ↓

Prepared Statement

       ↓

     MySQL

       ↓

   ذخیره محصول

در عملیات خواندن نیز مسیر برعکس می‌شود:


MySQL

  ↓

SELECT

  ↓

PDO

  ↓

PHP

  ↓

HTML

  ↓

نمایش اطلاعات


# پیش‌نیازهای ساخت CRUD با PHP

برای اجرای مثال‌های این مقاله به موارد زیر نیاز داریم:

  • PHP
  • MySQL
  • Apache یا PHP Built-in Server
  • PDO
  • یک ویرایشگر کد
  • مرورگر

اگر PHP را روی سیستم خود نصب کرده‌اید، ابتدا باید یک Database در MySQL ایجاد کنیم.


# ساخت Database برای پروژه CRUD

فرض کنید می‌خواهیم یک سیستم مدیریت محصولات بسازیم.

ابتدا یک Database ایجاد می‌کنیم:


CREATE DATABASE shop

CHARACTER SET utf8mb4

COLLATE utf8mb4_unicode_ci;

سپس Database را انتخاب می‌کنیم:


USE shop;

حالا جدول محصولات را ایجاد می‌کنیم:


CREATE TABLE products (

    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,

    name VARCHAR(255) NOT NULL,

    price DECIMAL(12, 2) NOT NULL,

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

جدول ما سه فیلد اصلی دارد:

  • id
  • name
  • price

فیلد id شناسه یکتای هر محصول است.


# اتصال PHP به MySQL با PDO

برای انجام عملیات CRUD ابتدا باید PHP را به MySQL متصل کنیم.

فایل database.php را ایجاد کنید:


<?php



$host = '127.0.0.1';

$db   = 'shop';

$user = 'root';

$pass = '';



$dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4";



$options = [

    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,

    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,

    PDO::ATTR_EMULATE_PREPARES   => false,

];



$pdo = new PDO($dsn, $user, $pass, $options);

در اینجا متغیر $pdo اتصال ما به Database است.

بعد از آن می‌توانیم Queryهای مختلف را با استفاده از این متغیر اجرا کنیم.


# Create در CRUD؛ ایجاد اطلاعات با INSERT

اولین بخش CRUD مربوط به ایجاد داده است.

برای ایجاد رکورد جدید در MySQL از INSERT استفاده می‌کنیم.

مثلاً:


INSERT INTO products (name, price)

VALUES ('Laptop', 50000);

اما در PHP بهتر است اطلاعات کاربر را مستقیماً داخل Query قرار ندهیم.

به جای آن از Prepared Statement استفاده می‌کنیم.


$name = 'Laptop';

$price = 50000;



$sql = "INSERT INTO products (name, price)

        VALUES (:name, :price)";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'name' => $name,

    'price' => $price,

]);

در این مثال:


:name

و


:price

پارامترهای Query هستند.

مقادیر واقعی بعداً توسط execute() به Query منتقل می‌شوند.


# چرا باید از Prepared Statement استفاده کنیم؟

یکی از دلایل مهم استفاده از Prepared Statement جلوگیری از SQL Injection است.

روش ناامن:


$name = $_POST['name'];



$sql = "INSERT INTO products (name)

        VALUES ('$name')";

در این روش داده ورودی کاربر مستقیماً وارد Query شده است.

این کار می‌تواند باعث ایجاد مشکلات امنیتی شود.

روش بهتر:


$sql = "INSERT INTO products (name)

        VALUES (:name)";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'name' => $name,

]);

در این روش داده کاربر به‌عنوان مقدار پارامتر Query پردازش می‌شود.

برای اطلاعات بیشتر درباره این موضوع می‌توانید به مقاله SQL Injection در PHP مراجعه کنید.


# دریافت ID رکورد ایجادشده

بعد از ایجاد یک رکورد ممکن است به ID آن نیاز داشته باشیم.

برای مثال:


$sql = "INSERT INTO products (name, price)

        VALUES (:name, :price)";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'name' => 'Laptop',

    'price' => 50000,

]);



$id = $pdo->lastInsertId();



echo $id;

متد:


lastInsertId()

شناسه آخرین رکورد ایجادشده را برمی‌گرداند.


# Read در CRUD؛ خواندن اطلاعات با SELECT

مرحله بعدی خواندن اطلاعات است.

برای این کار از SELECT استفاده می‌کنیم.

مثلاً:


SELECT * FROM products;

در PHP:


$stmt = $pdo->query("SELECT * FROM products");



$products = $stmt->fetchAll();

حالا $products شامل اطلاعات محصولات است.

برای نمایش آنها:


foreach ($products as $product) {

    echo $product['name'];

    echo '<br>';

}


# دریافت یک رکورد با SELECT

گاهی به جای تمام محصولات فقط یک محصول را می‌خواهیم.

مثلاً محصولی که ID آن 5 است:


SELECT * FROM products

WHERE id = 5;

در PHP بهتر است ID را نیز با Prepared Statement ارسال کنیم:


$id = 5;



$sql = "SELECT * FROM products

        WHERE id = :id";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'id' => $id,

]);



$product = $stmt->fetch();

اگر رکورد پیدا شود، اطلاعات آن در $product قرار می‌گیرد.

مثلاً:


echo $product['name'];

echo $product['price'];


# تفاوت fetch و fetchAll در PDO

دو متد بسیار پرکاربرد PDO عبارت‌اند از:


fetch()

و:


fetchAll()

fetch() معمولاً برای دریافت یک رکورد استفاده می‌شود:


$product = $stmt->fetch();

در حالی که fetchAll() چندین رکورد را برمی‌گرداند:


$products = $stmt->fetchAll();

مثلاً برای صفحه لیست محصولات:


$stmt = $pdo->query("SELECT * FROM products");



$products = $stmt->fetchAll();



foreach ($products as $product) {

    echo $product['name'];

}


# Update در CRUD؛ ویرایش اطلاعات

سومین عملیات CRUD مربوط به Update است.

برای تغییر اطلاعات در MySQL از UPDATE استفاده می‌کنیم.

مثلاً:


UPDATE products

SET name = 'Gaming Laptop',

    price = 75000

WHERE id = 5;

در PHP:


$id = 5;

$name = 'Gaming Laptop';

$price = 75000;



$sql = "UPDATE products

        SET name = :name,

            price = :price

        WHERE id = :id";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'name' => $name,

    'price' => $price,

    'id'   => $id,

]);

قسمت بسیار مهم Query این است:


WHERE id = :id

اگر WHERE را فراموش کنیم، ممکن است تمام رکوردهای جدول تغییر کنند.

مثلاً این Query خطرناک است:


UPDATE products

SET price = 10000;

چون قیمت تمام محصولات را تغییر می‌دهد.


# Delete در CRUD؛ حذف اطلاعات

آخرین عملیات اصلی CRUD، حذف اطلاعات است.

برای حذف از DELETE استفاده می‌کنیم.

مثلاً:


DELETE FROM products

WHERE id = 5;

در PHP:


$id = 5;



$sql = "DELETE FROM products

        WHERE id = :id";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'id' => $id,

]);

باز هم وجود WHERE بسیار مهم است.

این Query:


DELETE FROM products;

تمام رکوردهای جدول را حذف می‌کند.

بنابراین در سیستم‌های واقعی باید برای عملیات حذف دقت زیادی داشته باشید.


# بررسی تعداد رکوردهای تغییرکرده

بعد از UPDATE یا DELETE می‌توانیم تعداد رکوردهای تحت تأثیر قرارگرفته را بررسی کنیم.

مثلاً:


$stmt->execute([

    'id' => $id,

]);



if ($stmt->rowCount() > 0) {

    echo 'عملیات با موفقیت انجام شد.';

} else {

    echo 'رکوردی تغییر نکرد.';

}

با این روش می‌توانیم متوجه شویم آیا عملیات واقعاً روی رکوردی اثر گذاشته است یا خیر.


# ساخت یک CRUD ساده با PHP

حالا می‌توانیم ساختار یک پروژه ساده CRUD را طراحی کنیم.

ساختار پیشنهادی:


crud/

│

├── database.php

├── index.php

├── create.php

├── store.php

├── edit.php

├── update.php

└── delete.php

وظیفه هر فایل:

فایلوظیفه
database.phpاتصال به MySQL
index.phpنمایش محصولات
create.phpفرم ایجاد محصول
store.phpذخیره محصول
edit.phpفرم ویرایش
update.phpذخیره تغییرات
delete.phpحذف محصول

# ساخت صفحه نمایش محصولات

فایل index.php:


<?php



require 'database.php';



$stmt = $pdo->query("SELECT * FROM products ORDER BY id DESC");



$products = $stmt->fetchAll();



?>



<!DOCTYPE html>

<html lang="fa">

<head>

    <meta charset="UTF-8">

    <title>محصولات</title>

</head>

<body>



<h1>لیست محصولات</h1>



<a href="create.php">افزودن محصول</a>



<table border="1">

    <thead>

        <tr>

            <th>ID</th>

            <th>نام</th>

            <th>قیمت</th>

            <th>عملیات</th>

        </tr>

    </thead>



    <tbody>



    <?php foreach ($products as $product): ?>



        <tr>

            <td>

                <?= htmlspecialchars($product['id']) ?>

            </td>



            <td>

                <?= htmlspecialchars($product['name']) ?>

            </td>



            <td>

                <?= htmlspecialchars($product['price']) ?>

            </td>



            <td>

                <a href="edit.php?id=<?= $product['id'] ?>">

                    ویرایش

                </a>



                <a href="delete.php?id=<?= $product['id'] ?>">

                    حذف

                </a>

            </td>

        </tr>



    <?php endforeach; ?>



    </tbody>

</table>



</body>

</html>

در اینجا اطلاعات محصولات از MySQL دریافت و در HTML نمایش داده می‌شوند.


# چرا از htmlspecialchars استفاده کردیم؟

در هنگام نمایش داده‌هایی که ممکن است از کاربر دریافت شده باشند، بهتر است آنها را Escape کنیم.

مثلاً:


htmlspecialchars($product['name'])

این کار می‌تواند از ایجاد برخی مشکلات XSS هنگام خروجی گرفتن داده جلوگیری کند.

بنابراین صرفاً استفاده از Prepared Statement برای امنیت کافی نیست.

Prepared Statement بیشتر برای امنیت Query و جلوگیری از SQL Injection کاربرد دارد، در حالی که هنگام نمایش داده باید خروجی HTML نیز به‌درستی Escape شود.


# ساخت فرم ایجاد محصول

فایل create.php:


<!DOCTYPE html>

<html lang="fa">

<head>

    <meta charset="UTF-8">

    <title>افزودن محصول</title>

</head>

<body>



<h1>افزودن محصول</h1>



<form action="store.php" method="POST">



    <div>

        <label>نام محصول</label>

        <input type="text" name="name" required>

    </div>



    <div>

        <label>قیمت</label>

        <input type="number" name="price" required>

    </div>



    <button type="submit">

        ذخیره

    </button>



</form>



</body>

</html>

وقتی فرم ارسال شود، اطلاعات به:


store.php

ارسال می‌شوند.


# ذخیره محصول در MySQL

فایل store.php:


<?php



require 'database.php';



$name = $_POST['name'] ?? '';

$price = $_POST['price'] ?? '';



if ($name === '' || $price === '') {

    exit('اطلاعات ناقص است.');

}



$sql = "INSERT INTO products (name, price)

        VALUES (:name, :price)";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'name' => $name,

    'price' => $price,

]);



header('Location: index.php');

exit;

در اینجا:

  1. اتصال Database را دریافت می‌کنیم.
  2. اطلاعات فرم را می‌گیریم.
  3. ورودی را بررسی می‌کنیم.
  4. Query را آماده می‌کنیم.
  5. اطلاعات را ذخیره می‌کنیم.
  6. کاربر را به لیست محصولات برمی‌گردانیم.

# ویرایش محصول

ابتدا باید اطلاعات محصول را دریافت کنیم.

فایل edit.php:


<?php



require 'database.php';



$id = $_GET['id'] ?? null;



if (!$id) {

    exit('شناسه محصول مشخص نشده است.');

}



$sql = "SELECT * FROM products

        WHERE id = :id";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'id' => $id,

]);



$product = $stmt->fetch();



if (!$product) {

    exit('محصول پیدا نشد.');

}

سپس فرم:


<!DOCTYPE html>

<html lang="fa">

<head>

    <meta charset="UTF-8">

    <title>ویرایش محصول</title>

</head>

<body>



<h1>ویرایش محصول</h1>



<form action="update.php" method="POST">



    <input

        type="hidden"

        name="id"

        value="<?= htmlspecialchars($product['id']) ?>"

    >



    <div>

        <label>نام محصول</label>



        <input

            type="text"

            name="name"

            value="<?= htmlspecialchars($product['name']) ?>"

            required

        >

    </div>



    <div>

        <label>قیمت</label>



        <input

            type="number"

            name="price"

            value="<?= htmlspecialchars($product['price']) ?>"

            required

        >

    </div>



    <button type="submit">

        ذخیره تغییرات

    </button>



</form>



</body>

</html>


# ذخیره تغییرات محصول

فایل update.php:


<?php



require 'database.php';



$id = $_POST['id'] ?? null;

$name = $_POST['name'] ?? '';

$price = $_POST['price'] ?? '';



if (!$id || $name === '' || $price === '') {

    exit('اطلاعات ناقص است.');

}



$sql = "UPDATE products

        SET name = :name,

            price = :price

        WHERE id = :id";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'name' => $name,

    'price' => $price,

    'id'   => $id,

]);



header('Location: index.php');

exit;


# حذف محصول

یک روش ساده برای مثال آموزشی:


<?php



require 'database.php';



$id = $_GET['id'] ?? null;



if (!$id) {

    exit('شناسه محصول مشخص نشده است.');

}



$sql = "DELETE FROM products

        WHERE id = :id";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'id' => $id,

]);



header('Location: index.php');

exit;

اما برای یک پروژه واقعی، بهتر است عملیات حذف را با درخواست POST و همراه با CSRF Protection انجام دهید.

استفاده از لینک GET برای حذف داده برای یک پروژه Production انتخاب مناسبی نیست.


# امنیت CRUD در PHP

ساخت CRUD فقط به اجرای چهار Query محدود نمی‌شود. در یک پروژه واقعی باید امنیت را نیز در نظر بگیریم.

1. استفاده از Prepared Statement

برای Queryهایی که دارای ورودی کاربر هستند:


$stmt = $pdo->prepare($sql);

و سپس:


$stmt->execute($data);

استفاده کنید.


2. اعتبارسنجی ورودی‌ها

نباید فرض کنیم اطلاعات ارسال‌شده توسط کاربر معتبر هستند.

مثلاً برای قیمت:


$price = filter_input(

    INPUT_POST,

    'price',

    FILTER_VALIDATE_FLOAT

);



if ($price === false) {

    exit('قیمت نامعتبر است.');

}


3. Escape کردن خروجی HTML

هنگام نمایش داده:


htmlspecialchars($value)

را متناسب با context خروجی استفاده کنید.


4. استفاده از CSRF Protection

اگر CRUD شما بخشی از سیستم ورود کاربران است، عملیات‌هایی مانند:

  • ایجاد
  • ویرایش
  • حذف

باید در برابر CSRF محافظت شوند.

به‌خصوص عملیات حذف نباید صرفاً با باز کردن یک URL انجام شود.


5. کنترل دسترسی

فرض کنید یک کاربر معمولی نباید بتواند محصولات را حذف کند.

در این حالت فقط احراز هویت کافی نیست.

باید Authorization نیز بررسی شود:


Authentication

       ↓

آیا کاربر وارد شده؟

       ↓

Authorization

       ↓

آیا اجازه حذف دارد؟

       ↓

DELETE


# CRUD و Transaction

گاهی یک عملیات CRUD شامل چند Query است.

مثلاً هنگام ایجاد سفارش ممکن است لازم باشد:

  1. سفارش ایجاد شود.
  2. آیتم‌های سفارش ذخیره شوند.
  3. موجودی محصول کاهش پیدا کند.
  4. تراکنش مالی ثبت شود.

اگر یکی از مراحل شکست بخورد، ممکن است Database در وضعیت ناقص قرار بگیرد.

در چنین شرایطی می‌توان از Transaction استفاده کرد:


try {



    $pdo->beginTransaction();



    // Query 1

    // Query 2

    // Query 3



    $pdo->commit();



} catch (Throwable $e) {



    $pdo->rollBack();



    throw $e;

}

در این حالت اگر عملیات با موفقیت انجام شود:


$pdo->commit();

و اگر خطایی رخ دهد:


$pdo->rollBack();


# تفاوت CRUD ساده و CRUD حرفه‌ای

یک CRUD ساده ممکن است فقط شامل این موارد باشد:


Create

Read

Update

Delete

اما در یک پروژه واقعی معمولاً موارد بیشتری لازم است:


CRUD

│

├── Validation

├── Authentication

├── Authorization

├── CSRF Protection

├── Pagination

├── Search

├── Filtering

├── Sorting

├── Transactions

├── Logging

└── Error Handling

بنابراین CRUD واقعی در یک نرم‌افزار تجاری بسیار بیشتر از چهار Query ساده است.


# Pagination در CRUD

اگر هزاران محصول داشته باشیم، نباید همه آنها را یکجا دریافت کنیم.

به جای:


SELECT * FROM products;

می‌توانیم از:


SELECT *

FROM products

ORDER BY id DESC

LIMIT 20 OFFSET 0;

استفاده کنیم.

در این حالت هر صفحه فقط تعداد مشخصی رکورد را دریافت می‌کند.

Pagination برای:

  • فروشگاه‌ها
  • CMSها
  • پنل‌های مدیریت
  • سیستم‌های سفارش
  • لیست کاربران

اهمیت زیادی دارد.


# Search در CRUD

فرض کنید می‌خواهیم محصولات را بر اساس نام جستجو کنیم.

مثلاً:


SELECT *

FROM products

WHERE name LIKE :search;

در PHP:


$search = 'Laptop';



$sql = "SELECT *

        FROM products

        WHERE name LIKE :search";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'search' => '%' . $search . '%',

]);



$products = $stmt->fetchAll();


# CRUD در PHP و MySQL با MySQLi

در این مقاله تمرکز ما روی PDO بود، اما PHP روش دیگری به نام MySQLi نیز دارد.

مثلاً اتصال:


$mysqli = new mysqli(

    '127.0.0.1',

    'root',

    '',

    'shop'

);

برای Prepared Statement:


$stmt = $mysqli->prepare(

    "INSERT INTO products (name, price)

     VALUES (?, ?)"

);



$stmt->bind_param(

    "sd",

    $name,

    $price

);



$stmt->execute();

هر دو روش قابل استفاده هستند، اما PDO برای پروژه‌هایی که ممکن است در آینده با Databaseهای مختلف کار کنند، API یکپارچه‌ای ارائه می‌کند.


# آیا برای پروژه‌های واقعی باید CRUD را با PHP خام بنویسیم؟

برای یادگیری، ساخت CRUD با PHP خام بسیار مفید است؛ چون دقیقاً متوجه می‌شوید:

  • HTTP چگونه کار می‌کند.
  • فرم چگونه ارسال می‌شود.
  • PHP چگونه داده را دریافت می‌کند.
  • PDO چگونه Query اجرا می‌کند.
  • MySQL چگونه داده را ذخیره می‌کند.
  • Prepared Statement چه نقشی دارد.
  • ارتباط بین Application و Database چگونه شکل می‌گیرد.

اما در پروژه‌های بزرگ معمولاً از Frameworkهایی مانند Laravel استفاده می‌شود.

در Laravel بسیاری از این وظایف توسط ابزارهایی مانند:

  • Eloquent ORM
  • Query Builder
  • Validation
  • Middleware
  • CSRF Protection
  • Authentication
  • Authorization

ساختارمندتر می‌شوند.

برای مثال در Laravel ایجاد یک رکورد می‌تواند به شکل زیر باشد:


Product::create([

    'name' => $request->name,

    'price' => $request->price,

]);

البته این کد به مدل، تنظیمات Mass Assignment و ساختار پروژه Laravel وابسته است.


# تفاوت CRUD و REST API

CRUD و REST API یکی نیستند.

CRUD درباره عملیات داده صحبت می‌کند:


Create

Read

Update

Delete

اما REST API درباره نحوه ارائه و دسترسی به منابع از طریق HTTP است.

برای مثال:


GET    /api/products

POST   /api/products

GET    /api/products/10

PUT    /api/products/10

DELETE /api/products/10

این API می‌تواند همان عملیات CRUD را در اختیار Frontend یا سایر سیستم‌ها قرار دهد.

بنابراین CRUD یک مفهوم مربوط به عملیات داده است و REST یک سبک معماری برای طراحی API است.


# خطاهای رایج هنگام ساخت CRUD در PHP

استفاده مستقیم از ورودی کاربر در SQL

اشتباه:


$sql = "SELECT * FROM products WHERE id = $id";

بهتر:


$sql = "SELECT * FROM products WHERE id = :id";



$stmt = $pdo->prepare($sql);



$stmt->execute([

    'id' => $id,

]);


فراموش کردن WHERE در UPDATE

اشتباه:


UPDATE products

SET price = 10000;

این Query تمام محصولات را تغییر می‌دهد.


فراموش کردن WHERE در DELETE

اشتباه:


DELETE FROM products;

این Query تمام رکوردهای جدول را حذف می‌کند.


نمایش مستقیم داده کاربر

اشتباه:


echo $product['name'];

در بسیاری از contextهای HTML بهتر است خروجی Escape شود:


echo htmlspecialchars($product['name']);


استفاده از GET برای عملیات حساس

مثلاً:


/delete.php?id=10

برای حذف واقعی در یک پروژه Production مناسب نیست.

بهتر است عملیات تغییر وضعیت با POST یا روش مناسب HTTP انجام شود و CSRF نیز کنترل شود.


# معماری بهتر برای CRUDهای بزرگ

وقتی پروژه بزرگ‌تر می‌شود، قرار دادن تمام Queryها در یک فایل PHP باعث پیچیده شدن کد خواهد شد.

به جای:


index.php

  ↓

SQL

  ↓

HTML

می‌توان معماری بهتری ایجاد کرد:


Controller

    ↓

Service

    ↓

Repository

    ↓

Database

یا در پروژه‌های ساده‌تر:


Controller

    ↓

Model / Repository

    ↓

Database

این موضوع باعث می‌شود کد قابل نگهداری‌تر و تست‌پذیرتر شود.


# جمع‌بندی CRUD در PHP و MySQL

CRUD یکی از مفاهیم پایه و بسیار مهم در توسعه نرم‌افزارهای مبتنی بر Database است.

چهار عملیات اصلی CRUD عبارت‌اند از:


Create → INSERT

Read   → SELECT

Update → UPDATE

Delete → DELETE

در PHP می‌توان این عملیات را با PDO و MySQL انجام داد.

یک پیاده‌سازی مناسب باید علاوه بر Queryهای اصلی، مواردی مانند:

  • Prepared Statement
  • Validation
  • Output Escaping
  • CSRF Protection
  • Authentication
  • Authorization
  • Transaction
  • Error Handling
  • Pagination

را نیز در نظر بگیرد.

اگر CRUD را با PHP خام یاد بگیرید، درک شما از ارتباط میان PHP، SQL، Database و Frameworkهایی مانند Laravel بسیار بهتر خواهد شد.


# سوالات متداول

CRUD در PHP چیست؟

CRUD مجموعه چهار عملیات اصلی ایجاد، خواندن، ویرایش و حذف داده است که به‌ترتیب با INSERT، SELECT، UPDATE و DELETE در Database ارتباط دارند.

آیا برای CRUD در PHP باید از PDO استفاده کنیم؟

PDO تنها گزینه نیست و MySQLi نیز قابل استفاده است. با این حال PDO امکانات مناسبی برای کار با Database و Prepared Statement در PHP ارائه می‌دهد.

آیا CRUD فقط مخصوص MySQL است؟

خیر. CRUD یک مفهوم عمومی برای عملیات روی داده است و می‌تواند با Databaseهای مختلف استفاده شود.

آیا CRUD همان REST API است؟

خیر. CRUD نوع عملیات روی داده را مشخص می‌کند، در حالی که REST یک سبک معماری برای طراحی API است.

آیا استفاده از Prepared Statement ضروری است؟

برای Queryهایی که با داده ورودی کاربر سروکار دارند، استفاده از Prepared Statement یکی از روش‌های مهم کاهش خطر SQL Injection است.

آیا می‌توان CRUD را با Laravel ساخت؟

بله. Laravel ابزارهایی مانند Eloquent و Query Builder دارد که ساخت عملیات CRUD را ساده‌تر و ساختاریافته‌تر می‌کنند.


مقالات مرتبط

برای ادامه یادگیری این موضوع، مسیر پیشنهادی مطالعه به این شکل است:

PHP و MySQL

↓

اتصال PHP به MySQL با PDO و MySQLi

↓

CRUD در PHP و MySQL

↓

SQL Injection در PHP و جلوگیری از آن

↓

REST API در PHP

↓

Authentication در PHP

↓

Laravel و کار با Database


نتیجه نهایی

اگر بخواهیم ارتباط PHP و MySQL را در ساده‌ترین حالت خلاصه کنیم، PHP منطق برنامه را اجرا می‌کند، MySQL داده‌ها را ذخیره و مدیریت می‌کند و CRUD مجموعه عملیاتی است که برای مدیریت این داده‌ها به کار می‌رود.

یادگیری CRUD یکی از بهترین مراحل بعد از یادگیری اتصال PHP به MySQL است؛ زیرا از این مرحله به بعد می‌توانید به‌جای اجرای Queryهای جداگانه، ساختار واقعی یک نرم‌افزار تحت وب را درک کنید.

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه