2012-05-09 6 views
0

Этот точный код работал раньше на моей старой машине, но я получаю эту ошибку, отброшенную на меня (на Mac OSX 10.7).Ошибка синтаксиса MySQL для INSERT

Код С:

printf("%s\n",query); 

if (mysql_query(conn,query)){ 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
} 

Выход:

INSERT INTO comment (unum,cat_subject,cat_major,cat_minor,unmod) 
VALUES (1,1,1,0,'The cat was lazy.') 

You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near ','The cat was lazy.')' at line 1 

Оригинальные printf заявления создает две строки текста, но я завернул их для удобства чтения.

Все это выглядит хорошо! Следующие работы в PHP для одной и той же таблицы (с правильными bindParam заявления):

$STH=$DBH->prepare("INSERT INTO comment (unum,cat_subject,cat_major,cat_minor,unmod) VALUES (:u,:s,:ma,:mi,:t)"); 

Что случилось?

(BTW: Я пробовал с " вместо ', но это не имело никакого значения.)

+0

Возможно, новая версия требует ';' в конце запроса? (маловероятно, но кто знает). Или, может быть, ваше имя таблицы является ключевым словом и должно быть изменено на '\' comment \ ''? –

+0

Таблица отлично работает при вызове PHP/AJAX, поэтому его имя должно быть в порядке. И это отлично работает в PHP, поэтому я не думаю, что ему нужна точка с запятой: '$ STH = $ DBH-> prepare (" INSERT INTO comment (unum, cat_subject, cat_major, cat_minor, unmod) VALUES (: u,: s ,: ма,: ми,: т) ");'. :) – Nick

+1

Есть ли непечатный символ в 'query' после' 0'? – eggyal

ответ

2

(Обновление до ответа)

Это кажется, что вы можете иметь непечатаемые символы в query , вероятно, после символа 0. Попробуйте hexdumping байт Строки, чтобы увидеть, если что-то подозрительное:

char* c; 
for (c=query; *c; c++) printf("%02x",*c); 

Если вы будете конкатенации в ваш SQL неизвестного содержимого переменных, я настоятельно рекомендую использовать MySQL, prepared statement API передать переменные в MySQL в качестве параметров в порядке избежать SQL-инъекции; это также будет выполнять базовое преобразование типов таких параметров в типы столбцов адресата - если вам нужно больше контролировать очистку ваших переменных, вам нужно будет выполнить их в своем приложении до передачи параметров в MySQL.

+0

Я изменил его на 'printf («% 02x% c \ n », * c, * c);' чтобы это стало проще :) И я нашел «31 1 2c, 31 1 2c, 32 2 2c, 31 1 7f [преступник здесь] 2c,' (удаленные строки удалены). Я сам создаю значение, поэтому в него ворвался нежелательный файл. Как вы выполняете простой эквивалент регулярного выражения, чтобы обеспечить наличие только числовых элементов? Решения кажутся слишком сложными. (Я не пытаюсь противостоять модели API, но я не понимаю, как это сделать - на странице нет примеров;) Я могу задать это как еще один вопрос, если вы слишком заняты. И спасибо за помощь. – Nick

+0

@Nick: Вам было бы разумно сначала понять *, как этот символ закрался, а затем решить, какое действие подходит (следует ли его заменить чем-то другим? Удалить или проигнорировать? Как насчет любых символов в том же поле, которое следует это - следует ли их игнорировать?). Сначала принимайте эти решения, затем публикуйте отдельный вопрос (только потому, что мой C невероятно прочен!). – eggyal

+0

Спасибо за помощь. Я сделаю, как вы посоветуете. В большинстве случаев я строю символы символов по символам, поэтому вставка фильтра должна быть вполне работоспособной. – Nick