CakePHP 3.0: SQLSTATE[42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 Ошибка в синтаксисе SQL

Я столкнулся с сохранением данных в базу данных с помощью Form в CakePHP 3.0.

//add.ctp
<div>
    <?= $this->Form->create($deposit) ?>
    <fieldset>
        <legend><?= __('Add') ?></legend>
        <?php
            echo $this->Form->input('date');
            echo $this->Form->input('profile_id', ['options' => $profiles]);
            echo $this->Form->input('amnt');
            echo $this->Form->input('desc');
            echo $this->Form->input('user_id', ['options' => $users]);
        ?>
    </fieldset>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>
</div>

Вот моя функция добавления

public function add()
{
    $deposit = $this->Deposits->newEntity();
    if ($this->request->is('post')) {
        $deposit = $this->Deposits->patchEntity($deposit, $this->request->data);
        if ($this->Deposits->save($deposit)) {
            $this->Flash->success(__('The member deposit has been saved.'));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__('The member deposit could not be saved. Please, try again.'));
        }
    }

    $profiles = $this->Deposits->Profiles->find('list', ['limit' => 200]);
    $users = $this->Deposits->Users->find('list', ['limit' => 200]);
    $this->set(compact('deposit', 'profiles', 'users'));
}

Когда я отправил форму, я нашел ниже ошибку синтаксиса базы данных

Ошибка: SQLSTATE[42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 Ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с «описанием, идентификатором_пользователя, созданным, измененным») ЗНАЧЕНИЯ («2015-06-06», 7, «3211», «некоторый текст», 1, ' в строке 1

И SQL-запрос показывал:

ВСТАВИТЬ В member_deposits (дата, profile_id, amnt, desc, user_id, созданный, измененный) ЗНАЧЕНИЯ (:c0, :c1, :c2, :c3, :c4, :c5, :c6)

Я потратил много времени на решение проблемы с помощью Google и из Похожая запись, не повезло, но, потратив день, я нашел решение, просто настроив quoteIdentifiers на true.

По умолчанию параметру quoteIdentifiers присвоено значение false в config/app.php в разделе Источники данных вашего проекта торта.


person Bayezid Alam    schedule 06.06.2015    source источник
comment
Я не знаком с cakePHP, но подозреваю, что это ваше неудачное использование зарезервированного слова для столбца «DESC» — dev.mysql.com/doc/refman/5.0/en/reserved-words.html. Либо найдите способ избежать имени поля (например, desc), либо измените имя столбца.   -  person crafter    schedule 06.06.2015
comment
Здесь есть вопрос?   -  person ndm    schedule 06.06.2015
comment
@crafter, это работает, если я изменю столбец desc на что-нибудь. Спасибо.   -  person Bayezid Alam    schedule 06.06.2015
comment
@ndm, я просто поделился своим опытом. Спасибо   -  person Bayezid Alam    schedule 06.06.2015
comment
Я вижу, это похвально, однако в этом случае это дубликат: stackoverflow.com/questions/27854333/ На примечании, отвечая на ваши собственные вопросы, и, таким образом, обмен опытом очень приветствуется, но рекомендуется опубликовать решение как фактический ответ, чтобы вопрос казался решенным, см. также stackoverflow.com/help/self-answer   -  person ndm    schedule 06.06.2015
comment
@ndm, спасибо за совет. :-)   -  person Bayezid Alam    schedule 06.06.2015
comment
рад слышать. Я разместил как ответ.   -  person crafter    schedule 06.06.2015


Ответы (1)


Один из ваших столбцов использует имя столбца, зарезервированное MySQL.

dev.mysql.com/doc/refman/5.0/en/reserved -words.html

Как видите, DESC зарезервирован.

Если вы можете найти способ изменить запрос для использования экранированного имени столбца, mysql это допустит. Например

INSERT INTO `member_deposits` (
    `date`, `profile_id`, `amnt`,
    `desc`, `user_id`, `created`, `modified`) 
VALUES (:c0, :c1, :c2, :c3, :c4, :c5, :c6)

В качестве альтернативы измените имя столбца на то, что не нарушает правило зарезервированных слов mysql.

person crafter    schedule 06.06.2015