此函数的错误处理由属性 PDO::ATTR_ERRMODE 控制。
使用以下方法使其抛出异常
<?php
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)
PDO::query — 准备并执行没有占位符的 SQL 语句
$query
, ?int $fetchMode
= PDO::FETCH_COLUMN, int $colno
): PDOStatement|false$query
,$fetchMode
= PDO::FETCH_CLASS,$classname
,$constructorArgs
$query
, ?int $fetchMode
= PDO::FETCH_INTO, object $object
): PDOStatement|falsePDO::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
此函数的错误处理由属性 PDO::ATTR_ERRMODE 控制。
使用以下方法使其抛出异常
<?php
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
尝试将 PDO::FETCH_ASSOC 作为第二个参数传递,它仍然有效。
因此,将 FETCH 类型作为参数传递似乎有效。
这将您从类似以下内容中解放出来
<?php
$result = $stmt->setFetchMode(PDO::FETCH_NUM);
?>
示例
<?php
$res = $db->query('SELECT * FROM `mytable` WHERE true', PDO::FETCH_ASSOC);
?>
在花了大量时间研究 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 即可;
> 当 query() 失败时,将返回布尔值 false。
我认为这是“静默模式”。
如果设置了属性 ErrorMode 为“异常模式”
那么它将抛出 PDOException。
$pdoObj = new PDO( $dsn, $user, $pass );
$pdoObj->setAttribute("PDO::ATTR_ERRMODE", PDO::ERRMODE_EXCEPTION);
我想提一下使用 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");
}
?>