我的控制器功能有另外一个问题。我编写了一个更新数据库中某些字段的函数。我从解码的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”,“text”附近使用正确的语法:“此卡已在第1行返回其原始功能”
SQL查询:更新
magicmm
。cards
ASCards
设置Cards
。rulings
= [{“date”:“2008-08-01” ,“文字”:“这张卡已经恢复原状功能。如果它是一个已经成为生物的神器,它不会改变它的力量和韧性。”},{“date”:“2008-08- 01“,”text“:”变成生物的非生物永久物可以攻击,并且只有当其控制器自其最近转弯开始以来一直控制该永久物时,其{T}能力才能被激活。永久物已成为生物的时间并不重要。“}}multiverseid
= 96
注意:如果要自定义此错误消息,请创建app / View / Errors / pdo_error.ctp
非常感谢任何有关解决此问题的帮助: - )。
答案 0 :(得分:0)
在Cake中使用updateAll()
时,需要用引号括起字符串。您可以使用数据源的value()
方法执行此操作: -
$db = $this->getDataSource();
$value = $db->value($rulings, 'string');
$this->Cards->updateAll(
array('rulings' => $rulings), //fields to update
array('multiverseid' => $mvid) //condition
);
如果您在保存时知道主键,则最好使用save()
而不是updateAll()
。
请参阅Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual的已接受答案,以获得更全面的解释。
答案 1 :(得分:0)
感谢大家的建议。我决定调查你们俩建议我使用的保存方法。它为我解决了这个问题,现在一切正常。我将更新代码更改为此。
$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);