Maison >base de données >tutoriel mysql >Pourquoi mon instruction préparée PDO échoue-t-elle avec « SQLSTATE[HY093] : numéro de paramètre invalide » lors de l'insertion de plusieurs enregistrements ?

Pourquoi mon instruction préparée PDO échoue-t-elle avec « SQLSTATE[HY093] : numéro de paramètre invalide » lors de l'insertion de plusieurs enregistrements ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-13 00:06:16441parcourir

Why Does My PDO Prepared Statement Fail with

Dépannage d'une erreur SQL lors de l'insertion de plusieurs enregistrements

Dans un effort de développement récent, un extrait de code conçu pour insérer plusieurs enregistrements dans une base de données à l'aide d'un La déclaration préparée par PDO a rencontré une erreur :

SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

Malgré l'apparente équivalence dans le nombre de valeurs à insérer (count($matches)) et le nombre d'espaces réservés (count($values)), l'exécution de la requête a échoué.

Cause première

L'erreur provenait d'un idée fausse sur l'initialisation du tableau $values. Contrairement à $matches, qui contenait initialement un tableau vide, $values ​​était renseigné avec des valeurs non initialisées. Par conséquent, $values ​​contenait un nombre supérieur à $matches, ce qui entraînait une erreur de non-concordance des paramètres.

Résolution

Pour résoudre ce problème, il est crucial de explicitement initialisez $values ​​sous forme de tableau vide avant d'entrer dans la boucle :

$matches = array('1');
$count = count($matches);
$values = [];
for($i = 0; $i < $count; ++$i) {
    $values[] = '(?)';
}

Avec cette modification, les nombres de $matches et $values ​​correspondront, permettant la requête à exécuter avec succès.

Considérations supplémentaires

De plus, il est conseillé de s'assurer que la colonne de hachage dans la table cible a un index unique pour gérer la clé en double conflits. Ceci peut être réalisé en ajoutant la ligne suivante après l'instruction INSERT :

ON DUPLICATE KEY UPDATE hash=values(hash)

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