تقریباً هر برنامه تحت وبی که با دادههای کاربران، محصولات، سفارشها، مقالات یا اطلاعات حساب کاربری سروکار دارد، به چهار عملیات اصلی نیاز دارد: ایجاد، خواندن، ویرایش و حذف اطلاعات.
این چهار عملیات با اصطلاح CRUD شناخته میشوند.
CRUD مخفف چهار عملیات زیر است:
- Create → ایجاد اطلاعات
- Read → خواندن اطلاعات
- Update → ویرایش اطلاعات
- Delete → حذف اطلاعات
در PHP معمولاً برای انجام این عملیات روی دادههای MySQL از کتابخانههایی مانند PDO یا MySQLi استفاده میشود.
در این مقاله یک سیستم CRUD ساده را با PHP + MySQL + PDO پیادهسازی میکنیم و با مفاهیمی مانند SELECT، INSERT، UPDATE، DELETE و Prepared Statement آشنا میشویم.
CRUD چیست؟
CRUD یک مفهوم عمومی در برنامهنویسی و طراحی نرمافزار است که چهار عملیات اصلی کار با داده را مشخص میکند.
فرض کنید یک فروشگاه اینترنتی داریم و اطلاعات محصولات در MySQL ذخیره شده است.
برای مدیریت محصولات باید بتوانیم:
- محصول جدید ایجاد کنیم.
- محصولات موجود را مشاهده کنیم.
- اطلاعات یک محصول را ویرایش کنیم.
- محصول را حذف کنیم.
این دقیقاً همان 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
);
جدول ما سه فیلد اصلی دارد:
idnameprice
فیلد 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;
در اینجا:
- اتصال Database را دریافت میکنیم.
- اطلاعات فرم را میگیریم.
- ورودی را بررسی میکنیم.
- Query را آماده میکنیم.
- اطلاعات را ذخیره میکنیم.
- کاربر را به لیست محصولات برمیگردانیم.
# ویرایش محصول
ابتدا باید اطلاعات محصول را دریافت کنیم.
فایل 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 است.
مثلاً هنگام ایجاد سفارش ممکن است لازم باشد:
- سفارش ایجاد شود.
- آیتمهای سفارش ذخیره شوند.
- موجودی محصول کاهش پیدا کند.
- تراکنش مالی ثبت شود.
اگر یکی از مراحل شکست بخورد، ممکن است 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های جداگانه، ساختار واقعی یک نرمافزار تحت وب را درک کنید.





