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
9 年前
尝试将 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
15 年前
在花了大量时间研究 Oracle->MySQL 和 PDO 的 DataLink 后,我们(我和 Adriano Rodrigues,他解决了这个问题)发现 PDO(以及 oci)需要将 AUTOCOMMIT 属性设置为 FALSE 才能正常工作。
有三种方法可以将 autocommit 设置为 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。

我认为这是“静默模式”。
如果设置了属性 ErrorMode 为“异常模式”
那么它将抛出 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
9 个月前
当您为 PDO:query 创建一个包装器时,您必须像这样定义该方法

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

如果您删除其中一个参数或使用其中一个官方参数,您将收到一个致命错误
To Top