错误:SQLSTATE [42000]:语法错误或访问冲突:1064您 您的SQL语法有错误;检查对应的手册 您的MySQL服务器版本,以便在' @ g.com附近使用正确的语法, '用户''电话' = 87665r5,'用户'。'地址' = 23lsdhf, '用户''位置' '在第1行
SQL查询:
UPDATE 'cake'.'users' AS 'User' SET 'User'.'username' = paul, 'User'.'password' = eben, 'User'.'email' = paul@g.com, 'User'.'phone' = 87665r5, 'User'.'address' = 23lsdhf, 'User'.'location' = lskjaflasi, 'User'.'pincode' = 867567 WHERE 'User'.'id' = 1
我的代码是
if($this->request->data)
{$User=$this->request->data[User];
$this->User->updateAll($User,array("User.id" => $v));}
如何更新整个表单?
答案 0 :(得分:2)
updateAll()
时不同, save()
不会自动将字符串值包装在引号中。你必须自己做。来自the docs: -
应使用DboSource :: value()手动引用文字值。
在调用$this->request->data
之前,您需要使用数据源的value()
方法将updateAll()
中的每个字符串值用引号括起来: -
$db = $this->getDataSource();
$value = $db->value($value, 'string');
建议不要只将$this->request->data
传递给updateAll()
,因为有人可能会将数据注入您的数据库。而是根据请求数据构建一个新的保存数据数组,并根据需要包装字符串。例如: -
$user=$this->request->data[User]
$data = array(
'username' => $db->value($user['username'], 'string'),
'password' => $db->value($user['password'], 'string'),
'email' => $db->value($user['email'], 'string'),
'phone' => $db->value($user['phone'], 'string'),
'address' => $db->value($user['address'], 'string'),
'location' => $db->value($user['location'], 'string'),
'pincode' => $db->value($user['pincode'], 'integer')
);
$this->User->updateAll($data, array("User.id" => $v));
<强>更新强>
作为使用updateAll()
的替代方法,您最好将save()
用于此处所做的事情。只要您的保存数据包含记录的主键(例如 User.id
),它就会执行UPDATE
而不是INSERT
: -
$this->request->data['User']['id'] = $v;
$this->User->save($this->request->data);
save()
将为您处理所有字符串,因此不需要自己将它们包装在引号中。