Maison >base de données >tutoriel mysql >Pourquoi ma requête à insertion multiple renvoie-t-elle une erreur « Numéro de paramètre non valide » malgré le nombre de paramètres correspondant ?

Pourquoi ma requête à insertion multiple renvoie-t-elle une erreur « Numéro de paramètre non valide » malgré le nombre de paramètres correspondant ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-28 01:46:09153parcourir

Why Does My Multiple Insert Query Throw an

Gestion des erreurs : "Numéro de paramètre non valide" dans une requête à insertion multiple

Lorsque vous essayez d'effectuer une requête à insertion multiple, il est crucial de vous assurer que le nombre de valeurs de paramètres correspond au nombre d'espaces réservés dans la requête elle-même. Cependant, le code suivant rencontre l'erreur « SQLSTATE[HY093] : numéro de paramètre non valide : le paramètre n'a pas été défini », malgré la confirmation que count($matches) et count($values) sont égaux juste avant l'exécution de la requête.

// BUILD VALUES
$count = count($matches);
for($i = 0; $i < $count; ++$i) {
    $values[] = '(?)';
}
// INSERT INTO DATABASE
$q = $this->dbc->prepare("INSERT INTO hashes (hash) VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE hash = hash");
$q->execute($matches);

L'écart entre le code et le message d'erreur provient d'un problème potentiel lors de l'initialisation du tableau $values. Il est probable que $values ​​contienne déjà des données, ce qui entraîne une incompatibilité de nombre. Pour éviter cela, il est essentiel de toujours initialiser les tableaux avant la boucle.

Pour résoudre le problème, considérez le code modifié suivant :

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

// INSERT INTO DATABASE
$sql = "INSERT INTO hashes (hash) VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE hash=values(hash)";
$stmt = $dbh->prepare($sql);
$data = $stmt->execute($matches);

De plus, pour éviter le "Numéro de paramètre invalide" erreur dans plusieurs requêtes d'insertion, assurez-vous que la colonne utilisée pour les mises à jour de clés en double (dans ce cas, le hachage) a un index unique défini. Ne pas le faire peut entraîner un comportement inattendu et des erreurs potentielles.

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