لماذا PHP و PostgreSQL هما حب من أول استعلام؟
\n\nعالم تطوير الويب مليء بالصور النمطية. أحدها يقول: «PHP يصادق MySQL فقط». هناك بعض الحقيقة في هذا، ولكن فقط حتى تجرب الربط PHP و PostgreSQL. إنه مثل الانتقال من دراجة هوائية إلى دراجة نارية رياضية: نفس العجلات، لكن السرعة وخفة الحركة والموثوقية مختلفة تمامًا.
\n\nPostgreSQL ليست مجرد قاعدة بيانات. إنها وحش كائني-علائقي يمكنه العمل مع JSON والبيانات الجغرافية والبحث النصي الكامل والمعاملات المعقدة للغاية. و PHP هو القائد المثالي لهذه الأوركسترا. في هذا الدليل، سنغطي كل شيء: من تثبيت برنامج التشغيل إلى كتابة كود جاهز للإنتاج. هيا بنا!
\n\n1. التثبيت والإعداد: تجهيز الأدوات
\n\nقبل كتابة الكود، دعنا نتأكد من أن PHP يعرف بوجود PostgreSQL. في معظم توزيعات PHP الحديثة (مثل XAMPP و OpenServer و Docker)، الامتداد pdo_pgsql موجود بالفعل، لكنه يحتاج إلى تفعيل.
1.1. تفعيل الامتداد في php.ini
\n\nافتح ملف php.ini الخاص بك وقم بإلغاء التعليق (أزل الفاصلة المنقوطة في البداية) على السطر:
extension=pdo_pgsql\n\nإذا كنت تستخدم Linux، فالتثبيت يكون كالتالي:
\n\nsudo apt-get install php-pgsql\nsudo service apache2 restart # أو nginx + php-fpm\n\n1.2. إنشاء قاعدة البيانات والمستخدم
\n\nادخل إلى وحدة تحكم PostgreSQL:
\n\nsudo -u postgres psql\n\nالآن لننشئ قاعدة بيانات ومستخدمًا لمشروعنا:
\n\nCREATE DATABASE pythonlib_blog;\nCREATE USER myapp WITH PASSWORD 'SuperSecret123';\nGRANT ALL PRIVILEGES ON DATABASE pythonlib_blog TO myapp;\n\\q\n\nتم. الآن لدينا قاعدة بيانات pythonlib_blog ومستخدم myapp.
2. أول اتصال: PDO كمعيار
\n\nلا تستخدم أبدًا الدوال القديمة pg_connect(). في PHP الحديثة، يوجد PDO (PHP Data Objects) — واجهة موحدة للعمل مع قواعد بيانات مختلفة. إنها أكثر أمانًا وراحة وتدعم الاستعلامات المحضرة.
2.1. فئة غلاف للاتصال
\n\nلننشئ فئة بسيطة Database تدير الاتصال:
<?php\n\nclass Database {\n private static ?PDO $instance = null;\n private const DB_HOST = 'localhost';\n private const DB_PORT = 5432;\n private const DB_NAME = 'pythonlib_blog';\n private const DB_USER = 'myapp';\n private const DB_PASS = 'SuperSecret123';\n\n public static function getConnection(): PDO {\n if (self::$instance === null) {\n $dsn = "pgsql:host=" . self::DB_HOST . ";port=" . self::DB_PORT . ";dbname=" . self::DB_NAME;\n try {\n self::$instance = new PDO($dsn, self::DB_USER, self::DB_PASS, [\n PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,\n PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,\n PDO::ATTR_EMULATE_PREPARES => false,\n ]);\n } catch (PDOException $e) {\n die("Connection failed: " . $e->getMessage());\n }\n }\n return self::$instance;\n }\n}\n\nلماذا هذا رائع؟ أولاً، النمط المفرد — نحن لا ننشئ اتصالاً جديدًا مع كل طلب. ثانيًا، ATTR_EMULATE_PREPARES => false يجبر PostgreSQL على استخدام الاستعلامات المحضرة الحقيقية، وليس المحاكاة على جانب PHP. هذا يحسن الأداء والأمان.
3. عمليات CRUD: إنشاء، قراءة، تحديث، حذف
\n\nالآن الجزء المهم. لنفترض أن لدينا جدول articles للمقالات على pythonlib.ru.
3.1. إنشاء الجدول
\n\nنفذ هذا SQL في قاعدة بياناتك (عبر psql أو لوحة الإدارة):
\n\nCREATE TABLE articles (\n id SERIAL PRIMARY KEY,\n title VARCHAR(255)