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 函数。