Matas - developer Ответов: 4

У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашему серверу mysql


QUERY FAILED .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 'WHERE darb_id = 30, darb_title = 'Pavadinimas', darb_date = now(), darb_user' at line 1


Мой код:

$query = "UPDATE darb SET ";
$query .= "WHERE darb_id = {$the_darb_id}, ";
$query .="darb_title  = '{$darb_title}', ";
$query .="darb_date   =  now(), ";
$query .="darb_user = '{$darb_user}', ";
$query .="darb_status = '{$darb_status}', ";
$query .="darb_content = '{$darb_content}', ";
$query .="darb_work = '{$darb_work}', ";
$query .="darb_finish = '{$darb_finish}', ";
$query .="darb_result    = '{$darb_result}', ";
$query .= "darb_fileUpload = {$darb_fileUpload} ";

$update_darb = mysqli_query($connection, $query);

confirmQuery($update_darb);


Что я уже пробовал:

have tried a lot of advice online but couldnt resolve this error.

4 Ответов

Рейтинг:
8

Patrice T

Очень хороший способ построить SQL-запрос, подлежащий инъекции.

$query = "UPDATE darb SET ";
$query .= "WHERE darb_id = {$the_darb_id}, ";
$query .="darb_title  = '{$darb_title}', ";
$query .="darb_date   =  now(), ";
$query .="darb_user = '{$darb_user}', ";
$query .="darb_status = '{$darb_status}', ";
$query .="darb_content = '{$darb_content}', ";
$query .="darb_work = '{$darb_work}', ";
$query .="darb_finish = '{$darb_finish}', ";
$query .="darb_result    = '{$darb_result}', ";
$query .= "darb_fileUpload = {$darb_fileUpload} ";

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Рейтинг:
36

MadMyche

2 проблемы с вашим сценарием.

Большая проблема заключается в том, что вы наткнулись на 20-летнюю уязвимость под названием SQL-инъекция- возможно, вы слышали об этом. NEVER EVER если вы создадите команду SQL, объединив команды и введенный пользователем текст. То, что вы должны использовать, называется Параметры и они хорошо документированы для большинства баз данных.

Вторая проблема заключается в том, что ваш запрос "перевернут" из-за отсутствия лучшего термина. Предложение where после ваш набор предметов. Вот сырой SQL с именами параметров в нем уже есть.

UPDATE darb SET

darb_title      = @darb_title,
darb_date       =  now(),
darb_user       = @darb_user,
darb_status     = @darb_status,
darb_content    = @darb_content,
darb_work       = @darb_work,
darb_finish     = @darb_finish,
darb_result     = @darb_result,
darb_fileUpload = @darb_fileUpload

WHERE darb_id = @the_darb_id


Рейтинг:
24

Garth J Lancaster

1) Ваш синтаксис предложения SQL WHERE "довольно интересен" - использование запятых", " для разделения терминов, например

Что произойдет, если вы попытаетесь заменить запятые на "И", так что вы в конечном итоге получите ...

WHERE darb_id = 30 
AND   darb_title = 'Pavadinimas' 
AND   darb_date = now()
AND   darb_user = (some value)


2) вы действительно должны смотреть на Руководство по MySQL подготовленные операторы и параметризованные запросы — DatabaseJournal.com[^] и РНР: Подготовленные Заявления - Руководство Пользователя[^] чтобы научиться писать правильные параметризованные запросы, а не весь этот бизнес по конкатенированию строк, иначе вы оставите себя открытым для проблем отладки, атак sql-инъекций и т. д


Рейтинг:
0

ErrorMadness

Похоже, вы поместили предложение "WHERE" в начале запроса там, где оно должно быть помещено в конце запроса.

$query = "UPDATE darb SET ";
$query .="darb_title  = '{$darb_title}', ";
$query .="darb_date   =  now(), ";
$query .="darb_user = '{$darb_user}', ";
$query .="darb_status = '{$darb_status}', ";
$query .="darb_content = '{$darb_content}', ";
$query .="darb_work = '{$darb_work}', ";
$query .="darb_finish = '{$darb_finish}', ";
$query .="darb_result    = '{$darb_result}', ";
$query .= "darb_fileUpload = {$darb_fileUpload} ";
$query .= "WHERE darb_id = {$the_darb_id} ";

$update_darb = mysqli_query($connection, $query);

confirmQuery($update_darb);


Если вы обновляете базу данных по ее
darb_id
тогда " где " должно быть в конце, если нет, то вы должны использовать и вместо запятой(,) , например, что Гарт Дж Ланкастер - Профессионального Профиля[^] сказано в решении № 1.