НА ДУБЛИКЕ КЛЮЧА не работает

В настоящее время я пытаюсь сделать довольно простую задачу. Информация извлекается с помощью «post.php», где она обрабатывается и должна быть вставлена ​​в базу данных, если идентификатор (автоинкремент) не существует, или обновить данные, если идентификатор существует.

Запуск скрипта ничего не записывает в базу данных. Я попытался распечатать запрос на странице и скопировать/вставить SQL в PhpMyAdmin. Он возвращается

#1064 — ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'long, description, mobile, type, reported, embed, live, img_url) VALUES ('', 'TE' в строке 1

Мой код:

$query="INSERT INTO xxy (ID, name, address, lat, long, description, mobile, type, reported, embed, live, img_url) VALUES('$id', '$name', '$address', '$lat', '$ lon', '$description', '$mobile', '$type', '$reported', '$embed', '$live', '$target_file') ПРИ ОБНОВЛЕНИИ ДВОЙНОГО КЛЮЧА
name=VALUES(' $name'), address=ЗНАЧЕНИЯ('$address'), lat=ЗНАЧЕНИЯ('$lat'), long=ЗНАЧЕНИЯ('$lon'), description=ЗНАЧЕНИЯ('$description'), mobile=ЗНАЧЕНИЯ(' $mobile'), type=ЗНАЧЕНИЯ('$type'), reported=ЗНАЧЕНИЯ('$сообщенные'), embed=ЗНАЧЕНИЯ('$embed'), live=ЗНАЧЕНИЯ('$live'), img_url=ЗНАЧЕНИЯ(' $img_url')";

Спасибо за помощь!

ОБНОВИТЬ:

Я также пробовал возвращать зарезервированные слова. Мой текущий код SQL все еще возвращает ошибку.

1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с ''$ name'), address=VALUES('$address'), lat=VALUES('$lat'), lon=VALUES('$ lon'), de' в строке 2

Обновленный код SQL, который я использую:

 INSERT INTO `xxy` (`ID`, `name`, `address`, `lat`, `lon`,
 `description`, `mobile`, `type`, `reported`, `embed`, `live`,
 `img_url`) VALUES('$id', '$name', '$address', '$lat', '$lon',
 '$description', '$mobile', '$type', '$reported', '$embed', '$live',
 '$target_file') ON DUPLICATE KEY UPDATE     `name`=VALUES('$name'),
 `address`=VALUES('$address'), `lat`=VALUES('$lat'),
 `lon`=VALUES('$lon'), `description`=VALUES('$description'),
 `mobile`=VALUES('$mobile'), `type`=VALUES('$type'),
 `reported`=VALUES('$reported'), `embed`=VALUES('$embed'),
 `live`=VALUES('$live'), `img_url`=VALUES('$img_url')

person Vlad Dumitrache    schedule 14.09.2015    source источник
comment
вы, вероятно, используете символ, с которым MySQL не согласен, являющийся апострофом. То есть: John's Coffee Shop, я прав? Если это так, MySQL интерпретирует это как John\'s Coffee Shop, вызывающий синтаксическую ошибку. Вам нужно будет избежать ваших данных.   -  person Funk Forty Niner    schedule 14.09.2015
comment
Я также попытался выполнить приведенный выше код непосредственно в PMA. Все равно выдает ту же ошибку   -  person Vlad Dumitrache    schedule 14.09.2015
comment
ON DUPLICATE KEY UPDATE name='$name', address='$address'... Не нужно добавлять VALUES   -  person ojovirtual    schedule 14.09.2015
comment
Мы надеемся, что все эти переменные в вашем запросе были правильно экранированы.   -  person Crontab    schedule 14.09.2015


Ответы (1)


Удалить все ключевые слова VALUES в разделе ON DUPLICATE KEY UPDATE

person Nitromoon    schedule 14.09.2015
comment
Зачем? dev.mysql.com/doc/refman/5.0/ en/insert-on-duplicate.html из руководства INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); - person Funk Forty Niner; 14.09.2015
comment
@ Fred-ii- Потому что ОП использует это неправильно. Либо он избавляется от всех экземпляров VALUES(), но оставляет то, что находится внутри скобок, либо оставляет VALUES() и заменяет то, что внутри, на имя поля, а не на значение поля. поле. - person Crontab; 14.09.2015
comment
@Crontab Руководство немного запутанное. Хорошо... достаточно честно. Посмотрим, что скажет ОП ;-) - person Funk Forty Niner; 14.09.2015
comment
Работает как шарм! Спасибо ребята! Я у тебя в долгу! - person Vlad Dumitrache; 14.09.2015
comment
Ааааа отлично ^ проголосовал. @VladDumitrache, тогда вы можете принять ответ и пометить его как решенный. - person Funk Forty Niner; 14.09.2015