استخدام وحدة SQLite المدمجة في ServBay لتطوير PHP
ServBay هو بيئة تطوير ويب محلية قوية مصممة للمطورين، تدعم العديد من التقنيات. تأتي مع وحدة قاعدة بيانات SQLite مدمجة، مما يجعل تخزين البيانات وإدارتها باستخدام SQLite في تطبيقات PHP أمرًا سهلًا جدًا. في هذا المقال سنوضح كيفية الاستفادة من هذه الميزة في ServBay بالتفصيل.
نظرة عامة على وحدة SQLite
SQLite هو نظام إدارة قواعد بيانات علائقية خفيف الوزن ومضمن. على عكس قواعد البيانات التقليدية التي تتطلب سيرفر منفصل (مثل MySQL أو PostgreSQL)، يمكن تضمين SQLite مباشرة داخل التطبيق الخاص بك كمكتبة. ويتم تخزين قاعدة البيانات بالكامل في ملف واحد، مما يبسط عملية النشر والإدارة بشكل كبير.
اكتسبت SQLite شهرة واسعة لهذه الميزات، خاصة في التطبيقات الصغيرة والمتوسطة، والتخزين المؤقت المحلي، وتطبيقات الهواتف المحمولة وبيئات التطوير والاختبار:
الميزات الرئيسية
- خفة الوزن: مكتبة النواة صغيرة الحجم ولا تستهلك موارد كبيرة.
- بدون إعداد معقد: لا حاجة لتثبيت أو إعداد سيرفر أو إدارة صلاحيات المستخدمين — تعمل مباشرة بعد التثبيت.
- أداء عالي: تقدم أداءً ممتازًا لغالبية عمليات القراءة والكتابة متوسطة الحجم.
- تخزين في ملف واحد: يتم الاحتفاظ بقاعدة البيانات كاملة في ملف
.sqlite
واحد، ما يسهل النسخ الاحتياطي والنقل والإدارة. - دعم معاملات ACID: توفر معالجة معاملات موثوقة لضمان اتساق البيانات وسلامتها.
- متعددة المنصات: تدعم أنظمة تشغيل ولغات برمجة متعددة.
دعم ServBay لـ SQLite
ServBay يأتي مع نسخ PHP متعددة، وجميع هذه النسخ تشمل ملحقات SQLite (sqlite3
و pdo_sqlite
) مُثبتة ومفعلة افتراضيًا. هذا يعني أنك لست بحاجة إلى تنزيل أو تثبيت أو إعداد أي إضافات يدوية، بل يمكنك استخدام ميزات SQLite مباشرة من مشروع PHP لديك.
المتطلبات الأساسية
- التأكد من تثبيت وتشغيل ServBay على macOS.
- تشغيل نسخة PHP المطلوبة من خلال ServBay.
- وجود مجلد لموقعك الإلكتروني، ويفضل استخدام مجلد الجذر الافتراضي لـ ServBay
/Applications/ServBay/www
أو أحد مجلداته الفرعية.
كيفية استخدام SQLite في ServBay
نظرًا لأن ServBay يُفعل وحدة SQLite افتراضيًا، لا يلزمك اتخاذ أي إجراء خاص لتفعيلها. بيئة PHP جاهزة مباشرة لاستدعاء دوال وفئات SQLite ذات الصلة.
التحقق من تفعيل ملحق SQLite:
إذا رغبت في التأكد من تفعيل ملحق SQLite، يمكنك ذلك من خلال صفحة خرج دالة phpinfo()
:
- أنشئ ملف PHP يحتوي على
<?php phpinfo(); ?>
(مثلاً باسمinfo.php
). - ضع الملف داخل أحد مجلدات مواقعك ضمن مجلد جذر ServBay، مثل
/Applications/ServBay/www/servbay.demo/info.php
. - افتح الملف من خلال المتصفح — على سبيل المثال،
http://servbay.demo/info.php
. - ابحث في الصفحة الناتجة عن "sqlite" أو "pdo_sqlite". ظهور هذه الإعدادات يعني أن الملحق مفعل بنجاح.
استخدام SQLite في شفرة PHP
بمجرد التأكد من تفعيل ملحق SQLite، يمكنك استخدام APIs ذات الصلة في تطبيقك. يوفر PHP عدة طرق للتعامل مع SQLite، وأكثرها شيوعًا هما فئة SQLite3
(أسلوب موجه للكائنات) وPDO
(كائنات بيانات PHP).
فيما يلي أمثلة للربط، وإنشاء الجداول، والإدراج والاستعلام عن البيانات باستخدام الطريقتين داخل بيئة ServBay. يُنصح بوضع ملفات PHP وقاعدة البيانات الناتجة (.sqlite
) في مجلد مشروع موقعك، مثل /Applications/ServBay/www/your-project-name/
.
مثال (باستخدام SQLite3 القياسي)
هذه الطريقة تستخدم فئة SQLite3
المدمجة في PHP وتوفر واجهة موجهة للكائنات لإدارة قواعد بيانات SQLite.
<?php
// مسار ملف قاعدة البيانات
// من الأفضل أن تحفظ الملف في مجلد فرعي داخل مشروعك مثل data/
$db_file = __DIR__ . '/data/servbay_demo.sqlite'; // __DIR__ يشير إلى مسار المجلد الحالي للسكريبت
// التأكد من وجود مجلد البيانات
if (!is_dir(__DIR__ . '/data')) {
mkdir(__DIR__ . '/data', 0777, true);
}
// الاتصال بقاعدة بيانات SQLite
// إذا لم يوجد الملف، سيتم إنشاؤه تلقائيًا
try {
$db = new SQLite3($db_file);
echo "تم الاتصال بقاعدة البيانات بنجاح: " . $db_file . "\n";
} catch (Exception $e) {
die("فشل الاتصال بقاعدة البيانات: " . $e->getMessage());
}
// إنشاء الجدول
// استخدام IF NOT EXISTS لتفادي الخطأ عند التكرار
$create_table_sql = "CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
)";
if ($db->exec($create_table_sql)) {
echo "تم إنشاء الجدول 'users' أو أنه موجود مسبقًا\n";
} else {
echo "فشل إنشاء الجدول: " . $db->lastErrorMsg() . "\n";
}
// إدراج البيانات
$name = 'ServBay Demo User';
$email = '[email protected]';
$age = 30;
// استخدام العبارات المحضرة لمنع الحقن البرمجي
$stmt = $db->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->bindValue(':email', $email, SQLITE3_TEXT);
$stmt->bindValue(':age', $age, SQLITE3_INTEGER);
// تنفيذ الإدراج والتحقق من النجاح (email يجب أن يكون فريدًا، الإدراج المكرر سيفشل)
if ($stmt->execute()) {
echo "تم إدراج البيانات بنجاح: Name=" . $name . ", Email=" . $email . "\n";
} else {
// التحقق من وجود خطأ في القيد الفريد
if (strpos($db->lastErrorMsg(), 'UNIQUE constraint failed') !== false) {
echo "فشل إدراج البيانات: البريد الإلكتروني '" . $email . "' موجود بالفعل\n";
} else {
echo "فشل إدراج البيانات: " . $db->lastErrorMsg() . "\n";
}
}
$stmt->close(); // إغلاق العبارة المحضرة
// استعلام البيانات
$search_name = 'ServBay Demo User';
$query_sql = "SELECT id, name, email, age FROM users WHERE name = :name";
$stmt = $db->prepare($query_sql);
$stmt->bindValue(':name', $search_name, SQLITE3_TEXT);
$result = $stmt->execute();
echo "نتائج الاستعلام:\n";
$found = false;
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
print_r($row);
$found = true;
}
if (!$found) {
echo "لم يتم العثور على بيانات مطابقة\n";
}
$result->finalize(); // تحرير مجموعة النتائج
$stmt->close(); // إغلاق العبارة المحضرة
// إغلاق الاتصال بقاعدة البيانات
$db->close();
echo "تم إغلاق الاتصال بقاعدة البيانات\n";
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
مثال (باستخدام PDO)
يوفر كائن بيانات PHP (PDO) طبقة تجريد موحدة للوصول إلى قواعد البيانات، بحيث يمكنك الوصول بأنظمة مختلفة باستخدام نفس الوظائف. يوصى بالاستفادة من PDO للوصول إلى SQLite لمرونته ولمزايا دعم المزيد من قواعد البيانات بتنظيم موحد.
<?php
// مسار ملف قاعدة البيانات
// من الأفضل أن تحفظ الملف في مجلد فرعي داخل مشروعك مثل data/
$db_file = __DIR__ . '/data/servbay_demo_pdo.sqlite'; // __DIR__ يشير إلى مسار المجلد الحالي للسكريبت
// التأكد من وجود مجلد البيانات
if (!is_dir(__DIR__ . '/data')) {
mkdir(__DIR__ . '/data', 0777, true);
}
try {
// إنشاء كائن PDO جديد
// صيغة DSN: 'sqlite:مسار قاعدة البيانات'
$dsn = 'sqlite:' . $db_file;
$pdo = new PDO($dsn);
// ضبط وضع الخطأ لإلقاء الاستثناءات (يسهل عملية التصحيح)
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// ضبط وضع الجلب الافتراضي مثلاً كمصفوفة ذات مفاتيح
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo "تم الاتصال بقاعدة البيانات بنجاح: " . $db_file . "\n";
// إنشاء الجدول
$create_table_sql = "CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
)";
$pdo->exec($create_table_sql);
echo "تم إنشاء الجدول 'users' أو أنه موجود مسبقًا\n";
// إدراج البيانات
$name = 'ServBay PDO User';
$email = '[email protected]';
$age = 35;
// استخدام عبارات محضرة
$stmt = $pdo->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
// تنفيذ الإدراج والتحقق من النجاح (البريد الإلكتروني يجب أن يكون فريدًا)
try {
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "تم إدراج البيانات بنجاح: Name=" . $name . ", Email=" . $email . "\n";
} catch (PDOException $e) {
// التحقق من وجود خطأ في القيد الفريد (رمز خطأ SQLite=19)
if ($e->getCode() == '23000' || strpos($e->getMessage(), 'UNIQUE constraint failed') !== false) {
echo "فشل إدراج البيانات: البريد الإلكتروني '" . $email . "' موجود بالفعل\n";
} else {
throw $e; // إعادة رمي أخطاء أخرى
}
}
$stmt->closeCursor(); // تحرير موارد العبارة
// استعلام البيانات
$search_name = 'ServBay PDO User';
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => $search_name]);
$data = $stmt->fetchAll(); // جلب جميع الصفوف
echo "نتائج الاستعلام:\n";
if ($data) {
print_r($data);
} else {
echo "لم يتم العثور على بيانات مطابقة\n";
}
$stmt->closeCursor(); // تحرير موارد العبارة
} catch (PDOException $e) {
// التقاط استثناءات PDO
echo "فشل تنفيذ العمليات على قاعدة البيانات: " . $e->getMessage();
// يمكن أيضًا استخدام $e->getCode() للحصول على رمز الخطأ SQLSTATE
}
// لا يلزمك إغلاق اتصال PDO يدويًا، حيث يتم ذلك تلقائيًا عند انتهاء تنفيذ السكريبت.
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
حول موقع ملفات قاعدة البيانات:
في الأمثلة السابقة، يتم إنشاء ملفات قاعدة البيانات (servbay_demo.sqlite
وservbay_demo_pdo.sqlite
) في مجلد data/
الفرعي من نفس مسار ملف PHP الحالي. مثلاً، إذا كان ملف PHP في /Applications/ServBay/www/my-servbay-project/index.php
، فسيتم إنشاء قاعدة البيانات في /Applications/ServBay/www/my-servbay-project/data/
.
تخزين قاعدة البيانات ضمن مجلد فرعي لمشروع موقعك هو ممارسة جيدة لتسهيل إدارة المشروع والنسخ الاحتياطي. تأكد فقط أن مستخدم التشغيل التابع لـ ServBay لديه صلاحيات الكتابة على هذا المجلد (عادة لا تكون هناك مشكلة بذلك في الإعداد الافتراضي على macOS).
ملاحظات هامة
- ملفات قاعدة بيانات SQLite حساسة ويجب حمايتها من الوصول العام. يوصى بوضع ملف القاعدة خارج مجلدات الويب القابلة للوصول أو استخدام إعدادات الخادم (مثل Caddy أو Nginx) لمنع الوصول المباشر إلى ملفات
.sqlite
. في الأمثلة وضعت القاعدة في مجلدdata/
ضمن مجلد الموقع — وذلك فقط لأغراض الشرح، وفي البيئة الإنتاجية يجب اتباع ممارسات أمنية صارمة. - SQLite الأنسب للحالات التي لا تتطلب كتابات متزامنة كثيفة. في حالة التطبيقات ذات عمليات الكتابة المتزامنة العالية قد تظهر مشكلات في الأداء أو حجز القفل. للمشاريع كبيرة الحجم ذات المتطلبات العالية ينصح باستخدام MySQL أو PostgreSQL.
- رغم تفعيل ServBay افتراضيًا لوحدة SQLite، في حال لم تظهر في صفحة
phpinfo()
تأكد من إعدادات PHP في ServBay أو أعد تشغيل خدمة ServBay.
الأسئلة الشائعة (FAQ)
س: هل يجب تثبيت SQLite بشكل مستقل؟
ج: لا، حزمة PHP في ServBay تضم وحدات SQLite مفعلة افتراضيًا ويمكنك استخدامها مباشرة في شفرات PHP الخاصة بك.
س: أين ينبغي حفظ ملف قاعدة البيانات .sqlite
الخاص بي؟
ج: يُفضل حفظه في مجلد فرعي غير قابل للوصول المباشر من الويب (مثل data/
أو database/
) لتعزيز الأمان. في الأمثلة استخدمنا المسار النسبي __DIR__ . '/data/'
.
س: لماذا لا يستطيع سكربت PHP الاتصال إلى قاعدة بيانات SQLite أو إنشاء ملف قاعدة البيانات؟
ج: يرجى التحقق من التالي:
- تأكد أن ServBay يعمل وأنك تنفذ شفرة PHP عبره.
- تحقق من صفحة
phpinfo()
للتأكد من تفعيل ملحقاتsqlite3
وpdo_sqlite
. - تأكد من وجود مجلد قاعدة البيانات ومنح مستخدم التشغيل صلاحية الكتابة عليه.
الخلاصة
يوفر ServBay للمطورين بيئة متكاملة وسهلة لدعم تطوير تطبيقات PHP المعتمدة على SQLite محليًا. بفضل تفعيل وحدة SQLite بشكل افتراضي ودون أي إعداد يدوي، يمكنك البدء بسهولة في عمليات التطوير والاختبار محليًا. بالإضافة إلى مرونة SQLite وخفتها، يصبح ServBay أداة فعالة وسهلة لإدارة قاعدة البيانات في مشاريعك.