CakePHP 2.x不将字符串视为字符串

CakePHP 2.x不将字符串视为字符串,cakephp,cakephp-2.0,Cakephp,Cakephp 2.0,在控制器方法中,我有以下代码: $this->loadModel('Navigation'); $this->Navigation->updateAll(array('Navigation.name' => $this->request->data['Tag']['name']), array('Navigation.tag_id' => $this->request->data['Tag']['id'])); 它产生以下错误: Error

在控制器方法中,我有以下代码:

$this->loadModel('Navigation');
$this->Navigation->updateAll(array('Navigation.name' => $this->request->data['Tag']['name']), array('Navigation.tag_id' => $this->request->data['Tag']['id']));
它产生以下错误:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column ' 
Germany' in 'field list'

SQL Query: UPDATE `dev_hub_subdb_v5_interface`.`navigations` AS 
`Navigation` SET `Navigation`.`name` = Germany WHERE 
`Navigation`.`tag_id` = 3
原因似乎是,当试图将“Germany”写入名为
name
的列时,它没有将其视为字符串,这是MySQL中的
varchar(255)
字段

但是,数据是字符串格式的。如果我
var\u dump
将要保存的请求数据,我会得到以下结果:

array(2) { ["Save"]=> string(6) "Update" ["Tag"]=> array(2) { ["id"]=> string(1) "3" ["name"]=> string(7) "Germany" } }

为什么这样不行?根据
updateAll
接受两个数组:要保存的数据和条件。因此,我看不出还有什么其他方法可以写这个。

因此,似乎您必须引用字符串,即使它们是字符串

我上面提到的文档有一个相当糟糕的解释/示例,但说明:

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

我不知道这个例子是什么意思,因为他们似乎在用字符串更新
Baker.status
两次。清清楚楚

无论如何,在我的例子中,在
$this->request->data['Tag']['name']
周围添加一个引号修复了它:

$this->Navigation->updateAll(array('name' => "'".$this->request->data['Tag']['name']."'"), array('tag_id' => $this->request->data['Tag']['id']));

你可能想仔细重读你链接的文档。谢谢@ndm,我现在拿到了。他们给出的示例看起来让我困惑,但引用字符串似乎确实有效。该示例没有两次更新状态,而是更新当前状态值为
old
的状态。该示例演示了如何引用要设置的值,因为这在默认情况下不会发生,这与使用
save()
方法的
key=>value
表示法不同。如果值是用户数据,请不要在其周围手动添加引号,这对于SQL注入是不安全的!,相反,请使用示例中所示的
DboSource::value()
方法,该方法应用了保存过程中使用的相同引用(
PDO::quote()
)。几年前我尝试过解释Cake的
updateAll
方法,如果有用的话:。谢谢@drmonkeynija,这真的很有用。话虽如此,如果您可以使用
save()
等,我真的不知道
updateAll()的意义何在。。。似乎增加了一层复杂性而没有真正的好处?这取决于数据,
updateAll()
在更新更大的数据集时非常有用,比如说10.000条记录,因为它只有很少的PHP开销(更新过程只调用一次,没有验证,没有存在性检查,没有回调等),并且只发出一个SQL
UPDATE
查询,其中as
save/Many()
在PHP端有很多开销,特别是因为整个保存过程需要为每个记录单独调用,还导致为每个记录发出至少一个SQL查询。
$this->Navigation->updateAll(array('name' => "'".$this->request->data['Tag']['name']."'"), array('tag_id' => $this->request->data['Tag']['id']));