我写了一个在包装器中可用的更新函数,实际上函数看起来像这样:
public function update($table, $data, $where, $fields)
{
$params = [];
$fieldDetails = NULL;
foreach($data as $key => $value)
{
$fieldDetails .= "`$key`=:$key,";
$params[$key] = $fields[$key];
}
var_dump('UPDATE ' . $table . ' SET ' . $fieldDetails . 'WHERE' . $where);
return $this->prepare("UPDATE $table SET $fieldDetails WHERE $where")
->execute($params);
}
正如您所看到的,我传递了表的名称,我需要更新值,要更新的数据,where子句以及where子句的相对字段。 我这样执行:
try {
$this->db->update('auth_tokens', $auth, 'user_id = :user_id',
[':user_id' => $auth['user_id']]);
}catch (Exception $e)
{
var_dump($e);
}
我收到此消息的问题是:
object(PDOException)#15(8){[" message":protected] => string(222)" SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在#< WHERE user_id = NULL' WHERE user_id = NULL'附近使用正确的语法。在第1行"
似乎将where子句中的:user_id视为null。我的代码出了什么问题?
答案 0 :(得分:2)
试试这个:)
这行代码导致问题:
$fieldDetails .= "`$key`=:$key,";
在这里你要在每一列之后添加一个逗号(,),最后的字符串你将获得额外的尾随逗号(,)删除它和所有集合。
所以在循环之后添加:
$fieldDetails = rtrim($fieldDetails, ',');
答案 1 :(得分:1)
$fieldDetails .= "`$key`=:$key,";
^
这里总是有一个尾随逗号,结果是:
..., WHERE
你应该将单个字段放入一个数组,然后implode
,这会将逗号放到正确的位置。
答案 2 :(得分:0)
如果$data
为空,而不执行循环且$fieldDetails
保持为空,则会导致语法错误。