PHP PDOStatementInterface
最后修改于 2025 年 4 月 19 日
PHP 中的 PDOStatementInterface 代表预处理语句及其结果。它提供了执行查询和获取数据的方法。
基本定义
PDOStatementInterface 是一个定义预处理语句方法的接口。它由 PDOStatement 类实现。
主要方法包括 execute、fetch、fetchAll、bindParam 和 bindValue。这些方法负责查询执行和结果处理。
PDOStatement 的基本用法
此示例展示了 PDOStatement 的基本预处理语句用法。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([1]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($user);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这会创建一个预处理语句,用一个参数执行它,并获取结果。fetch 方法将数据作为关联数组返回。
绑定参数
这演示了使用 PDOStatement 进行显式参数绑定。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('INSERT INTO products (name, price) VALUES (:name, :price)');
$name = 'Laptop';
$price = 999.99;
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':price', $price, PDO::PARAM_STR);
$stmt->execute();
echo "Product inserted successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
此代码使用 bindParam 将变量显式绑定到参数。第三个参数指定数据类型。值按引用绑定。
获取多行
这展示了如何使用 PDOStatement 获取多行。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM products WHERE price > ?');
$stmt->execute([500]);
$products = $stmt->fetchAll(PDO::FETCH_OBJ);
foreach ($products as $product) {
echo "{$product->name}: {$product->price}\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这会将匹配条件的所有行作为对象获取。fetchAll 一次检索完整的记录集。FETCH_OBJ 返回 stdClass 对象。
列绑定
这演示了将结果列绑定到 PHP 变量。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT name, email FROM users WHERE id = ?');
$stmt->execute([1]);
$stmt->bindColumn('name', $name);
$stmt->bindColumn('email', $email);
if ($stmt->fetch(PDO::FETCH_BOUND)) {
echo "Name: $name, Email: $email";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这会将结果列绑定到变量。当使用 FETCH_BOUND 调用 fetch 时,变量会自动填充。列名必须与查询匹配。
行计数
这展示了如何获取语句影响的行数。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('UPDATE products SET price = price * 1.1 WHERE category = ?');
$stmt->execute(['Electronics']);
$count = $stmt->rowCount();
echo "Updated $count products";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
rowCount 返回最后一条语句影响的行数。对于 SELECT 语句,行为可能因数据库驱动程序而异。
获取列元数据
这演示了从结果集中检索列信息。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM products LIMIT 1');
$stmt->execute();
$meta = $stmt->getColumnMeta(0);
print_r($meta);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
getColumnMeta 返回一个包含结果列信息的数组。这些信息包括名称、类型、表和其他特定于驱动程序的详细信息。
设置获取模式
这展示了如何为语句设置默认获取模式。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM users');
$stmt->setFetchMode(PDO::FETCH_CLASS, 'User');
$stmt->execute();
$users = $stmt->fetchAll();
foreach ($users as $user) {
echo $user->getName();
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
setFetchMode 配置结果的获取方式。此示例获取 User 类实例。类必须在使用前定义。
最佳实践
- 始终使用预处理语句以防止 SQL 注入
- 将错误模式设置为异常以获得更好的错误处理
- 完成后使用 closeCursor() 关闭游标
- 使用适合您数据结构的获取模式
- 显式绑定参数以处理复杂查询
来源
本教程介绍了 PDOStatementInterface,并通过实际示例展示了不同场景下的数据库操作。
作者
列出 所有 PHP PDO 函数。