CAKEPHP 2.0 updateALL, данные в формате json_encoded

У меня другая проблема с одной из моих функций контроллера. Я написал функцию, которая обновляет некоторые поля из моей базы данных. Я беру содержимое из декодированного json_file, и после того, как я захватил данные, я снова закодировал их, чтобы я мог сохранить их в своей базе данных. Я получаю некоторые ошибки, которые я не понимаю.

Моя функция

public function admin_update_rulings()
{
    $this->loadModel('Magicsets');
    $this->loadModel('Cards');
    $this->autoRender = false;
    $code = 'LEA';
    $cards = file_get_contents('http://mtgjson.com/json/' . $code . '-x.json');

    $decodedcards = json_decode($cards);
    $this->Card->query("SET CHARACTER SET utf8");


    foreach ($decodedcards->cards as $cards) {
        $mvid = $cards->multiverseid;
        $legal = json_encode($cards->legalities);
        $rulings = '';
        if (!empty($cards->rulings)) {
            $rulings = json_encode($cards->rulings);
        } else {
            $rulings = json_encode('leeg');
        }

        $this->Cards->updateAll(
            array('rulings' => $rulings),   //fields to update
            array('multiverseid' => $mvid)  //condition
        );
    }
}

Сообщение об ошибке, которое я получаю:

Ошибка базы данных

Ошибка: SQLSTATE[42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 Ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с «[{date:2008-08-01,текст:Эта карта была возвращена к своим первоначальным функциям» в строке 1

SQL-запрос: ОБНОВЛЕНИЕ magicmm.cards AS Cards SET Cards.rulings = [{date:2008-08-01,text:Эта карта была возвращена к своей первоначальной функциональности. Если он зачаровывает артефакт, который уже является существом, его сила и выносливость не изменятся.},{date:2008-08-01,text:Перманент, не являющийся существом, который превращается в существо, может атаковать, и его {T} способности могут быть активированы только в том случае, если контролирующий его игрок постоянно контролировал этот перманент с начала своего последнего хода. Неважно, как долго перманент был существом.}] ГДЕ multiverseid = 96

Примечание. Если вы хотите настроить это сообщение об ошибке, создайте app/View/Errors/pdo_error.ctp.

Любая помощь в решении этой проблемы будет принята с благодарностью :-).


person Nick Van Dijk    schedule 30.06.2015    source источник
comment
При хранении json с Cakephp учитывайте следующее: Bakery.cakephp.org/2012/10/09/JSON-with-your-tables.html   -  person Ofir Baruch    schedule 30.06.2015


Ответы (2)


Вам нужно заключать строки в кавычки при использовании updateAll() в Cake. Вы можете сделать это, используя метод value() источника данных: -

$db = $this->getDataSource();
$value = $db->value($rulings, 'string');
$this->Cards->updateAll(
    array('rulings' => $rulings),   //fields to update
    array('multiverseid' => $mvid)  //condition
);

Вам, вероятно, лучше использовать save(), а не updateAll(), если вы знаете первичный ключ при сохранении.

См. принятый ответ на Ошибка: SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 Ошибка в синтаксисе SQL; обратитесь к руководству для более полного объяснения.

person drmonkeyninja    schedule 30.06.2015

Спасибо за совет всем. Я решил изучить метод сохранения, который вы оба посоветовали мне использовать. Это решило проблему для меня, и теперь все работает. Я изменил свой код обновления на этот.

        $updaterow = $this->Cards->find('first', array('fields' => array('id'), 'conditions' => array('multiverseid' => $mvid), 'limit' => 1));
        $id = $updaterow['Cards']['id'];

        $data = array('id' => $id, 'rulings' => $rulings, 'legalities' => $legal);

        $this->Cards->save($data);
person Nick Van Dijk    schedule 30.06.2015