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开销(更新过程只调用一次,没有验证,没有存在性检查,没有回调等),并且只发出一个SQLUPDATE
查询,其中assave/Many()
在PHP端有很多开销,特别是因为整个保存过程需要为每个记录单独调用,还导致为每个记录发出至少一个SQL查询。
$this->Navigation->updateAll(array('name' => "'".$this->request->data['Tag']['name']."'"), array('tag_id' => $this->request->data['Tag']['id']));