【问题标题】:Syntax error or access violation CakePHP updateAll语法错误或访问冲突 CakePHP updateAll
【发布时间】:2013-06-01 13:28:07
【问题描述】:

有时当我使用 CakePHP 触发“updateAll”操作时,我会收到语法错误或访问冲突。当我执行以下操作时:

$variable = date('Y-m-d H:i:s')  <- for instance    
$this->Model->updateAll(
array('my_table_column' => $variable),
array('id' => $id));

当我尝试以下方式时,我没有收到此错误:

$this->Model->updateAll(
array('my_table_column' => "'".$variable."'"),
array('id' => $id));

我想知道为什么会发生这种情况以及这是否是一种保存数据等的保存方式。

【问题讨论】:

标签: cakephp save syntax-error


【解决方案1】:

据记录 (http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-updateall-array-fields-array-conditions),您应该使用 Sanitize::escape() 逃避那些:

$this->Model->updateAll(
    array('my_table_column' => "'" . Sanitize::escape($variable) . "'"),
    array('id' => $id));

【讨论】:

  • 但我不明白为什么要解析 [ "'" ] qoutes 之间的变量。在那里的文档中没有说明任何内容。感谢您提供的消毒信息,非常有用。
  • 不要将它们视为 SQL 表达式。该信息也在该页面上。
【解决方案2】:

正如documentation 所说

$fields 数组接受 SQL 表达式。文字值应该使用 DboSource::value() 手动引用。例如,如果您的模型方法之一正在调用 updateAll(),您将执行以下操作:

$ds = $this->getDataSource();
$value = $ds->value($value, 'string');
$this->updateAll(
    array('Baker.status' => $value),
    array('Baker.status' => 'old')
);

或者,如果您在控制器中执行 updateAll(假设您在那里使用 Baker 模型)

$ds = $this->Baker->getDataSource();
$value = $ds->value($value, 'string');
$this->Baker->updateAll(
    array('Baker.status' => $value),
    array('Baker.status' => 'old')
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 2015-08-21
    • 2016-10-19
    相关资源
    最近更新 更多