Maison >développement back-end >tutoriel php >Pourquoi est-ce que j'obtiens l'erreur SQLSTATE[HY093] « Numéro de paramètre invalide » dans Yii et comment puis-je la corriger ?

Pourquoi est-ce que j'obtiens l'erreur SQLSTATE[HY093] « Numéro de paramètre invalide » dans Yii et comment puis-je la corriger ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-25 20:48:11159parcourir

Why Am I Getting the SQLSTATE[HY093]

SQLSTATE[HY093] : Compréhension et résolution de l'erreur « Numéro de paramètre non valide » dans SQL

Lorsque vous travaillez avec des bases de données, vous pouvez rencontrer une erreur message tel que « SQLSTATE[HY093] : numéro de paramètre non valide : le paramètre n'a pas été défini. » Cette erreur indique un problème dans la façon dont les paramètres sont liés à une instruction SQL.

Dans le contexte du modèle d'enregistrement actif de Yii et du DAO (Data Access Object), considérons un scénario spécifique dans lequel cette erreur se produit.

Supposons que vous ayez le code suivant :

$model_person = new TempPerson();
$model = $model_person->find('alias=:alias', array(':alias' => $_GET['alias']));
$connection = Yii::app()->db2;
$sql = "INSERT INTO users (username, password, ssn, surname, firstname, email, city, country) VALUES(:alias, :password, :ssn, :surname, :firstname, :email, :city, :country)";
$command = $connection->createCommand($sql);
$command->bindValue(":username", $model->alias);
$command->bindValue(":password", substr($model->ssn, -4, 4));
$command->bindValue(":ssn", $model->ssn);
$command->bindValue(":surname", $model->lastName);
$command->bindValue(":firstname", $model->firstName);
$command->bindValue(":email", $model->email);
$command->bindValue(":city", $model->placeOfBirth);
$command->bindValue(":country", $model->placeOfBirth);
$command->execute();

Ce code tente d'insérer un enregistrement dans la table "utilisateurs" en fonction des attributs du Objet modèle $. Cependant, la requête générée et enregistrée dans le journal de l'application apparaît comme suit :

INSERT INTO users (username, password, ssn, surname, firstname, email, city, country) VALUES(:alias, :password, :ssn, :surname, :firstname, :email, :city, :country);

Comparez la requête ci-dessus avec les noms de paramètres dans les appels bindValue(). Notez que le nom du paramètre permettant de lier la valeur du nom d'utilisateur est ":username", et non ":alias" comme spécifié dans l'instruction SQL. Yii interprète cet écart comme « un paramètre court », conduisant à l'erreur « SQLSTATE[HY093] ».

Pour résoudre ce problème, assurez-vous que les noms de paramètres dans l'instruction SQL correspondent exactement à ceux utilisés dans bindValue. () méthode. Dans ce cas, remplacez le nom du paramètre dans l'instruction SQL par ":username."

Voici quelques causes courantes supplémentaires de l'erreur "SQLSTATE[HY093]" :

  • Oubli pour ajouter un bindValue() pour un paramètre spécifié.
  • Caractères invalides dans le nom de l'espace réservé.
  • Conflits entre la pagination et le tri de CDataProvider lors de l'utilisation de jointures dans des requêtes complexes.

Pour résoudre efficacement ces problèmes, activez la journalisation des paramètres dans votre fichier de configuration Yii en ajoutant :

'enableParamLogging' => true,

à la base de données tableau. Cela fournira des informations détaillées sur la requête SQL et les paramètres liés, facilitant ainsi l'identification et la correction des erreurs.

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