2010-01-28 3 views
2

J'ai un tableau: 'objets' avec quelques colonnes: object_id: int, type_objet: int, object_status: int, object_lati: float, objet_long: float Ma requête est:Numéro de paramètre invalide: le nombre de variables liées ne correspond pas au nombre de jetons

$stmt = $db->query('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1'); 
$res = $stmt->fetch(); 

AOP renvoie une erreur:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Lorsque je supprime la colonne object_lati ou object_long requête est excellent travail.

+2

Y a-t-il une raison pour laquelle vous n'utilisez pas l'ORM? –

+0

@YourCommonSense Maintenant que cette question fait (indirectement) l'objet d'un [meta post] (http://meta.stackoverflow.com/q/253911/176646), cela peut arriver plus tôt. – ThisSuitIsBlackNot

Répondre

-1

Essayez la déclaration comme:

$stmt = $db->query('SELECT object_id, object_type, object_status, object_lati, object_long FROM objects o WHERE object_id = ? ', 1); 
-1

essayer au lieu

$row = $db->fetchRow('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1'); 
// return false if no result found 

ou pour obtenir record établi

$rs = $db->fetchAll('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1'); 
// returns array with results 
1

Bien que cette question particulière n'est pas un vrai, comme code fourni ne produira jamais une erreur comme celle-ci, il semble que Google prend plaisir à envoyer des visiteurs à ce p âge. Pour qui est la réponse qui suit:

Ce problème ne peut jamais être causé par l'appel de méthode query(), car il appartient essentiellement à l'instruction préparée. L'erreur elle-même est assez claire: "nombre de jetons" représente le nombre de jetons ? ou :name dans la requête (également appelée "espace réservé"), tandis que "nombre de variables liées" représente les variables qui étaient éther lié via bindValue ou `bindParam, ou envoyé via execute (ce qui est techniquement le même). Ainsi, quand on essaye de lier plus de variables que de jetons définis dans la requête, PDO soulève cette erreur.

Par exemple, s'il y a une requête préparée sans jetons définis, mais nous essayons de lier une variable à elle:

$stmt = $db->prepare('SELECT * FROM objects o WHERE o.object_id = 1'); 
$stmt->execute(array($id)); 

il se traduira par le très message d'erreur en question, le nombre des variables liées (1) ne correspond pas au nombre de jetons (0).

Pour résoudre ce problème, il suffit de comparer soigneusement le nombre de jetons dans la requête préparée avec le nombre de variables liées à l'instruction.

Questions connexes