Maison  >  Article  >  base de données  >  Comment transmettre un tableau de paramètres PDO avec une clause LIMIT ?

Comment transmettre un tableau de paramètres PDO avec une clause LIMIT ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-24 01:29:29322parcourir

How to Pass an Array of PDO Parameters with a LIMIT Clause?

Passer un tableau de paramètres PDO avec la clause LIMIT

Dans PDO, exécuter une requête avec une clause LIMIT à l'aide d'un tableau de paramètres peut être un défi.

Problème

Considérez le code suivant :

$sql = "SELECT * FROM table WHERE id LIKE CONCAT('%', :id, '%')
LIMIT :limit1, :limit2";

$stmt = $pdo->prepare($sql);
$stmt->execute($array); // Doesn't work

Bien qu'il soit souhaitable d'utiliser l'entrée tableau pour plus de commodité, les paramètres :limit1 et :limit2 ne fonctionneront que s'ils sont liés individuellement :

$stmt->bindParam(':limit1', $limit1, PDO::PARAM_INT);
$stmt->bindParam(':limit2', $limit2, PDO::PARAM_INT);
$stmt->execute(); // Still doesn't work

Solution

Le problème réside dans le paramètre par défaut de PDO de PDO::ATTR_EMULATE_PREPARES sur true. Ce paramètre amène PHP à émuler les instructions préparées au lieu d'utiliser les instructions préparées MySQL natives, ce qui empêche la liaison correcte des paramètres LIMIT.

Pour résoudre ce problème, désactivez l'émulation en définissant l'attribut sur false :

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Une fois l'émulation désactivée, l'entrée du tableau peut être utilisée pour exécuter la requête correctement :

$stmt = $pdo->prepare($sql);
$stmt->execute($array); // Works!

Considérations sur les performances

Notez que la désactivation de l'émulation peut avoir un impact sur les performances, en tant que natif les instructions préparées sont plus efficaces dans certains scénarios. Cependant, pour les requêtes qui nécessitent des clauses LIMIT dynamiques, c'est la solution la plus fiable.

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