PHP和PostgreSQL:网页开发的强大组合

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么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-fpm


1.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)                

博客

书籍推荐