2010-07-17 7 views
1

Pouvez-vous les gars voir une erreur évidente dans cette requête? L'erreur im getting est: `Unknown column 003ADF50 dans la liste des champs. 003ADF50 wtf?ne peut pas comprendre cette erreur

query << "UPDATE `record` SET `record` = " << lastRecord << ", `time` = " << time; 
+4

La plus grosse erreur que je vois est que vous n'utilisez pas d'instructions préparées. –

+0

Comment la requête devrait-elle être en SQL normal? – Tom

+2

le nom de la table et le nom de l'attribut sont-ils vraiment 'enregistrement'? – northpole

Répondre

4

Ce qui semble se passer ici est que l'une de ces valeurs que vous vous injectez dans votre sql est à venir comme 003ADF50. (Probablement la valeur time?)

Brendan Long est correct: vous devez utiliser des instructions préparées pour gérer correctement les paramètres dans votre SQL. La concaténation manuelle des chaînes conduit à citer des problèmes comme ceux que vous voyez ici, ce qui peut poser de sérieux problèmes de sécurité dans votre code. Le problème de citation spécifique que vous rencontrez ici est que les paramètres ne sont pas cités dans la chaîne de requête qui en résulte. Si vous tapez le SQL manuellement dans le client mysql, vous voulez dire quelque chose comme:

UPDATE `record` set `record` = 'foo'; 

Si au contraire vous avez laissé les citations sur 'foo', vous auriez:

UPDATE `record` set `record` = foo; 

qui est essayer de définir la colonne record à la valeur de la colonne foo, plutôt que la chaîne littérale 'foo'. La même chose se passe avec le SQL que vous générez à partir de votre C++. Essayer de résoudre cela en ajoutant manuellement des guillemets n'est pas une bonne idée - que se passe-t-il lorsque le paramètre de chaîne contient un caractère de citation? La meilleure chose à faire est d'utiliser des instructions préparées. En outre, Google "petites tables bobby" pour une bande dessinée XKCD bien connue sur l'injection de paramètres SQL, et considérez ce qui se passerait si le nom de Bobby Tables trouvait son chemin dans l'une des variables de votre programme.

Questions connexes