SQL-запрос корректен, но все равно появляется «Ошибка SQL 1064» - PullRequest
2 голосов
/ 03 февраля 2012

Я не могу с этим справиться.У меня большие проблемы с этим запросом:

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, чтобы узнать правильный синтаксис для использования рядом с 'ОБНОВЛЕНИЕ книг SET SET books.available = 0 ГДЕ books.in = books.out' в строке 1 **

Iя вызываю мой запрос из контроллера:

$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 голосов
/ 03 февраля 2012

Похоже, что ваша проблема может быть из-за отсутствия поддержки PHP для выполнения нескольких операторов. Выполнение нескольких операторов позволяет вам выполнить два запроса в одном запросе и получить в ответ несколько наборов результатов.

MySQL DOES поддерживает это, но настройка по умолчанию в PHP предотвращает это (то есть, если вы используете устаревшие функции mysql_connect() эры). На самом деле это хороший вариант по умолчанию, потому что есть несколько серьезных ошибок, которые можно внести, разрешив множественные запросы (см. SQL-инъекция).

Таким образом, решение может состоять в том, чтобы изменить ваш код для запроса данных отдельно.

$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 ) обеспечит вам необходимую гибкость.

1 голос
/ 03 февраля 2012

очевидно, это потому, что вы используете зарезервированные слова в своем запросе, пытаетесь экранировать все имена таблиц и столбцы таблицы в ``

списке зарезервированных слов в mysql , доступных здесь

0 голосов
/ 03 февраля 2012

Если второй оператор Update предназначен для изменения только той строки, которую обновил первый оператор, то вы можете использовать одно обновление:

UPDATE books 
SET out = out + 1
  , available = CASE WHEN in = out
                       THEN 0
                       ELSE available
                END
WHERE id = 81813130 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...