PHP 数据库操作实战:PostgreSQL 与 MongoDB
现代 PHP Web 开发几乎离不开与数据库的交互。两种流行的解决方案——关系型数据库 PostgreSQL 和文档型数据库 MongoDB——为开发者提供了灵活的数据存储和处理工具。本文将介绍如何连接这两种数据库系统,执行基本的 CRUD 操作,并避免常见错误。所有代码示例均使用 PHP 编写,可直接使用。
通过 PDO 连接 PostgreSQL
在 PHP 中操作 PostgreSQL 时,推荐使用 PDO(PHP 数据对象)扩展。它为不同的数据库系统提供了统一的接口,并通过预处理语句防止 SQL 注入攻击。
请确保已安装 pdo_pgsql 驱动。可以通过 phpinfo() 或以下命令检查:
php -m | grep pdo_pgsql连接本地数据库的示例:
<?php$host = 'localhost';$dbname = 'my_database';$user = 'postgres';$pass = 'secret';
try { $dsn = "pgsql:host=$host;dbname=$dbname"; $pdo = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); echo "PostgreSQL 连接成功!";} catch (PDOException $e) { die("连接错误: " . $e->getMessage());}连接成功后,我们来执行简单的数据查询。创建 users 表并插入几条记录:
<?php// 创建表$pdo->exec("CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)");
// 通过预处理语句插入数据$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");$stmt->execute([':name' => '伊万·彼得罗夫', ':email' => 'ivan@example.com']);echo "用户已添加,ID: " . $pdo->lastInsertId();
// 查询所有用户$users = $pdo->query("SELECT * FROM users")->fetchAll();foreach ($users as $user) { echo "{$user['name']} - {$user['email']}<br>";}通过官方驱动操作 MongoDB
MongoDB 是一种 NoSQL 数据库,以 BSON(二进制 JSON)格式存储数据。PHP 有官方驱动 mongodb,可通过 Composer 与 mongodb/mongodb 库一起安装。
安装命令:
composer require mongodb/mongodb连接 MongoDB 并选择数据库:
<?phprequire 'vendor/autoload.php';
use MongoDB\\Client;
$uri = 'mongodb://localhost:27017';$client = new Client($uri);$collection = $client->my_database->users; // 数据库 my_database,集合 users
echo "MongoDB 连接成功";现在执行 CRUD 操作。在 MongoDB 中,数据以关联数组的形式表示:
<?php// 插入文档$insertResult = $collection->insertOne([ 'name' => '安娜·斯米尔诺娃', 'email' => 'anna@example.com', 'age' => 28, 'tags' => ['php', 'mongodb']]);echo "新文档 ID: " . $insertResult->getInsertedId();
// 按字段查找$user = $collection->findOne(['email' => 'anna@example.com']);echo "姓名: " . $user['name'];
// 更新:添加 "status" 字段$collection->updateOne( ['email' => 'anna@example.com'], ['$set' => ['status' => 'active']]);
// 删除$collection->deleteOne(['email' => 'anna@example.com']);