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() を次にコールする前に 結果セット内の全てのデータを取得しない場合、そのコールは失敗します。 PDOStatement::closeCursor() をコールし、 次に PDO::query() をコールする前に PDOStatement オブジェクトに関連付けられたリソースを解放してください。
注意:
query
にプレースホルダーが含まれている場合、 準備と実行は別々に行う必要があります。 つまり、PDO::prepare() を使って準備し、 PDOStatement::execute() を実行しなければいけません。
query
準備、発行する SQL ステートメント。
SQL にプレースホルダーが含まれている場合、 PDO::prepare() と PDOStatement::execute() を代わりに使う必要があります。 それとは別のやり方として、 PDO::query() を呼び出す前に、 PDO::quote() を使って適切にフォーマットしたデータを使って 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
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);
?>
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");
}
?>
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);
?>
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
> 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);
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;