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 » ?

Pourquoi ma déclaration préparée par PHP PDO renvoie-t-elle « SQLSTATE[HY093] : numéro de paramètre invalide » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-16 08:48:16865parcourir

Why Does My PHP PDO Prepared Statement Throw

PHP PDOException : "SQLSTATE[HY093] : Invalid Parameter Number"

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!

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