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 2

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 доступен здесь