
قاعدة بيانات MySQL مع PHP
MySQL هو أحد أنظمة قواعد البيانات الأكثر شيوعًا المستخدمة مع PHP. تحتاج العديد من مواقع الويب وتطبيقات الويب الديناميكية إلى قاعدة بيانات لتخزين المستخدمين والمنشورات والمنتجات والأوامر والتعليقات والإعدادات وبيانات التطبيقات الأخرى.
يمكن لـ PHP الاتصال بـ MySQL وتنفيذ عمليات قاعدة البيانات مثل إنشاء قواعد البيانات وإنشاء الجداول وإدراج البيانات واختيار السجلات وتصفية النتائج وتحديث الصفوف وحذف البيانات والحد من السجلات التي يتم إرجاعها.
تشرح هذه المقالة موضوعات MySQL الرئيسية الموضحة في مسار التعلم: قاعدة بيانات MySQL، MySQL الاتصال، إنشاء قاعدة البيانات، إنشاء جدول، إدراج البيانات، الحصول على آخر معرف تم إدراجه، إدراج سجلات متعددة، العبارات المحضرة، تحديد البيانات، حيث، ترتيب حسب، حذف البيانات، تحديث البيانات، والحد من البيانات.
MySQL قاعدة البيانات
قاعدة البيانات هي مكان منظم لتخزين البيانات. في تطوير الويب، تُستخدم قواعد البيانات للاحتفاظ بالمعلومات التي يجب أن تظل متاحة حتى بعد إغلاق الصفحة أو انتهاء طلب الخادم.
على سبيل المثال، قد يقوم موقع مدونة بتخزين المقالات والفئات والعلامات والمستخدمين والتعليقات في قاعدة بيانات MySQL. قد يقوم موقع التجارة الإلكترونية بتخزين المنتجات والعملاء وعربات التسوق والأوامر والفواتير والمدفوعات.
MySQL يخزن البيانات داخل الجداول. يحتوي الجدول على صفوف وأعمدة. يمثل كل صف سجلاً واحدًا، بينما يمثل كل عمود حقلاً محددًا.
على سبيل المثال، أ المستخدمين قد يحتوي الجدول على أعمدة مثل:
بطاقة تعريف: المعرف الفريد للمستخدم.
اسم: اسم المستخدم.
بريد إلكتروني: عنوان البريد الإلكتروني للمستخدم.
كلمة المرور: كلمة المرور المجزأة للمستخدم.
create_at: تاريخ إنشاء السجل.
يمكن لـ PHP التواصل مع MySQL باستخدام ملحقات مثل MySQLi أو PDO. غالبًا ما يُفضل PDO في PHP الحديث لأنه يدعم أنظمة قواعد بيانات متعددة ويوفر واجهة نظيفة للبيانات المعدة.
MySQL الاتصال
قبل أن يتمكن PHP من العمل مع قاعدة بيانات MySQL، يجب عليه إنشاء اتصال. يخبر الاتصال PHP بخادم قاعدة البيانات الذي يجب استخدامه واسم المستخدم وكلمة المرور واسم قاعدة البيانات التي يجب استخدامها.
يستخدم المثال التالي PDO لتوصيل PHP بـ MySQL.
<?php
$host = "localhost";
$dbname = "php_learning";
$username = "root";
$password = "";
try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$username,
$password
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully.";
} catch (PDOException $exception) {
echo "Connection failed: " . $exception->getMessage();
}
?>ال يحاول و يمسك يتم استخدام الكتل لمعالجة أخطاء الاتصال. إذا فشل الاتصال، فإن PHP يلتقط الاستثناء ويعرض رسالة خطأ.
ال مجموعة الأحرف = utf8mb4 الجزء مهم لأنه يساعد قاعدة البيانات على دعم العديد من الأحرف، بما في ذلك العربية والتركية والإنجليزية والرموز التعبيرية.
في التطبيقات الحقيقية، يجب عادةً تخزين بيانات اعتماد قاعدة البيانات في ملف تكوين أو ملف بيئة، وليس مباشرة داخل كل صفحة PHP.
MySQL إنشاء قاعدة بيانات
إنشاء قاعدة بيانات يعني إنشاء الحاوية الرئيسية حيث سيتم تخزين الجداول والسجلات. ويتم ذلك عادة مرة واحدة أثناء إعداد المشروع.
يقوم المثال التالي بإنشاء قاعدة بيانات باستخدام PDO.
<?php
$host = "localhost";
$username = "root";
$password = "";
try {
$pdo = new PDO("mysql:host=$host;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE php_learning CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
$pdo->exec($sql);
echo "Database created successfully.";
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>اسم قاعدة البيانات في هذا المثال هو php_learning. تم تعيين مجموعة الأحرف والترتيب لدعم النص متعدد اللغات بشكل صحيح.
في المشاريع الاحترافية، غالبًا ما يتم إنشاء قواعد البيانات يدويًا من خلال أداة قاعدة البيانات، أو لوحة الاستضافة، أو سطر الأوامر، أو عمليات الترحيل في إطار عمل مثل Laravel.
MySQL إنشاء جدول
بعد إنشاء قاعدة البيانات، الخطوة التالية هي إنشاء الجداول. يحدد الجدول بنية البيانات التي سيتم تخزينها.
المثال التالي يخلق بسيطة المستخدمين طاولة.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
";
$pdo->exec($sql);
echo "Table created successfully.";
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>ال بطاقة تعريف العمود هو مفتاح أساسي يتزايد تلقائيًا. وهذا يعني أن MySQL يقوم تلقائيًا بإنشاء معرف فريد جديد لكل صف مدرج.
ال اسم و بريد إلكتروني أعمدة تخزن النص. ال ليست فارغة القاعدة تعني أن الحقل لا يمكن أن يكون فارغًا. ال UNIQUE القاعدة تعني أنه لا يمكن تكرار نفس البريد الإلكتروني.
ال create_at يقوم العمود بتخزين التاريخ والوقت عند إنشاء الصف.
MySQL أدخل البيانات
إدراج البيانات يعني إضافة سجلات جديدة إلى الجدول. على سبيل المثال، عندما يقوم مستخدم بالتسجيل، يقوم PHP بإدراج اسم المستخدم والبريد الإلكتروني في جدول المستخدمين.
يقوم المثال التالي بإدراج سجل مستخدم واحد.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO users (name, email) VALUES ('Adnan', 'adnan@example.com')";
$pdo->exec($sql);
echo "New user inserted successfully.";
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>يعمل هذا المثال، ولكنه ليس الطريقة الأكثر أمانًا عندما تأتي القيم من المستخدمين. لا ينبغي وضع إدخال المستخدم مباشرةً داخل سلاسل SQL. يجب استخدام العبارات المعدة بدلاً من ذلك للمساعدة في منع SQL injection.
تعد عبارات الإدراج المباشر مفيدة لفهم الفكرة الأساسية، ولكن العبارات المعدة هي الطريقة الموصى بها للتطبيقات الحقيقية.
MySQL احصل على آخر معرف
بعد إدراج صف جديد في جدول بمعرف متزايد تلقائيًا، قد تحتاج إلى معرفة معرف السجل الذي تم إنشاؤه حديثًا.
PHP PDO يوفر lastInsertId() طريقة لهذا الغرض.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO users (name, email) VALUES ('Noor', 'noor@example.com')";
$pdo->exec($sql);
$lastId = $pdo->lastInsertId();
echo "New record created with ID: " . $lastId;
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>يعد الحصول على آخر معرف تم إدراجه مفيدًا عند إنشاء السجلات ذات الصلة. على سبيل المثال، بعد إنشاء طلب، يمكنك استخدام معرف الطلب لإدراج عناصر الطلب في جدول آخر.
MySQL أدخل متعددة
في بعض الأحيان تحتاج إلى إدراج أكثر من صف واحد. يمكن أن يحدث هذا عند استيراد البيانات، أو إضافة منتجات متعددة، أو إنشاء الإعدادات الافتراضية، أو حفظ العديد من السجلات ذات الصلة.
إحدى الطرق هي تنفيذ عدة عبارات إدراج داخل المعاملة.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->beginTransaction();
$pdo->exec("INSERT INTO users (name, email) VALUES ('Ali', 'ali@example.com')");
$pdo->exec("INSERT INTO users (name, email) VALUES ('Sara', 'sara@example.com')");
$pdo->exec("INSERT INTO users (name, email) VALUES ('Omar', 'omar@example.com')");
$pdo->commit();
echo "Multiple users inserted successfully.";
} catch (PDOException $exception) {
$pdo->rollBack();
echo "Error: " . $exception->getMessage();
}
?>تساعد المعاملة في الحفاظ على اتساق البيانات. إذا فشلت عملية إدراج واحدة، فيمكن للمعاملة التراجع عن التغييرات بدلاً من حفظ جزء فقط من البيانات.
بالنسبة للبيانات المقدمة من المستخدم، يجب استخدام العبارات المحضرة عند إدراج سجلات متعددة.
MySQL جاهز
تعد العبارات المحضرة أحد أهم المفاهيم عند استخدام MySQL مع PHP. فهي تساعد في حماية التطبيقات من SQL injection عن طريق فصل بنية SQL عن إدخال المستخدم.
بدلاً من إدراج القيم مباشرةً في السلسلة SQL، يتم استخدام العناصر النائبة. ثم يتم تمرير القيم بشكل منفصل.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$statement = $pdo->prepare($sql);
$statement->execute([
"name" => "Adnan",
"email" => "adnan@example.com"
]);
echo "User inserted with prepared statement.";
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>العناصر النائبة :اسم و :بريد إلكتروني يتم استبدالها بأمان بـ PDO عند تنفيذ العبارة.
يجب استخدام العبارات المحضرة لإدراج الاستعلامات وتحديثها وحذفها وتحديدها عندما يتعلق الأمر بإدخال المستخدم.
وهي مهمة بشكل خاص في نماذج تسجيل الدخول، ونماذج البحث، وتحديثات الملف الشخصي، ولوحات الإدارة، وواجهات API، وأي صفحة تتلقى بيانات الطلب.
MySQL حدد البيانات
تحديد البيانات يعني قراءة السجلات من جدول قاعدة البيانات. ال SELECT يستخدم البيان لاسترداد البيانات.
يحدد المثال التالي كافة المستخدمين من جدول المستخدمين.
<?php
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $pdo->query("SELECT id, name, email, created_at FROM users");
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
echo $user["name"] . " - " . $user["email"];
}
} catch (PDOException $exception) {
echo "Error: " . $exception->getMessage();
}
?>ال fetchAll(PDO::FETCH_ASSOC) تقوم الطريقة بإرجاع النتيجة كمصفوفة من المصفوفات الترابطية. وهذا يجعل من السهل الوصول إلى الأعمدة بالاسم.
يتم استخدام استعلامات التحديد في كل موقع ويب ديناميكي تقريبًا، مثل عرض منشورات المدونة وقوائم المنتجات وملفات تعريف المستخدمين والفئات والتعليقات ونتائج البحث.
MySQL أين
ال WHERE يتم استخدام العبارة لتصفية السجلات. بدلاً من تحديد كافة الصفوف، يمكنك فقط تحديد الصفوف التي match شرط.
على سبيل المثال، يقوم الاستعلام التالي بتحديد مستخدم واحد عن طريق البريد الإلكتروني.
<?php
$email = "adnan@example.com";
$statement = $pdo->prepare("SELECT id, name, email FROM users WHERE email = :email");
$statement->execute([
"email" => $email
]);
$user = $statement->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo $user["name"];
} else {
echo "User not found.";
}
?>يمكن أن تستخدم جملة WHERE العديد من عوامل التشغيل، مثل =, >, <, >=, <=, !=, LIKE, IN، و BETWEEN.
<?php
$statement = $pdo->prepare("SELECT * FROM users WHERE name LIKE :keyword");
$statement->execute([
"keyword" => "%ad%"
]);
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
?>يُستخدم WHERE بشكل شائع للبحث والتصفية وعمليات التحقق من تسجيل الدخول وصفحات الملف الشخصي والأذونات والعثور على سجلات محددة.
MySQL الطلب حسب
ال ORDER BY يتم استخدام العبارة لفرز نتائج الاستعلام. يمكنك فرز السجلات بترتيب تصاعدي باستخدام ASC أو ترتيب تنازلي باستخدام DESC.
المثال التالي يحدد المستخدمين ويرتبهم حسب تاريخ الإنشاء من الأحدث إلى الأقدم.
<?php
$statement = $pdo->query("SELECT id, name, email, created_at FROM users ORDER BY created_at DESC");
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
echo $user["name"] . " - " . $user["created_at"];
}
?>يمكنك أيضًا الطلب حسب الاسم أبجديًا.
<?php
$statement = $pdo->query("SELECT id, name, email FROM users ORDER BY name ASC");
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
?>يُستخدم ORDER BY بشكل شائع في لوحات المعلومات وقوائم المدونات وصفحات المنتجات والتقارير والجداول ولوحات الإدارة.
MySQL حذف البيانات
حذف البيانات يعني إزالة السجلات من الجدول. ال DELETE يتم استخدام البيان لهذه العملية.
من المهم جدًا استخدام جملة WHERE عند حذف السجلات. بدون WHERE، قد يتم حذف كافة الصفوف في الجدول.
<?php
$id = 5;
$statement = $pdo->prepare("DELETE FROM users WHERE id = :id");
$statement->execute([
"id" => $id
]);
echo "User deleted successfully.";
?>في التطبيقات الحقيقية، يجب عادةً حماية إجراءات الحذف بالأذونات ورسائل التأكيد وأحيانًا منطق الحذف الناعم.
الحذف الناعم يعني أنه لم تتم إزالة السجل فعليًا من قاعدة البيانات. بدلاً من ذلك، تم وضع علامة عليه كمحذوف باستخدام عمود مثل delete_at. وهذا يسمح للنظام باستعادة السجل لاحقًا إذا لزم الأمر.
MySQL تحديث البيانات
تحديث البيانات يعني تغيير السجلات الموجودة في الجدول. ال UPDATE يتم استخدام البيان لهذه العملية.
مثل استعلامات الحذف، يجب أن تتضمن استعلامات التحديث عادةً عبارة WHERE لتجنب تحديث كافة الصفوف عن طريق الخطأ.
<?php
$id = 1;
$name = "Adnan Mehrat";
$email = "adnan.mehrat@example.com";
$statement = $pdo->prepare("
UPDATE users
SET name = :name, email = :email
WHERE id = :id
");
$statement->execute([
"id" => $id,
"name" => $name,
"email" => $email
]);
echo "User updated successfully.";
?>تُستخدم استعلامات التحديث في نماذج تحرير الملف الشخصي ولوحات الإدارة وصفحات الإعدادات وتحديثات حالة الطلب وتغييرات كلمة المرور وأنظمة إدارة المحتوى.
يوصى بشدة باستخدام العبارات المحضرة لاستعلامات التحديث لأن القيم الجديدة غالبًا ما تأتي من إدخال المستخدم.
MySQL الحد من البيانات
ال LIMIT يتم استخدام العبارة لتقييد عدد السجلات التي يتم إرجاعها بواسطة الاستعلام. يعد هذا مفيدًا عندما لا تريد تحميل كافة السجلات مرة واحدة.
على سبيل المثال، يقوم الاستعلام التالي بإرجاع خمسة مستخدمين فقط.
<?php
$statement = $pdo->query("SELECT id, name, email FROM users ORDER BY id DESC LIMIT 5");
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
?>يُستخدم LIMIT بشكل شائع للمشاركات الحديثة، وأحدث المستخدمين، وأحدث الطلبات، وأدوات لوحة المعلومات، وترقيم الصفحات.
بالنسبة لترقيم الصفحات، يُستخدم LIMIT عادةً مع OFFSET.
<?php
$page = 2;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$statement = $pdo->prepare("
SELECT id, name, email
FROM users
ORDER BY id DESC
LIMIT :limit OFFSET :offset
");
$statement->bindValue(":limit", $perPage, PDO::PARAM_INT);
$statement->bindValue(":offset", $offset, PDO::PARAM_INT);
$statement->execute();
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
?>عند استخدام LIMIT وOFFSET مع العبارات المعدة، فمن الأفضل ربط القيم كأعداد صحيحة باستخدام PDO::PARAM_INT.
أكمل MySQL CRUD مثال
CRUD يرمز إلى الإنشاء والقراءة والتحديث والحذف. هذه هي عمليات قاعدة البيانات الرئيسية المستخدمة في معظم تطبيقات الويب.
يوضح المثال المبسط التالي الفكرة العامة لـ CRUD باستخدام PDO العبارات المعدة.
<?php
$pdo = new PDO(
"mysql:host=localhost;dbname=php_learning;charset=utf8mb4",
"root",
""
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Create
$create = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$create->execute([
"name" => "Adnan",
"email" => "adnan@example.com"
]);
// Read
$read = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$read->execute([
"email" => "adnan@example.com"
]);
$user = $read->fetch(PDO::FETCH_ASSOC);
// Update
$update = $pdo->prepare("UPDATE users SET name = :name WHERE email = :email");
$update->execute([
"name" => "Adnan Mehrat",
"email" => "adnan@example.com"
]);
// Delete
$delete = $pdo->prepare("DELETE FROM users WHERE email = :email");
$delete->execute([
"email" => "adnan@example.com"
]);
?>يوضح هذا المثال سير عمل قاعدة البيانات الأساسية المستخدمة في العديد من التطبيقات. في المشاريع الحقيقية، عادة ما يتم تنظيم هذا المنطق داخل الفئات أو المستودعات أو النماذج أو الخدمات أو الهياكل الإطارية.
ملاحظات الأمان لـ MySQL مع PHP
يتطلب العمل مع قواعد البيانات ممارسات أمنية دقيقة. غالبًا ما تستخدم استعلامات قاعدة البيانات مدخلات المستخدم، لذلك يمكن أن تؤدي التعليمات البرمجية غير الآمنة إلى SQL injection أو تسرب البيانات أو السجلات التالفة.
تشمل الممارسات الأمنية المهمة ما يلي:
استخدم العبارات المحضرة لجميع مدخلات المستخدم.
لا تضع إدخالات المستخدم الأولية مباشرةً داخل استعلامات SQL.
التحقق من صحة بيانات النموذج وتعقيمها قبل استخدامها.
هروب الإخراج عند عرض محتوى قاعدة البيانات في HTML.
استخدم كلمات مرور قوية لقاعدة البيانات في الإنتاج.
لا تكشف أخطاء قاعدة البيانات للمستخدمين العامين.
استخدم الأذونات المناسبة لمستخدمي قاعدة البيانات.
النسخ الاحتياطي لقواعد البيانات الهامة بانتظام.
توفر أطر العمل مثل Laravel أدوات مثل عمليات الترحيل ونماذج Eloquent ومنشئي الاستعلامات والتحقق من الصحة وتكوين قاعدة البيانات. ومع ذلك، فإن فهم PHP وMySQL الأولي أمر مهم لأنه يساعد المطورين على فهم ما يحدث خلف إطار العمل.
خاتمة
MySQL هو نظام قاعدة بيانات قوي يُستخدم بشكل شائع مع PHP لإنشاء تطبيقات ويب ديناميكية تعتمد على البيانات. من خلال تعلم كيفية الاتصال بـ MySQL، وإنشاء قواعد البيانات والجداول، وإدراج البيانات، والحصول على آخر معرف تم إدراجه، وإدراج سجلات متعددة، واستخدام العبارات المحضرة، وتحديد البيانات، والتصفية باستخدام WHERE، وترتيب النتائج، وتحديث السجلات، وحذف البيانات، وتحديد النتائج، فإنك تفهم أساس تطوير PHP القائم على قاعدة البيانات.
تُستخدم هذه المفاهيم في كل مشروع PHP حقيقي تقريبًا، بما في ذلك المدونات ولوحات المعلومات ولوحات الإدارة وأنظمة التجارة الإلكترونية وواجهات API وأنظمة إدارة المستخدم.
بعد تعلم أساسيات MySQL، فإن الخطوة التالية هي التدرب على بناء تطبيقات CRUD صغيرة ثم الانتقال نحو بنية أنظف باستخدام فئات PDO أو المستودعات أو بنية MVC أو أطر العمل مثل Laravel.

