
عمليات CRUD في PHP مع MySQL وREST API
يعد CRUD أحد أهم المفاهيم في تطوير الواجهة الخلفية. وهو اختصار لـ Create وRead وUpdate وDelete. تمثل هذه العمليات الأربع الإجراءات الأساسية المستخدمة لإدارة البيانات في كل تطبيق ويب تقريبًا.
عندما يتم دمج CRUD مع MySQL وREST API، يمكن استخدام PHP لإنشاء خدمات خلفية تسمح لمواقع الويب وتطبيقات الهاتف المحمول ولوحات المعلومات وأطر عمل الواجهة الأمامية بالتفاعل مع سجلات قاعدة البيانات من خلال طلبات HTTP.
تشرح هذه المقالة PHP CRUD بمفاهيم MySQL وREST API، بما في ذلك بنية قاعدة البيانات، واتصال PDO، والعبارات المحضرة، واستجابات JSON، وطرق HTTP، وإنشاء نقطة النهاية، وقراءة نقطة النهاية، وتحديث نقطة النهاية، وحذف نقطة النهاية، والتحقق من الصحة، ومعالجة الأخطاء، وأفضل ممارسات الأمان.
ما هو CRUD؟
يصف CRUD العمليات الأربع الرئيسية المستخدمة لإدارة البيانات في قاعدة البيانات. تستخدم معظم التطبيقات CRUD بشكل أو بآخر.
Create: إضافة سجل جديد إلى قاعدة البيانات.
Read: استرداد سجل واحد أو أكثر من قاعدة البيانات.
Update: تعديل سجل موجود.
Delete: إزالة سجل من قاعدة البيانات.
على سبيل المثال، في تطبيق المدونة، يمكن استخدام CRUD لإنشاء منشورات وعرض منشورات وتحديث محتوى المنشورات وحذف المنشورات. في نظام التجارة الإلكترونية، يستطيع CRUD إدارة المنتجات والفئات والعملاء والطلبات.
CRUD لا يقتصر على لوحات الإدارة. وهو أيضًا أساس واجهات API ولوحات المعلومات وأنظمة إدارة المحتوى وملفات تعريف المستخدمين ومديري المهام والعديد من الخدمات الخلفية.
ما هو REST API؟
REST API يرمز إلى واجهة برمجة تطبيقات نقل الحالة التمثيلية. بعبارات بسيطة، يسمح REST API للتطبيقات المختلفة بالاتصال باستخدام طلبات HTTP.
يمكن لتطبيق الواجهة الأمامية إرسال طلب إلى PHP API، ويمكن لـ PHP إرجاع البيانات كـ JSON. يمكن للواجهة الأمامية بعد ذلك عرض تلك البيانات دون الحاجة إلى معرفة بنية قاعدة البيانات الداخلية.
يستخدم REST API عادةً أساليب HTTP لوصف الإجراء:
GET: استرداد البيانات.
POST: إنشاء بيانات جديدة.
PUT: تحديث البيانات الموجودة بالكامل.
PATCH: تحديث جزء من البيانات الموجودة.
DELETE: حذف البيانات.
على سبيل المثال، قد تستخدم المشاركات API مسارات مثل:
GET /api/posts لسرد المشاركات.
GET /api/posts/5 لإظهار مشاركة واحدة.
POST /api/posts لإنشاء مشاركة.
PUT /api/posts/5 لتحديث مشاركة.
DELETE /api/posts/5 لحذف مشاركة.
عادةً ما تعرض واجهات API REST JSON لأن JSON سهل القراءة وسهل الاستخدام مع JavaScript وتطبيقات الهاتف المحمول وأنظمة الواجهة الخلفية الأخرى.
جدول قاعدة البيانات لـ CRUD
لبناء مثال CRUD، نحتاج إلى جدول قاعدة بيانات. في هذه المقالة سوف نستخدم بسيطة دعامات طاولة.
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
status VARCHAR(50) NOT NULL DEFAULT 'draft',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT NULL
);يحتوي هذا الجدول على الحقول الأساسية لمنشور مدونة. ال بطاقة تعريف العمود هو المفتاح الأساسي. ال عنوان و محتوى تقوم الأعمدة بتخزين بيانات النشر. ال حالة يمكن استخدام العمود لوضع علامة على المنشور كمسودة أو منشور.
ال create_at يخزن الحقل عند إنشاء السجل، بينما update_at يمكن تخزين وقت التحديث الأخير.
يمكنك استخدام نفس منطق CRUD مع جداول أخرى مثل المستخدمين أو المنتجات أو الفئات أو التعليقات أو المهام أو الرسائل.
PDO اتصال قاعدة البيانات
يمكن لـ PHP الاتصال بـ MySQL باستخدام PDO. يعد PDO خيارًا جيدًا لواجهات API CRUD لأنه يدعم العبارات المحضرة ومعالجة الأخطاء المنظمة.
قم بإنشاء ملف باسم db.php للاتصال بقاعدة البيانات.
<?php
$host = "localhost";
$dbname = "php_api";
$username = "root";
$password = "";
try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$username,
$password
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $exception) {
http_response_code(500);
echo json_encode([
"success" => false,
"message" => "Database connection failed."
]);
exit;
}
?>ال utf8mb4 تعتبر مجموعة الأحرف مهمة للتطبيقات متعددة اللغات لأنها تدعم العربية والتركية والإنجليزية والعديد من الأحرف الخاصة.
في الإنتاج، يجب تخزين بيانات اعتماد قاعدة البيانات في متغيرات البيئة أو ملفات التكوين خارج الدليل العام.
API مساعد الاستجابة
يجب أن تقوم واجهات API REST بإرجاع استجابات JSON متسقة. يمكن للوظيفة المساعدة أن تجعل الاستجابات أكثر وضوحًا وأسهل في الصيانة.
<?php
function jsonResponse($data, $statusCode = 200) {
http_response_code($statusCode);
header("Content-Type: application/json; charset=UTF-8");
echo json_encode($data);
exit;
}
?>يقوم هذا المساعد بتعيين رمز حالة HTTP، وتعيين نوع المحتوى JSON، وترميز الاستجابة، وإيقاف البرنامج النصي.
قد تبدو الاستجابة الناجحة كما يلي:
{
"success": true,
"message": "Post created successfully.",
"data": {
"id": 1,
"title": "PHP CRUD"
}
}قد تبدو الاستجابة للخطأ كما يلي:
{
"success": false,
"message": "Validation failed.",
"errors": {
"title": "Title is required."
}
}تجعل الاستجابات المتسقة API أسهل في الاستخدام من تطبيقات الواجهة الأمامية.
قراءة JSON بيانات الطلب
عند إنشاء API، غالبًا ما يرسل العملاء البيانات كـ JSON بدلاً من بيانات النموذج العادي. يمكن لـ PHP قراءة نص الطلب الأولي باستخدامه فب://الإدخال.
<?php
function getJsonInput() {
$json = file_get_contents("php://input");
$data = json_decode($json, true);
if (!is_array($data)) {
return [];
}
return $data;
}
?>على سبيل المثال، قد ترسل الواجهة الأمامية هذا JSON عند إنشاء منشور:
{
"title": "Learning PHP REST API",
"content": "This is a post about PHP API development.",
"status": "published"
}يمكن لـ PHP API فك تشفير هذا JSON واستخدام القيم للتحقق من الصحة وعمليات قاعدة البيانات.
إنشاء سجل باستخدام POST
تضيف عملية الإنشاء سجلاً جديدًا إلى قاعدة البيانات. في REST API، يتم عادةً إنشاء البيانات باستخدام POST طريقة.
يقوم المثال التالي بإنشاء منشور جديد باستخدام إدخال JSON وبيان معد.
<?php
require "db.php";
require "helpers.php";
$data = getJsonInput();
$title = trim($data["title"] ?? "");
$content = trim($data["content"] ?? "");
$status = trim($data["status"] ?? "draft");
$errors = [];
if ($title === "") {
$errors["title"] = "Title is required.";
}
if ($content === "") {
$errors["content"] = "Content is required.";
}
if (!in_array($status, ["draft", "published"], true)) {
$errors["status"] = "Status must be draft or published.";
}
if (count($errors) > 0) {
jsonResponse([
"success" => false,
"message" => "Validation failed.",
"errors" => $errors
], 422);
}
$statement = $pdo->prepare("
INSERT INTO posts (title, content, status)
VALUES (:title, :content, :status)
");
$statement->execute([
"title" => $title,
"content" => $content,
"status" => $status
]);
$postId = $pdo->lastInsertId();
jsonResponse([
"success" => true,
"message" => "Post created successfully.",
"data" => [
"id" => $postId,
"title" => $title,
"content" => $content,
"status" => $status
]
], 201);
?>يقوم هذا المثال بالتحقق من صحة الإدخال وإدراج السجل والحصول على آخر معرف تم إدراجه وإرجاع استجابة JSON مع رمز الحالة 201 تم الإنشاء.
العبارات المحضرة تحمي استعلام الإدراج من SQL injection لأنه يتم تمرير إدخال المستخدم بشكل منفصل عن البنية SQL.
قراءة السجلات باستخدام GET
تقوم عملية القراءة باسترداد البيانات من قاعدة البيانات. في REST API، تتم قراءة البيانات عادةً باستخدام GET طريقة.
يعرض المثال التالي قائمة المنشورات.
<?php
require "db.php";
require "helpers.php";
$statement = $pdo->query("
SELECT id, title, content, status, created_at, updated_at
FROM posts
ORDER BY id DESC
");
$posts = $statement->fetchAll();
jsonResponse([
"success" => true,
"data" => $posts
]);
?>تقوم نقطة النهاية هذه بإرجاع جميع المشاركات كمصفوفة JSON. في التطبيقات الحقيقية، يمكنك أيضًا إضافة ترقيم الصفحات أو البحث أو المرشحات أو شروط الحالة.
على سبيل المثال، لإرجاع المنشورات المنشورة فقط، يمكنك استخدام عبارة معدة:
<?php
$status = "published";
$statement = $pdo->prepare("
SELECT id, title, content, status, created_at
FROM posts
WHERE status = :status
ORDER BY id DESC
");
$statement->execute([
"status" => $status
]);
$posts = $statement->fetchAll();
?>يتم استخدام نقاط نهاية القراءة بواسطة صفحات الواجهة الأمامية ولوحات المعلومات وتطبيقات الأجهزة المحمولة وعملاء API لعرض البيانات المخزنة.
قراءة سجل واحد مع GET
في بعض الأحيان يحتاج API إلى إرجاع سجل واحد حسب المعرف. على سبيل المثال، قد تطلب الواجهة الأمامية منشورًا واحدًا لعرض صفحة تفاصيل.
<?php
require "db.php";
require "helpers.php";
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
if (!$id) {
jsonResponse([
"success" => false,
"message" => "Valid post ID is required."
], 400);
}
$statement = $pdo->prepare("
SELECT id, title, content, status, created_at, updated_at
FROM posts
WHERE id = :id
LIMIT 1
");
$statement->execute([
"id" => $id
]);
$post = $statement->fetch();
if (!$post) {
jsonResponse([
"success" => false,
"message" => "Post not found."
], 404);
}
jsonResponse([
"success" => true,
"data" => $post
]);
?>يقوم هذا المثال بالتحقق من صحة المعرف، والبحث عن المنشور، وإرجاع استجابة 404 إذا لم يكن موجودًا، وإرجاع بيانات المنشور إذا تم العثور عليها.
يساعد إرجاع رموز حالة HTTP الصحيحة مطوري الواجهة الأمامية على التعامل مع الحالات المختلفة بشكل صحيح.
تحديث السجل باستخدام PUT أو PATCH
تقوم عملية التحديث بتعديل سجل موجود. في واجهات API REST، PUT يُستخدم عادةً للتحديثات الكاملة، بينما PATCH يستخدم للتحديثات الجزئية.
يقوم المثال التالي بتحديث منشور باستخدام إدخال JSON.
<?php
require "db.php";
require "helpers.php";
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
if (!$id) {
jsonResponse([
"success" => false,
"message" => "Valid post ID is required."
], 400);
}
$data = getJsonInput();
$title = trim($data["title"] ?? "");
$content = trim($data["content"] ?? "");
$status = trim($data["status"] ?? "draft");
$errors = [];
if ($title === "") {
$errors["title"] = "Title is required.";
}
if ($content === "") {
$errors["content"] = "Content is required.";
}
if (!in_array($status, ["draft", "published"], true)) {
$errors["status"] = "Status must be draft or published.";
}
if (count($errors) > 0) {
jsonResponse([
"success" => false,
"message" => "Validation failed.",
"errors" => $errors
], 422);
}
$statement = $pdo->prepare("
UPDATE posts
SET title = :title,
content = :content,
status = :status,
updated_at = NOW()
WHERE id = :id
");
$statement->execute([
"id" => $id,
"title" => $title,
"content" => $content,
"status" => $status
]);
if ($statement->rowCount() === 0) {
jsonResponse([
"success" => false,
"message" => "Post not found or no changes made."
], 404);
}
jsonResponse([
"success" => true,
"message" => "Post updated successfully."
]);
?>يقوم هذا المثال بالتحقق من صحة المعرف والإدخال، وتحديث السجل، وإرجاع استجابة JSON.
في التطبيقات الحقيقية، يمكنك أولاً التحقق من وجود السجل قبل تحديثه. وهذا يمكن أن يجعل الاستجابة أكثر دقة عندما لا تكون هناك تغييرات.
حذف السجل باستخدام DELETE
تقوم عملية الحذف بإزالة سجل من قاعدة البيانات. في واجهات API REST، يتم عادةً حذف البيانات باستخدام الأمر DELETE طريقة.
المثال التالي يحذف منشورًا حسب المعرف.
<?php
require "db.php";
require "helpers.php";
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
if (!$id) {
jsonResponse([
"success" => false,
"message" => "Valid post ID is required."
], 400);
}
$statement = $pdo->prepare("DELETE FROM posts WHERE id = :id");
$statement->execute([
"id" => $id
]);
if ($statement->rowCount() === 0) {
jsonResponse([
"success" => false,
"message" => "Post not found."
], 404);
}
jsonResponse([
"success" => true,
"message" => "Post deleted successfully."
]);
?>يجب دائمًا حماية عمليات الحذف في التطبيقات الحقيقية. يجب ألا يتمكن المستخدمون من حذف السجلات ما لم يكن لديهم إذن.
تستخدم بعض الأنظمة الحذف الناعم بدلاً من الحذف الدائم. يقوم الحذف الناعم بوضع علامة على السجل كمحذوف باستخدام حقل مثل delete_atمع الاحتفاظ بالبيانات في قاعدة البيانات.
جهاز توجيه REST بسيط في PHP
بدلاً من إنشاء ملف منفصل لكل نقطة نهاية، يمكنك إنشاء جهاز توجيه بسيط يتحقق من طريقة الطلب وينفذ الإجراء الصحيح.
يمكن استخدام جهاز توجيه بسيط جدًا $_SERVER["REQUEST_METHOD"].
<?php
require "db.php";
require "helpers.php";
$method = $_SERVER["REQUEST_METHOD"];
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
if ($method === "GET" && $id) {
// Show one post
} elseif ($method === "GET") {
// List posts
} elseif ($method === "POST") {
// Create post
} elseif ($method === "PUT" || $method === "PATCH") {
// Update post
} elseif ($method === "DELETE") {
// Delete post
} else {
jsonResponse([
"success" => false,
"message" => "Method not allowed."
], 405);
}
?>هذا مثال أساسي. تستخدم التطبيقات الاحترافية عادةً جهاز توجيه أو إطار عمل أو بنية MVC لتنظيم نقاط النهاية API بشكل أكثر نظافة.
ومع ذلك، فإن فهم هذه البنية البسيطة يساعد المبتدئين على فهم كيفية عمل واجهات API REST خلف الكواليس.
التحقق من الصحة في واجهات API CRUD
التحقق من الصحة ضروري في واجهات API CRUD. يجب على كل طلب إنشاء وتحديث التحقق من البيانات المقدمة قبل حفظها في قاعدة البيانات.
بالنسبة للمشاركات API، قد يتضمن التحقق ما يلي:
العنوان مطلوب.
يجب ألا يكون العنوان طويلاً جدًا.
المحتوى مطلوب.
يجب أن تكون الحالة مسودة أو منشورة.
يجب أن يكون المعرف عددًا صحيحًا صالحًا.
يمكن لوظيفة التحقق البسيطة أن تجعل الكود أكثر نظافة:
<?php
function validatePostData($data) {
$errors = [];
$title = trim($data["title"] ?? "");
$content = trim($data["content"] ?? "");
$status = trim($data["status"] ?? "draft");
if ($title === "") {
$errors["title"] = "Title is required.";
} elseif (strlen($title) > 200) {
$errors["title"] = "Title must not exceed 200 characters.";
}
if ($content === "") {
$errors["content"] = "Content is required.";
}
if (!in_array($status, ["draft", "published"], true)) {
$errors["status"] = "Status must be draft or published.";
}
return $errors;
}
?>يساعد إرجاع أخطاء التحقق من الصحة كـ JSON الواجهة الأمامية على عرض رسائل واضحة للمستخدم.
العبارات المحضرة في CRUD واجهات API
تعد العبارات المحضرة ضرورية في واجهات API CRUD لأن إدخال API غالبًا ما يأتي من المستخدمين أو النماذج أو تطبيقات الواجهة الأمامية أو الأنظمة الخارجية.
يجب تجنب SQL غير الآمن:
<?php
$sql = "SELECT * FROM posts WHERE id = " . $_GET["id"];
?>يستخدم Safe SQL العبارات المحضرة:
<?php
$statement = $pdo->prepare("SELECT * FROM posts WHERE id = :id");
$statement->execute([
"id" => $id
]);
?>تحمي العبارات المحضرة من SQL injection عن طريق فصل بنية الاستعلام عن قيم الإدخال.
استخدم العبارات المحضرة للعمليات SELECT، INSERT، UPDATE، وDELETE عندما يتعلق الأمر بالإدخال.
رموز حالة HTTP في REST API
تساعد رموز حالة HTTP عملاء API على فهم نتيجة الطلب. يجب أن يعرض REST API الجيد رموز حالة ذات معنى.
تتضمن رموز الحالة الشائعة ما يلي:
200 موافق: نجح الطلب.
201 تم الإنشاء: تم إنشاء سجل جديد.
400 طلب سيء: الطلب غير صالح.
401 غير مصرح به: المصادقة مطلوبة.
403 ممنوع: لا يسمح للمستخدم بتنفيذ الإجراء.
404 لم يتم العثور عليه: السجل المطلوب غير موجود.
405 الطريقة غير مسموح بها: طريقة HTTP غير مدعومة.
422 كيان غير قابل للمعالجة: فشل التحقق من الصحة.
500 خطأ داخلي في الخادم: فشل شيء ما على الخادم.
على سبيل المثال، إذا تم إنشاء منشور بنجاح، قم بإرجاع 201. إذا فشل التحقق من الصحة، قم بإرجاع 422. إذا لم يكن المنشور موجودًا، قم بإرجاع 404.
تعمل رموز الحالة على جعل واجهات API أكثر احترافية وأسهل في التكامل مع تطبيقات الواجهة الأمامية.
البحث والتصفية في CRUD API
CRUD غالبًا ما تحتاج واجهات API إلى البحث والتصفية. على سبيل المثال، قد تسمح المشاركات API بالبحث حسب العنوان أو التصفية حسب الحالة.
<?php
$keyword = trim($_GET["q"] ?? "");
$status = trim($_GET["status"] ?? "");
$sql = "SELECT id, title, content, status, created_at FROM posts WHERE 1 = 1";
$params = [];
if ($keyword !== "") {
$sql .= " AND title LIKE :keyword";
$params["keyword"] = "%" . $keyword . "%";
}
if ($status !== "") {
$sql .= " AND status = :status";
$params["status"] = $status;
}
$sql .= " ORDER BY id DESC";
$statement = $pdo->prepare($sql);
$statement->execute($params);
$posts = $statement->fetchAll();
jsonResponse([
"success" => true,
"data" => $posts
]);
?>ينشئ هذا المثال استعلامًا ديناميكيًا مع الاستمرار في استخدام العبارات المحضرة لقيم الإدخال.
يعد البحث والتصفية مفيدًا في لوحات الإدارة ولوحات المعلومات وأنظمة المدونات وقوائم المنتجات وصفحات التقارير.
ترقيم الصفحات في CRUD API
يحد ترقيم الصفحات من عدد السجلات التي يتم إرجاعها مرة واحدة. يؤدي ذلك إلى تحسين الأداء وتسهيل عرض مجموعات البيانات الكبيرة.
يمكن استخدام نظام ترقيم صفحات بسيط LIMIT و OFFSET.
<?php
$page = max(1, (int) ($_GET["page"] ?? 1));
$perPage = 10;
$offset = ($page - 1) * $perPage;
$statement = $pdo->prepare("
SELECT id, title, content, status, created_at
FROM posts
ORDER BY id DESC
LIMIT :limit OFFSET :offset
");
$statement->bindValue(":limit", $perPage, PDO::PARAM_INT);
$statement->bindValue(":offset", $offset, PDO::PARAM_INT);
$statement->execute();
$posts = $statement->fetchAll();
jsonResponse([
"success" => true,
"page" => $page,
"per_page" => $perPage,
"data" => $posts
]);
?>يعد ترقيم الصفحات مهمًا عند العمل مع العديد من السجلات. بدون ترقيم الصفحات، قد يعرض API الكثير من البيانات ويصبح بطيئًا.
CORS في PHP REST واجهات API
يعنيCORS مشاركة الموارد عبر الأصل. فهو يتحكم فيما إذا كان بإمكان الواجهة الأمامية من مجال آخر الاتصال بـ API الخاص بك.
أثناء التطوير، قد تحتاج إلى السماح بالطلبات من تطبيق الواجهة الأمامية الذي يعمل على مجال أو منفذ آخر.
<?php
header("Access-Control-Allow-Origin: https://example.com");
header("Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
if ($_SERVER["REQUEST_METHOD"] === "OPTIONS") {
http_response_code(204);
exit;
}
?>بالنسبة للإنتاج، تجنب السماح بجميع الأصول إلا إذا كان ذلك ضروريًا حقًا. من الآمن السماح بنطاقات الواجهة الأمامية الموثوقة فقط.
CORS ليست مصادقة. إنه يتحكم فقط في الوصول عبر الأصل المستند إلى المتصفح. يجب أن يستمر API في استخدام المصادقة والترخيص المناسبين للإجراءات المحمية.
المصادقة لـ CRUD REST API
بعض واجهات API CRUD عامة، لكن الكثير منها يحتاج إلى المصادقة. على سبيل المثال، يمكن لأي شخص قراءة المنشورات المنشورة، ولكن يجب على المسؤولين الذين قاموا بتسجيل الدخول فقط إنشاء المشاركات أو تحديثها أو حذفها.
يمكن التعامل مع المصادقة باستخدام الجلسات، أو رموز API، أو JWT، أو أدوات المصادقة الخاصة بإطار العمل.
قد يبدو فحص الرمز المميز API البسيط جدًا كما يلي:
<?php
$headers = getallheaders();
$token = $headers["Authorization"] ?? "";
$expectedToken = "Bearer your-secret-token";
if ($token !== $expectedToken) {
jsonResponse([
"success" => false,
"message" => "Unauthorized."
], 401);
}
?>هذه مجرد مظاهرة بسيطة. يجب تصميم المصادقة الحقيقية API بعناية أكبر، مع تخزين آمن للرمز المميز، وانتهاء الصلاحية، والأذونات، وHTTPS.
التفويض مهم أيضًا. يجب على المستخدم الذي قام بتسجيل الدخول أن يقوم فقط بالإجراءات المسموح له بتنفيذها.
أكمل هيكل CRUD API
يمكن تنظيم مشروع صغير PHP CRUD REST API على النحو التالي:
project/
├── api/
│ └── posts.php
├── config/
│ └── db.php
├── helpers/
│ └── response.php
└── public/
└── index.htmlال db.php يحتوي الملف على اتصال قاعدة البيانات. ال استجابة.php يحتوي الملف على وظائف مساعدة مثل استجابات JSON وقراءة الإدخال JSON. ال المشاركات.php يحتوي الملف على منطق CRUD.
بالنسبة للمشاريع الأكبر حجمًا، يجب أن يكون الهيكل أكثر نظافة وقد يتضمن وحدات تحكم ونماذج وخدمات ومستودعات وبرامج وسيطة وتوجيه.
توفر أطر العمل مثل Laravel هذه الهياكل خارج الصندوق، لكن بناء PHP CRUD API بسيط وبسيط يساعدك على فهم الفكرة الأساسية.
ملاحظات الأمان لـ PHP CRUD وREST API
CRUD تتعامل واجهات API (واجهات API) مع بيانات قاعدة البيانات، لذا فإن الأمان مهم جدًا. يجب حماية أي نقطة نهاية تتلقى مدخلات أو تعدل البيانات أو تكشف معلومات خاصة.
تشمل الممارسات الأمنية المهمة ما يلي:
استخدم العبارات المحضرة لجميع استعلامات قاعدة البيانات.
التحقق من صحة جميع بيانات الطلب قبل حفظها.
قم بإرجاع رسائل الخطأ الآمنة دون الكشف عن تفاصيل قاعدة البيانات.
استخدم المصادقة لنقاط النهاية المحمية.
استخدم عمليات التحقق من الترخيص لإجراءات التحديث والحذف.
استخدم HTTPS في الإنتاج.
قصر CORS على المجالات الموثوقة.
إخراج الهروب عند عرض بيانات API في HTML.
استخدم ترقيم الصفحات لمجموعات البيانات الكبيرة.
قم بتسجيل أخطاء الخادم بشكل خاص بدلاً من عرضها للمستخدمين.
يجب تطبيق الأمان في كل طبقة: التحقق من صحة الإدخال، والوصول إلى قاعدة البيانات، والمصادقة، والترخيص، ومعالجة الاستجابة، وتكوين النشر.
CRUD API في أطر PHP الحديثة
أطر عمل PHP الحديثة مثل Laravel تجعل تطوير CRUD API أسرع وأكثر تنظيمًا. يوفر Laravel التوجيه، ووحدات التحكم، والتحقق من صحة الطلب، ونماذج Eloquent، وعمليات الترحيل، وموارد API، والبرمجيات الوسيطة، والمصادقة، والترخيص.
ومع ذلك، فإن فهم CRUD مع PHP وPDO العادي لا يزال مهمًا. فهو يعلم الأساس وراء عمليات قاعدة البيانات، واستجابات JSON، والعبارات المحضرة، وأساليب HTTP، وبنية API.
بمجرد فهم واجهات API PHP CRUD النقية، يصبح الانتقال إلى واجهات API Laravel أسهل لأن نفس المفاهيم لا تزال موجودة، ولكن يتم تنظيمها من خلال أدوات إطار العمل.
خاتمة
PHP CRUD مع MySQL وREST API هو موضوع أساسي لتطوير الواجهة الخلفية. فهو يجمع بين عمليات قاعدة البيانات وطرق HTTP واستجابات JSON والتحقق من الصحة والعبارات المحضرة ومعالجة الأخطاء وممارسات الأمان.
عمليات CRUD الرئيسية هي الإنشاء والقراءة والتحديث والحذف. في REST API، ترتبط هذه العمليات عادةً بطرق HTTP مثل POST، GET، PUT، PATCH، وDELETE.
بعد تعلم CRUD مع MySQL وREST API في PHP، فإن الخطوة التالية هي إنشاء مشروع عملي صغير مثل مدونة API، أو مدير المهام API، أو إدارة المنتج API، أو لوحة تحكم المسؤول API. ستساعد هذه المشاريع في ربط تطبيقات PHP وMySQL والواجهة الأمامية في سير عمل تطوير حقيقي.

