Partager via


Exécution d’instruction directe et exécution d’instruction préparée dans le pilote PDO_SQLSRV

Télécharger le pilote PHP

Cette rubrique décrit l’utilisation de l’attribut PDO::SQLSRV_ATTR_DIRECT_QUERY pour spécifier l’exécution d’une instruction directe plutôt que le comportement par défaut, qui est l’exécution d’une instruction préparée. L’utilisation d’une instruction préparée peut entraîner de meilleures performances si l’instruction est exécutée plusieurs fois à l’aide d’une liaison de paramètre.

Notes

Si vous souhaitez envoyer une instruction Transact-SQL directement au serveur sans préparation d’instruction par le pilote, vous pouvez définir l’attribut PDO::SQLSRV_ATTR_DIRECT_QUERY avec PDO::setAttribute (ou en tant qu’option de pilote transmise à PDO::__construct) ou lorsque vous appelez PDO::prepare. Par défaut, la valeur de PDO::SQLSRV_ATTR_DIRECT_QUERY est False (utilisez l’exécution d’instruction préparée).

Si vous utilisez PDO::query, vous pouvez opter pour l’exécution directe. Avant d’appeler PDO::query, appelez PDO::setAttribute et définissez PDO::SQLSRV_ATTR_DIRECT_QUERY sur True. Chaque appel à PDO::query peut être exécuté avec un paramètre différent pour PDO::SQLSRV_ATTR_DIRECT_QUERY.

Si vous utilisez PDO::prepare and PDOStatement::execute pour exécuter une requête plusieurs fois à l’aide de paramètres liés, l’exécution d’une instruction préparée optimise l’exécution de la requête répétée. Dans ce cas, appelez PDO::prepare en définissant PDO::SQLSRV_ATTR_DIRECT_QUERY sur False dans le paramètre du tableau des options du pilote. Si nécessaire, vous pouvez exécuter des instructions préparées en définissant PDO::SQLSRV_ATTR_DIRECT_QUERY sur False.

Après avoir avez appelé PDO::prepare, la valeur PDO::SQLSRV_ATTR_DIRECT_QUERY ne peut pas être modifiée lors de l’exécution de la requête préparée.

Si une requête nécessite la définition du contexte dans une requête précédente, exécutez vos requêtes en définissant PDO::SQLSRV_ATTR_DIRECT_QUERY sur True. Par exemple, si vous utilisez des tables temporaires dans vos requêtes, PDO::SQLSRV_ATTR_DIRECT_QUERY doit avoir la valeur True.

L’exemple suivant montre que lorsque le contexte d’une instruction précédente est requis, vous devez définir PDO::SQLSRV_ATTR_DIRECT_QUERY sur True. Cet exemple utilise des tables temporaires uniquement disponibles pour les instructions suivantes dans votre programme lorsque des requêtes sont exécutées directement.

Notes

Si la requête consiste à appeler une procédure stockée et que des tables temporaires sont utilisées dans cette procédure stockée, utilisez plutôt PDO::exec.

<?php  
   $conn = new PDO('sqlsrv:Server=(local)', '', '');  
   $conn->setAttribute(constant('PDO::SQLSRV_ATTR_DIRECT_QUERY'), true);  
  
   $stmt1 = $conn->query("DROP TABLE #php_test_table");  
  
   $stmt2 = $conn->query("CREATE TABLE #php_test_table ([c1_int] int, [c2_int] int)");  
  
   $v1 = 1;  
   $v2 = 2;  
  
   $stmt3 = $conn->prepare("INSERT INTO #php_test_table (c1_int, c2_int) VALUES (:var1, :var2)");  
  
   if ($stmt3) {  
      $stmt3->bindValue(1, $v1);  
      $stmt3->bindValue(2, $v2);  
  
      if ($stmt3->execute())  
         echo "Execution succeeded\n";       
      else  
         echo "Execution failed\n";  
   }  
   else  
      var_dump($conn->errorInfo());  
  
   $stmt4 = $conn->query("DROP TABLE #php_test_table");  
?>  

Voir aussi

Guide de programmation pour les pilotes Microsoft pour PHP pour SQL Server