PHP PDO::query 方法
最后修改于 2025 年 4 月 19 日
PDO::query 方法执行一条 SQL 语句,并以 PDOStatement 对象的形式返回结果集。它最适合不需要参数的 SELECT 语句。
基本定义
PDO::query 在单次函数调用中执行一条 SQL 语句。它以 PDOStatement 对象的形式返回结果集。此方法适用于一次性查询。
语法:public PDO::query(string $query, ?int $fetchMode = null): PDOStatement|false。$query 参数包含要执行的 SQL。$fetchMode 可选地设置获取模式。
基本 SELECT 查询
此示例演示了使用 PDO::query 的简单 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->query('SELECT id, name, email FROM users');
foreach ($stmt as $row) {
echo "ID: {$row['id']}, Name: {$row['name']}, Email: {$row['email']}\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这会执行一个 SELECT 查询并遍历结果。query 方法返回一个 PDOStatement 对象。我们可以直接使用 foreach 遍历它。
带获取模式的查询
这展示了如何在 query 方法中直接指定获取模式。
<?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->query('SELECT id, name FROM users', PDO::FETCH_ASSOC);
while ($row = $stmt->fetch()) {
echo "ID: {$row['id']}, Name: {$row['name']}\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
在这里,我们将 PDO::FETCH_ASSOC 指定为获取模式。这使得 fetch 方法将结果作为关联数组返回。该模式适用于所有后续的获取。
带对象获取模式的查询
这演示了如何使用 PDO::query 将结果作为对象获取。
<?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->query('SELECT id, name FROM users', PDO::FETCH_OBJ);
while ($user = $stmt->fetch()) {
echo "ID: {$user->id}, Name: {$user->name}\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
使用 PDO::FETCH_OBJ 可使 fetch 返回 stdClass 对象。我们使用对象运算符(->)访问属性。这对于面向对象的代码很有用。
带获取全部的查询
此示例展示了如何使用 fetchAll 一次性检索所有结果。
<?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->query('SELECT id, name, email FROM users');
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
echo "ID: {$user['id']}, Name: {$user['name']}\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
fetchAll 将所有行一次性检索到一个数组中。这对于小型结果集很方便。对于大型数据集,请考虑逐行获取。
带列数的查询
这演示了如何从查询结果中获取列信息。
<?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->query('SELECT id, name, email FROM users');
echo "Column count: " . $stmt->columnCount() . "\n";
for ($i = 0; $i < $stmt->columnCount(); $i++) {
$meta = $stmt->getColumnMeta($i);
echo "Column {$i}: {$meta['name']} ({$meta['native_type']})\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
columnCount 返回结果集中的列数。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->query('SELECT name, email FROM users WHERE id = 1');
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Name: {$user['name']}, Email: {$user['email']}\n";
} else {
echo "User not found\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
当您只需要一行时,fetch 只获取那一行。这比 fetchAll 用于单行结果更有效。始终检查结果是否存在。
带行数的查询
这演示了如何获取查询返回的行数。
<?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->query('SELECT id, name FROM users');
$rowCount = $stmt->rowCount();
echo "Number of rows: $rowCount\n";
if ($rowCount > 0) {
foreach ($stmt as $row) {
echo "ID: {$row['id']}, Name: {$row['name']}\n";
}
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
rowCount 返回最后一条语句影响的行数。对于 SELECT 语句,它可能无法与所有数据库驱动程序一起使用。请检查您的驱动程序文档。
最佳实践
- 用于简单查询: PDO::query 最适合静态 SQL。
- 预处理语句: 对用户输入使用 prepare/execute。
- 错误处理: 始终对 PDO 操作使用 try-catch。
- 获取模式: 选择最适合您需求的模式。
- 资源清理: 让 PDO 自动关闭语句。
来源
本教程涵盖了 PDO::query 方法,并提供了实际示例,展示了在 PHP 中执行和处理 SQL 查询的各种方法。
作者
列出 所有 PHP PDO 函数。