为什么PHP和PostgreSQL是“一见钟情”?
网页开发的世界充满了刻板印象。其中之一就是:“PHP只和MySQL做朋友”。这话有一定道理,但仅限于你还没尝试过PHP和PostgreSQL的组合之前。这就像从自行车换到运动摩托车:轮子还是那些轮子,但速度、灵活性和可靠性完全不同。
PostgreSQL不仅仅是一个数据库。它是一个对象关系型“怪兽”,能够处理JSON、地理数据、全文搜索以及极其复杂的事务。而PHP则是这个乐团的理想指挥。在本指南中,我们将涵盖所有内容:从驱动程序安装到编写生产级代码。开始吧!
1. 安装与配置:准备好工具
在编写代码之前,确保PHP知道PostgreSQL的存在。在大多数现代PHP发行版(例如XAMPP、OpenServer、Docker)中,pdo_pgsql扩展已经存在,但需要激活它。
1.1. 在php.ini中启用扩展
打开你的php.ini文件,并取消注释(去掉开头的分号)以下行:
extension=pdo_pgsql如果你使用Linux,安装方式如下:
sudo apt-get install php-pgsqlsudo service apache2 restart # 或 nginx + php-fpm1.2. 创建数据库和用户
进入PostgreSQL控制台:
sudo -u postgres psql现在为我们的项目创建一个数据库和用户:
CREATE DATABASE pythonlib_blog;CREATE USER myapp WITH PASSWORD 'SuperSecret123';GRANT ALL PRIVILEGES ON DATABASE pythonlib_blog TO myapp;\\q完成。现在我们有了一个名为pythonlib_blog的数据库和一个名为myapp的用户。
2. 首次连接:PDO作为标准
永远不要使用旧的pg_connect()函数。在现代PHP中,有PDO(PHP数据对象)——一个用于处理不同数据库的统一接口。它更安全、更方便,并且支持预处理语句。
2.1. 连接包装类
创建一个简单的Database类来管理连接:
<?php
class Database { private static ?PDO $instance = null; private const DB_HOST = 'localhost'; private const DB_PORT = 5432; private const DB_NAME = 'pythonlib_blog'; private const DB_USER = 'myapp'; private const DB_PASS = 'SuperSecret123';
public static function getConnection(): PDO { if (self::$instance === null) { $dsn = "pgsql:host=" . self::DB_HOST . ";port=" . self::DB_PORT . ";dbname=" . self::DB_NAME; try { self::$instance = new PDO($dsn, self::DB_USER, self::DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]); } catch (PDOException $e) { die("Connection failed: " . $e->getMessage()); } } return self::$instance; }}为什么这很酷?首先,单例模式——我们不会在每个请求时都创建新连接。其次,ATTR_EMULATE_PREPARES => false强制PostgreSQL使用真正的预处理语句,而不是在PHP端进行模拟。这提高了性能和安全性。
3. CRUD操作:创建、读取、更新、删除
现在进入正题。假设我们有一个用于pythonlib.ru文章的articles表。
3.1. 创建表
在你的数据库中执行以下SQL(通过psql或管理工具):
CREATE TABLE articles ( id SERIAL PRIMARY KEY, title VARCHAR(255)