Maison >base de données >tutoriel mysql >Pourquoi ma déclaration préparée par PHP PDO renvoie-t-elle « SQLSTATE[HY093] : numéro de paramètre invalide » ?
Le débogage d'une PHP PDOException peut être difficile, surtout lorsque rencontrer l'erreur « SQLSTATE[HY093] : numéro de paramètre non valide ». Cette erreur indique souvent une utilisation incorrecte des paramètres nommés dans une instruction préparée.
Considérez le code PHP suivant :
function add_persist($db, $user_id) { $hash = md5("per11".$user_id."sist11".time()); $future = time()+(60*60*24*14); $sql = "INSERT INTO persist (user_id, hash, expire) VALUES (:user_id, :hash, :expire) ON DUPLICATE KEY UPDATE hash=:hash"; $stm = $db->prepare($sql); $stm->execute(array(":user_id" => $user_id, ":hash" => $hash, ":expire" => $future)); return $hash; }
Lors de l'exécution de cette fonction, l'erreur "SQLSTATE[HY093] : Invalid numéro de paramètre" peut survenir. La cause première réside dans la ligne où la méthodeexecute() est appelée. Plus précisément, la clause ON DUPLICATE KEY UPDATE hash=:hash utilise le même nom de paramètre, ":hash", pour les opérations d'insertion et de mise à jour.
Pour résoudre ce problème, vous devez fournir un nom de paramètre unique. pour la valeur de hachage dans la clause de mise à jour. Voici le code corrigé :
$sql = "INSERT INTO persist (user_id, hash, expire) VALUES (:user_id, :hash, :expire) ON DUPLICATE KEY UPDATE hash=:hash2"; $stm->execute( array(":user_id" => $user_id, ":hash" => $hash, ":expire" => $future, ":hash2" => $hash) );
En fournissant un nom de paramètre unique, ":hash2", pour la valeur de hachage dans la clause de mise à jour, vous résolvez l'erreur "SQLSTATE[HY093] : numéro de paramètre non valide". Cela garantit que le pilote PDO peut mapper correctement les paramètres à l'instruction SQL préparée.
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!