SQL-запрос верен, но все равно появляется" ошибка SQL 1064".
Я не могу справиться с этим. Я испытываю большие проблемы с этим самым запросом:
UPDATE books
SET books.out = books.out + 1
WHERE id = 81813130;
UPDATE books
SET books.available = 0
WHERE books.in = books.out;
Если я запускаю его на моем phpMyAdmin, все нормально и все завершается, но в моем приложении CakePHP этот запрос не работает, и когда я выполняю отладку, это то, что мне говорят:
Предупреждение (512): ошибка SQL: 1064: у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с 'UPDATE books SET books.доступный = 0 где books.in = книги.out ' в строке 1 * *
Я вызываю свой запрос с контроллера:
$this->Lending->update_lendings($this->data['Lending']['book_id']);
И фактический запрос, конечно, входит в модель:
$query = "
UPDATE books
SET books.out = books.out + 1
WHERE id = ".$id.";
UPDATE books
SET books.available = 0
WHERE books.in = books.out;
";
Я действительно не могу сказать, почему это не работает. Кажется, что error 1064 Mysql
здесь очень распространенный вопрос, но я не нашел ничего полезного в самой моей проблеме.
Я искренне благодарю вас за Вашу поддержку и помощь.3 ответа:
Если второй оператор обновления предназначен для изменения только строки, которую обновил первый оператор, то можно использовать одно обновление:
UPDATE books SET out = out + 1 , available = CASE WHEN in = out THEN 0 ELSE available END WHERE id = 81813130
Похоже, что ваша проблема может быть связана с отсутствием поддержки PHP для выполнения нескольких операторов. Выполнение нескольких операторов позволяет выполнять два запроса в одном запросе и получать в ответ несколько результирующих наборов.
MySQLподдерживает его, но настройка по умолчанию в PHP предотвращает это (то есть, если вы используете устаревшие функции
mysql_connect()
era). Это на самом деле хороший дефолт, потому что есть некоторые серьезные ошибки, которые могут быть введены, позволяя множественные запросы (см. SQL injection).Таким образом, решением может быть изменение кода для запроса данных отдельно.
$query = " UPDATE books SET books.out = books.out + 1 WHERE id = ".$id.";"; mysql_query($db, $query); $query = "UPDATE books SET books.available = 0 WHERE books.in = books.out;"; mysql_query($db, $query);
Таким образом, если вы считаете, что достаточно безопасно использовать мульти-операторы (то есть, если все входные значения очищены), то идите вперед и попробуйте использовать функции
mysqli
(там даже не устаревшие!).
mysqli_multi_query( $query )
это должно дать вам необходимую гибкость.
Вероятно, это потому, что вы используете зарезервированные слова в своем запросе, попробуйте экранировать все имена таблиц и столбцы таблиц в
``
Список зарезервированных слов в mysql доступен здесь