PHP Conference Japan 2024

PDO::query

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDO::query 准备并执行不带占位符的 SQL 语句

描述

public PDO::query(string $query, ?int $fetchMode = null): PDOStatement|false
public PDO::query(string $query, ?int $fetchMode = PDO::FETCH_COLUMN, int $colno): PDOStatement|false
public PDO::query(
    string $query,
    ?int $fetchMode = PDO::FETCH_CLASS,
    string $classname,
    array $constructorArgs
): PDOStatement|false
public PDO::query(string $query, ?int $fetchMode = PDO::FETCH_INTO, object $object): PDOStatement|false

PDO::query() 在单个函数调用中准备并执行 SQL 语句,并将语句作为 PDOStatement 对象返回。

对于您需要多次执行的查询,如果您使用 PDO::prepare() 准备 PDOStatement 对象,并使用对 PDOStatement::execute() 的多次调用来发出语句,您将获得更好的性能。

如果您在发出对 PDO::query() 的下一次调用之前没有提取结果集中的所有数据,则您的调用可能会失败。在发出对 PDO::query() 的下一次调用之前,调用 PDOStatement::closeCursor() 以释放与 PDOStatement 对象关联的数据库资源。

注意:

如果 query 包含占位符,则必须使用 PDO::prepare()PDOStatement::execute() 方法分别准备和执行语句。

参数

query

要准备和执行的 SQL 语句。

如果 SQL 包含占位符,则必须改用 PDO::prepare()PDOStatement::execute()。或者,可以在调用 PDO::query() 之前手动准备 SQL,如果驱动程序支持,则使用 PDO::quote() 正确格式化数据。

fetchMode

返回的 PDOStatement 的默认提取模式。它必须是 PDO::FETCH_* 常量之一。

如果将此参数传递给函数,则其余参数将被视为对结果语句对象调用了 PDOStatement::setFetchMode()。后续参数根据所选的提取模式而有所不同。

返回值

返回一个 PDOStatement 对象或在失败时返回 false

错误/异常

如果属性 PDO::ATTR_ERRMODE 设置为 PDO::ERRMODE_WARNING,则发出级别为 E_WARNING 的错误。

如果属性 PDO::ATTR_ERRMODE 设置为 PDO::ERRMODE_EXCEPTION,则抛出 PDOException

示例

示例 #1 不带占位符的 SQL 可以使用 PDO::query() 执行

<?php
$sql
= 'SELECT name, color, calories FROM fruit ORDER BY name';
foreach (
$conn->query($sql) as $row) {
print
$row['name'] . "\t";
print
$row['color'] . "\t";
print
$row['calories'] . "\n";
}
?>

以上示例将输出

apple   red     150
banana  yellow  250
kiwi    brown   75
lemon   yellow  25
orange  orange  300
pear    green   150
watermelon      pink    90

参见

添加注释

用户贡献的笔记 6 条笔记

fredrik at NOSPAM dot rambris dot com
17 年前
此函数的错误处理由属性 PDO::ATTR_ERRMODE 控制。

使用以下方法使其抛出异常
<?php
$dbh
->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
stefano[dot]bertoli [at] gmail[dot]com
10 年前
尝试将 PDO::FETCH_ASSOC 作为第二个参数传递,它仍然有效。

因此,将 FETCH 类型作为参数传递似乎有效。

这可以节省您类似以下操作

<?php
$result
= $stmt->setFetchMode(PDO::FETCH_NUM);
?>

示例
<?php
$res
= $db->query('SELECT * FROM `mytable` WHERE true', PDO::FETCH_ASSOC);

?>
marcos at marcosregis dot com
16 年前
在使用 Oracle->MySQL 和 PDO 上的 DataLink 工作了几个小时后,我们(我和 Adriano Rodrigues,他解决了这个问题)发现 PDO(以及 oci)需要将属性 AUTOCOMMIT 设置为 FALSE 才能正常工作。


设置自动提交为 false 有三种方法:在构造函数中设置、在构造之后和查询数据之前设置属性,或启动事务(这会关闭自动提交模式)。

示例
<?php
// 第一种方法 - 在 PDO 构造函数中
$options = array(PDO::ATTR_AUTOCOMMIT=>FALSE);

$pdo = new PDO($dsn,$user,$pass,$options);

// 现在可以查询 DataLinks 了

?>

<?php
// 第二种方法 - 在创建语句之前
$pdo = new PDO($dsn,$user,$pass);

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,FALSE);
// 或者
$pdo->beginTransaction();

// 现在可以查询 DataLinks 了
?>

要在 oci 上使用 DataLinks,只需在 oci_execute() 函数中使用 OCI_DEFAULT;
dozoyousan at gmail dot com
18 年前
> 当 query() 失败时,会返回布尔值 false。

我认为这是“静默模式”。
如果设置了错误模式为“异常模式”
那么它会抛出 PDOException。
$pdoObj = new PDO( $dsn, $user, $pass );
$pdoObj->setAttribute("PDO::ATTR_ERRMODE", PDO::ERRMODE_EXCEPTION);
Ilyas Bakirov
3 年前
我想提一下使用 PDO 从 SQL 查询中获取行

<?php

$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass);

// 在此处使用连接
$sth = $dbh->query('SELECT * FROM countries');

// 将所有行获取到数组中,默认情况下使用 PDO::FETCH_BOTH
$rows = $stm->fetchAll();

// 通过索引和名称迭代数组
foreach($rows as $row) {

printf("$row[0] $row[1] $row[2]\n");
printf("$row['id'] $row['name'] $row['population']\n");

}
?>
JJimenez
1 年前
当为 PDO:query 创建包装器时,必须像这样定义方法

public function query( string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs) : \PDOStatement|false

如果删除其中一个参数或使用其中一个官方参数,则会发生致命错误
To Top