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 — Bereitet eine SQL-Anweisung ohne Platzhalter vor und führt sie aus
$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|falseMit PDO::query() wird eine SQL-Anweisung in einem einzigen Funktionsaufruf vorbereitet und ausgeführt und die Anweisung als PDOStatement-Objekt zurückgegeben.
Bei einer Abfrage, die mehrmals ausgeführt werden soll, wird die Effizienz verbessert, indem ein PDOStatement-Objekt mit PDO::prepare() vorbereitet und die Anweisung mit mehreren Aufrufen von PDOStatement::execute() ausgeführt wird.
Wenn vor dem nächsten Aufruf von PDO::query() nicht alle Daten einer Ergebnismenge abgerufen werden, schlägt der Aufruf möglicherweise fehl. Deshalb sollten die mit dem PDOStatement-Objekt verbundenen Datenbankressourcen mittels PDOStatement::closeCursor() freigegeben werden, bevor PDO::query() erneut aufgerufen wird.
Hinweis:
Wenn
query
Platzhalter enthält, muss die Anweisung mit der Methode PDO::prepare() vorbereitet und mit der Methode PDOStatement::execute() ausgeführt werden.
query
Die SQL-Anweisung, die vorbereitet und ausgeführt werden soll
Wenn das SQL Platzhalter enthält, müssen stattdessen die Methoden PDO::prepare() und PDOStatement::execute() verwendet werden. Wenn es der Treiber unterstützt, kann das SQL alternativ mittels PDO::quote() mit korrekt formatierten Daten manuell vorbereitet werden, bevor PDO::query() aufgerufen wird.
fetchMode
Der voreingestellte Abrufmodus für das zurückgegebene
PDOStatement. Es muss eine der
PDO::FETCH_*
-Konstanten
sein.
Wenn dieses Argument an die Funktion übergeben wird, werden die restlichen Argumente so behandelt, als ob PDOStatement::setFetchMode() für das resultierende Anweisungsobjekt aufgerufen wurde. Die nachfolgenden Argumente hängen vom gewählten Abrufmodus ab.
Gibt ein PDOStatement-Objekt zurück.
Bei einem Fehler wird false
zurückgegeben.
Gibt einen Fehler der Stufe E_WARNING
aus, wenn das Attribut PDO::ATTR_ERRMODE
auf PDO::ERRMODE_WARNING
gesetzt ist.
Löst eine PDOException aus, wenn das Attribut PDO::ATTR_ERRMODE
auf PDO::ERRMODE_EXCEPTION
gesetzt ist.
Beispiel #1 SQL ohne Platzhalter kann mit PDO::query() ausgeführt werden
<?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";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
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);
?>
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;
> 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);
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 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