Maison >base de données >tutoriel mysql >Comment transmettre un tableau de paramètres PDO avec une 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.
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
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!
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!