PDO::query

(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)

PDO::query Exécute une requête SQL, retourne un jeu de résultats en tant qu'objet PDOStatement

Description

public PDOStatement PDO::query ( string $statement )
public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_COLUMN , int $colno )
public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_CLASS , string $classname , array $ctorargs )
public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_INTO , object $object )

PDO::query() exécute une requête SQL en appelant une seule fonction, retourne le jeu de résultats (s'il y en a) retourné par la requête en tant qu'objet PDOStatement.

Pour une requête que vous devez exécuter plusieurs fois, vous réaliserez de meilleurs performances si vous préparez l'objet PDOStatement en utilisant la fonction PDO::prepare() et exécutez la requête via plusieurs appels à la fonction PDOStatement::execute().

Si vous ne récupérez pas toutes les données du jeu de résultats avant d'exécuter le prochain appel à PDO::query(), votre appel peut échouer. Appeler PDOStatement::closeCursor() pour libérer les ressources de la base de données associées à l'objet PDOStatement avant d'exécuter votre prochain appel à la fonction PDO::query().

Note:

Bien que la documentation de cette fonction autorise de passer un seul paramètre, vous pouvez y passer d'autres paramètres. Ils seront traités via l'appel à PDOStatement::setFetchMode() sur le résultat du traitement de l'objet.

Liste de paramètres

statement

La requête SQL à préparer et à exécuter.

Les données contenues dans la requête doivent être échappées proprement.

Valeurs de retour

PDO::query() retourne un objet PDOStatement, ou FALSE si une erreur survient.

Exemples

Exemple #1 Exemple avec PDO::query

Une fonctionnalité intéressante de PDO::query() est qu'il vous permet d'itérer à travers un jeu de résultats retourné par une requête SELECT exécutée avec succès.

<?php
function getFruit($conn) {
    
$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";
  }
}
?>

L'exemple ci-dessus va afficher :

apple   red     150
banana  yellow  250
kiwi    brown   75
lemon   yellow  25
orange  orange  300
pear    green   150
watermelon      pink    90

Voir aussi

add a note add a note

User Contributed Notes 9 notes

up
10
fredrik at NOSPAM dot rambris dot com
7 years ago
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);
?>
up
1
stefano[dot]bertoli [at] gmail[dot]com
2 months ago
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);

?>
up
1
paolo at dellunto dot net
1 year ago
If you are using PDO to create an SQLite dbfile that will be used by an Android application, you can set common values via the $dbh->query("PRAGMA ...") statement;

a tipical example would be the user_version of the database or the page_size
<?php
...
$dbh = new PDO($PDO_DSN, null, null, null);
$dbh->query("PRAGMA page_size = 4096"); //Android match page size
$dbh->query("PRAGMA user_version = 2"); //This match super(context, DB_NAME, null, DB_VERSION) of the DatabaseOpenHelper
....
?>
up
2
marcos at marcosregis dot com
6 years ago
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;
up
1
dozoyousan at gmail dot com
8 years ago
> 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);
up
2
jonmsawyer at gmail dot com
7 years ago
@ dozoyousan at gmail dot com
> 03-May-2006 05:26
> > 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);

What you say is correct, however, your PHP code is incorrect:

<?php
   
// This is fine
   
$pdoObj = new PDO( $dsn, $user, $pass );
   
   
// This line is wrong
   
$pdoObj->setAttribute("PDO::ATTR_ERRMODE", PDO::ERRMODE_EXCEPTION);
   
   
// It should be:
   
$pdoObj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   
   
// Parameter 1 should not be in quotes. PHP interprets
    // that as a string. Instead, internally, its represented
    // as type LONG INT. Try it :)
?>

Hope this helps. Cheers.
up
2
nicobn at gmail dot com
7 years ago
Please note that when Query() fails, it does not return a PDOStatement object . It simply returns false.
up
-3
andrea at bhweb dot it
6 years ago
If someone is suffering of the "MySQL server has gone away" problem after executing multiple queries, this is a solution that solved it for me. It's similar to the one needed for the exact same problem in mysqli.

<?php
$stmt
=$db->prepare($query);
$stmt->execute();
do {
$stmt->fetch(); $stmt->closeCursor(); ++$line; } while($stmt-
>
nextRowset());
?>

I found this only works using prepare and execute this way, not if you
directly execute the query with query().
up
-13
NUNTIUS
6 years ago
I found this method extremely useful for getting the iteration count. Note the usage of "for" instead of "while" or "foreach". Just place the "$row = $query->fetch()" as the second condition of your for loop (which is do until). This is the best of both worlds IMHO. Criticism welcome.

try {
    $hostname = "servername";
    $dbname = "dbname";
    $username = "username";
    $pw = "password";
    $pdo = new PDO ("mssql:host=$hostname;dbname=$dbname","$username","$pw");
  } catch (PDOException $e) {
    echo "Failed to get DB handle: " . $e->getMessage() . "\n";
    exit;
  }
      $query = $pdo->prepare("select name FROM tbl_name");
      $query->execute();
     
      for($i=0; $row = $query->fetch(); $i++){
        echo $i." - ".$row['name']."<br/>";
      }

      unset($pdo);
      unset($query);
To Top