أساسيات PHP
مقدمة إلى MySQLi
ما هو MySQLi؟
MySQLi (MySQL Improved) هو امتداد PHP يوفر واجهة للتفاعل مع قواعد بيانات MySQL. يقدم نهجين إجرائي وموجه للكائنات، أداء محسّن، وميزات أمان معززة.
لماذا نستخدم MySQLi؟
- الأمان: يدعم العبارات المحضرة لمنع حقن SQL
- الأداء: أداء أفضل من امتداد MySQL القديم
- الميزات: الوصول إلى جميع ميزات MySQL بما في ذلك المعاملات
- المرونة: واجهات إجرائية وموجهة للكائنات
ملاحظة: دوال
mysql_* القديمة تم إهمالها في PHP 5.5 وإزالتها في PHP 7.0. استخدم دائمًا MySQLi أو PDO لعمليات قواعد البيانات.
MySQLi مقابل PDO
| الميزة | MySQLi | PDO |
|---|---|---|
| دعم قواعد البيانات | MySQL فقط | أكثر من 12 قاعدة بيانات |
| نمط الواجهة | إجرائي + OOP | OOP فقط |
| العبارات المحضرة | نعم | نعم |
| الأداء | أسرع قليلاً | جيد جدًا |
الاتصال بقاعدة بيانات MySQL
هناك طريقتان للاتصال باستخدام MySQLi: إجرائية وموجهة للكائنات.
النهج الموجه للكائنات (موصى به)
<?php
// معلمات الاتصال بقاعدة البيانات
$host = 'localhost';
$username = 'root';
$password = '';
$database = 'my_database';
// إنشاء الاتصال
$conn = new mysqli($host, $username, $password, $database);
// فحص الاتصال
if ($conn->connect_error) {
die("فشل الاتصال: " . $conn->connect_error);
}
echo "تم الاتصال بنجاح";
// إغلاق الاتصال عند الانتهاء
$conn->close();
?>
النهج الإجرائي
<?php
// معلمات الاتصال بقاعدة البيانات
$host = 'localhost';
$username = 'root';
$password = '';
$database = 'my_database';
// إنشاء الاتصال
$conn = mysqli_connect($host, $username, $password, $database);
// فحص الاتصال
if (!$conn) {
die("فشل الاتصال: " . mysqli_connect_error());
}
echo "تم الاتصال بنجاح";
// إغلاق الاتصال عند الانتهاء
mysqli_close($conn);
?>
نصيحة: النهج الموجه للكائنات أكثر حداثة ونظافة. سنستخدمه في هذا الدرس.
تعيين ترميز الأحرف
اضبط دائمًا ترميز الأحرف على UTF-8 للتعامل مع الأحرف الدولية بشكل صحيح:
<?php
$conn = new mysqli($host, $username, $password, $database);
// تعيين الترميز إلى utf8mb4 (يدعم الرموز التعبيرية وجميع أحرف Unicode)
$conn->set_charset("utf8mb4");
// طريقة بديلة
// $conn->query("SET NAMES utf8mb4");
?>
خيارات معالجة الأخطاء
يوفر MySQLi طرقًا مختلفة للتعامل مع الأخطاء:
1. الفحص اليدوي للأخطاء (افتراضي)
<?php
$conn = new mysqli($host, $username, $password, $database);
if ($conn->connect_error) {
die("فشل الاتصال: " . $conn->connect_error);
}
?>
2. وضع الاستثناءات (موصى به)
<?php
// تفعيل وضع الاستثناءات
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$conn = new mysqli($host, $username, $password, $database);
$conn->set_charset("utf8mb4");
echo "تم الاتصال بنجاح";
} catch (mysqli_sql_exception $e) {
die("فشل الاتصال: " . $e->getMessage());
}
?>
تحذير: لا تعرض رسائل الأخطاء التفصيلية للمستخدمين في الإنتاج. سجّل الأخطاء بدلاً من ذلك واعرض رسائل عامة.
فئة اتصال قاعدة البيانات الكاملة
إليك فئة اتصال قاعدة بيانات قابلة لإعادة الاستخدام:
<?php
class Database {
private $host = 'localhost';
private $username = 'root';
private $password = '';
private $database = 'my_database';
private $conn;
public function __construct() {
// تفعيل وضع الاستثناءات
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$this->conn = new mysqli(
$this->host,
$this->username,
$this->password,
$this->database
);
// تعيين الترميز
$this->conn->set_charset("utf8mb4");
} catch (mysqli_sql_exception $e) {
// تسجيل الخطأ (في الإنتاج)
error_log("فشل اتصال قاعدة البيانات: " . $e->getMessage());
// عرض رسالة عامة للمستخدم
die("فشل الاتصال بقاعدة البيانات. حاول مرة أخرى لاحقًا.");
}
}
public function getConnection() {
return $this->conn;
}
public function close() {
if ($this->conn) {
$this->conn->close();
}
}
public function __destruct() {
$this->close();
}
}
// الاستخدام
$db = new Database();
$conn = $db->getConnection();
// عمليات قاعدة البيانات هنا
// يغلق الاتصال تلقائيًا عند انتهاء البرنامج
?>
استخدام ملف التكوين
احفظ بيانات اعتماد قاعدة البيانات في ملف تكوين منفصل:
config.php
<?php
// تكوين قاعدة البيانات
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'my_database');
define('DB_CHARSET', 'utf8mb4');
// الإبلاغ عن الأخطاء (عطّل في الإنتاج)
define('DISPLAY_ERRORS', true);
if (DISPLAY_ERRORS) {
ini_set('display_errors', 1);
error_reporting(E_ALL);
}
?>
database.php
<?php
require_once 'config.php';
// تفعيل وضع الاستثناءات
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$conn->set_charset(DB_CHARSET);
} catch (mysqli_sql_exception $e) {
error_log("خطأ في قاعدة البيانات: " . $e->getMessage());
die("فشل الاتصال بقاعدة البيانات");
}
?>
ملاحظة أمنية: احفظ
config.php خارج جذر الويب أو احمِه بـ .htaccess لمنع الوصول المباشر.
تمرين: إنشاء أول اتصال بقاعدة البيانات
- أنشئ قاعدة بيانات MySQL باسم
learning_php - أنشئ ملف
config.phpمع بيانات اعتماد قاعدة البيانات - أنشئ ملف
database.phpيتصل بقاعدة البيانات - أنشئ ملف
test.phpيتضمنdatabase.phpويعرض "تم الاتصال بنجاح" - اختبر الاتصال بالوصول إلى
test.phpفي متصفحك - أدخل بيانات اعتماد خاطئة عمدًا وتحقق من معالجة الأخطاء بشكل صحيح
أفضل الممارسات
- استخدم وضع الاستثناءات: فعّل
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) - اضبط ترميز UTF-8: استخدم دائمًا
set_charset("utf8mb4") - افصل التكوين: احفظ بيانات الاعتماد في ملف منفصل
- أغلق الاتصالات: أغلق اتصالات قاعدة البيانات عند الانتهاء (أو استخدم
__destruct()) - تعامل مع الأخطاء برشاقة: سجّل الأخطاء واعرض رسائل عامة للمستخدمين
- استخدم العبارات المحضرة: لا تدمج مدخلات المستخدم مباشرة في استعلامات SQL
الملخص
- MySQLi هو الطريقة الحديثة للتفاعل مع قواعد بيانات MySQL في PHP
- يقدم نهجين إجرائي وموجه للكائنات
- فعّل دائمًا وضع الاستثناءات لمعالجة أفضل للأخطاء
- اضبط ترميز الأحرف على utf8mb4 لدعم Unicode الكامل
- احفظ بيانات اعتماد قاعدة البيانات بشكل آمن في ملفات التكوين
- لا تعرض رسائل الأخطاء التفصيلية للمستخدمين في الإنتاج