Maison >développement back-end >tutoriel php >Comment puis-je exécuter plusieurs requêtes dans une seule instruction PDO avec PDO_MYSQL et PDO_MYSQLND ?

Comment puis-je exécuter plusieurs requêtes dans une seule instruction PDO avec PDO_MYSQL et PDO_MYSQLND ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-24 07:10:17167parcourir

How Can I Execute Multiple Queries in a Single PDO Statement with PDO_MYSQL and PDO_MYSQLND?

Prise en charge PDO de plusieurs requêtes avec PDO_MYSQL et PDO_MYSQLND

Bien que PDO n'autorise généralement pas plusieurs requêtes dans une seule instruction, les extensions PDO_MYSQL et PDO_MYSQLND fournissent une prise en charge pour cela. fonctionnalité.

PDO_MYSQLND a depuis remplacé PDO_MYSQL dans PHP 5.3, PDO_MYSQL restant comme pilote par défaut pour MySQL PDO. Pour exécuter plusieurs requêtes avec PDO, les conditions suivantes doivent être remplies :

  • PHP version 5.3 ou supérieure
  • Pilote natif MySQL (mysqlnd) activé
  • Instructions préparées émulées , avec PDO::ATTR_EMULATE_PREPARES défini sur 1 (valeur par défaut pour MySQL)

Utilisation de exec()

La méthode exec() peut exécuter plusieurs requêtes lorsque :

$db = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);

$sql = "DELETE FROM car; INSERT INTO car(name, type) VALUES ('car1', 'coupe'); INSERT INTO car(name, type) VALUES ('car2', 'coupe');";

$db->exec($sql);

Cette méthode est limitée à l'exécution d'instructions SQL avec valeurs constantes.

Utilisation d'instructions préparées

Lorsque les données proviennent de variables PHP, les instructions préparées doivent être utilisé :

$db = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "DELETE FROM car; INSERT INTO car(name, type) VALUES (:car1, :type1); INSERT INTO car(name, type) VALUES (:car2, :type2);";

$stmt = $db->prepare($sql);
$stmt->execute(["car1" => "brand1", "type1" => "coupe", "car2" => "brand2", "type2" => "coupe"]);

while ($stmt->nextRowset()) {
    echo $db->lastInsertId(); // as an example
}

Cette approche permet la vérification des erreurs et la collecte des résultats de requête par itération sur des ensembles de lignes.

Attention avec les instructions préparées émulées

Lors de l'utilisation d'instructions préparées émulées , assurez-vous que l'encodage dans le DSN (disponible depuis PHP 5.3.6) correspond à l'encodage réel des données. Sinon, il peut y avoir un potentiel d'injection SQL avec certains encodages.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn