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