Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: paramètre n'est pas défini dans...filetext

$champs est un tableau qui après l'impression obtient des valeurs comme:

Array ( [first_name] => Nisse [last_name] => Example [ssn] => 198306205053 [address] =>           Stockholm, Sverige [phone_number] => 54654987321546 [latitude] => 55.717089999999999 [longitude] => 13.235379 )

J'appelle la fonction de mise à jour de mon dataclass comme suit:

DataManager::update_user($fields, $user_data['id'];

Mais j'obtiens l'erreur:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: paramètre n'est pas défini dans...filetext

J'ai vérifié plusieurs autres semblables threads, mais je suppose que Im manque quelques concept de base ici parce que je peux pas trouver la réponse. Il y a 7 ?'s et 7 éléments dans mon tableau d'aussi loin que je peux voir, et si je définir toutes les valeurs que je puisse l'exécuter parfaitement dans SQL workbench, c'est à dire:

UPDATE users SET first_name = 'Kalle', last_name = 'Anka', ssn = 242345234, address = 'Stockholm', phone_number = 53423434, latitude = 17.189889231223423423424324234, longitude = 109.234234 WHERE id = 4

J'ai essayé de l'AOP instruction préparée à la fois avec le $user_id définie à une valeur spécifique et aussi sans la latitude/longitude paramètres.

Si j'ai oublié une information critique, il suffit de pointer et je l'aurai. l'adresse est de type varchar et lat/long sont des flotteurs dans la base de données btw. L'utilisation de MYSQL.

La fonction ci-dessous:

public static function update_user($fields, $user_id)
{
    $db = self::_connect();

    $st = $db->prepare("UPDATE users SET first_name = ?, last_name = ?, ssn = ?, address = ?, phone_number = ?, latitude = ?, longitude = ? WHERE id = '{$user_id}'");
    $st->execute($fields);

    return ($st->rowCount()) ? true : false;
}
Je ne me souviens pas si execute() gère incorrectement un tableau associatif si les paramètres ne sont pas nommés (avec ? au lieu de :first_name, par ex). Cela fonctionne si vous ne $st->execute(array_values($fields)); de dépouiller l'associatif clés?
Vous êtes correct. Lors de l'utilisation de position params vous devez utiliser 0 indexé entier clés. En outre, si vous utilisez les paramètres nommés alors à la fois les espaces réservés dans la déclaration et la chaîne de clés pour les paramètres passés à exécuter doit correspondre, et être préfixé avec :.
J'ai pensé que ce pourrait être le cas, mais il n'est pas mentionné la doc que j'ai trouvé.
Yay merci beaucoup, vous avez raison. J'étais sur le point d'essayer bindparams pour définir les valeurs étaient entiers et des flottants etc. je suis content de na pas aller dans cette voie. Ce fut mon premier thread, alors comment puis-je vous donner des points de maintenant ? 😛
FWIW, le pdo_mysql pilote ignore le type de valeurs que vous transmettez à bindParam().

OriginalL'auteur HolyMackerel | 2013-02-11