The handling of errors by this function is controlled by the attribute PDO::ATTR_ERRMODE.
Use the following to make it throw an exception:
<?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_*
常量之一。
If this argument is passed to the function, the remaining arguments will be treated as though PDOStatement::setFetchMode() was called on the resultant statement object. The subsequent arguments vary depending on the selected fetch mode.
返回 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
The handling of errors by this function is controlled by the attribute PDO::ATTR_ERRMODE.
Use the following to make it throw an exception:
<?php
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
When you make a wraper for PDO:query, you must define the method like this:
public function query( string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs) : \PDOStatement|false
if you delete one of the parameters or use one of the oficials parameters you get a Fatal error
Trying to pass like second argument PDO::FETCH_ASSOC it still work.
So passing FETCH TYPE like argument seems work.
This save you from something like:
<?php
$result = $stmt->setFetchMode(PDO::FETCH_NUM);
?>
Example:
<?php
$res = $db->query('SELECT * FROM `mytable` WHERE true', PDO::FETCH_ASSOC);
?>
After a lot of hours working with DataLink on Oracle->MySQL and PDO we (me and Adriano Rodrigues, that solve it) discover that PDO (and oci too) need the attribute AUTOCOMMIT set to FALSE to work correctly with.
There's 3 ways to set autocommit to false: On constructor, setting the atribute after construct and before query data or initiating a Transaction (that turns off autocommit mode)
The examples:
<?php
// First way - On PDO Constructor
$options = array(PDO::ATTR_AUTOCOMMIT=>FALSE);
$pdo = new PDO($dsn,$user,$pass,$options);
// now we are ready to query DataLinks
?>
<?php
// Second Way - Before create statements
$pdo = new PDO($dsn,$user,$pass);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,FALSE);
// or
$pdo->beginTransaction();
// now we are ready to query DataLinks
?>
To use DataLinks on oci just use OCI_DEFAULT on oci_execute() function;
I would like to mention fetching rows from SQL query using PDO:
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// use the connection here
$sth = $dbh->query('SELECT * FROM countries');
// fetch all rows into array, by default PDO::FETCH_BOTH is used
$rows = $stm->fetchAll();
// iterate over array by index and by name
foreach($rows as $row) {
printf("$row[0] $row[1] $row[2]\n");
printf("$row['id'] $row['name'] $row['population']\n");
}
?>
> When query() fails, the boolean false is returned.
I think that is "Silent Mode".
If that set attribute ErrorMode "Exception Mode"
then that throw PDOException.
$pdoObj = new PDO( $dsn, $user, $pass );
$pdoObj->setAttribute("PDO::ATTR_ERRMODE", PDO::ERRMODE_EXCEPTION);