SQLSTATE [42000]:语法错误或访问冲突:更新时为1064

时间:2014-01-12 12:32:22

标签: php arrays

我有这个功能,如果我只有一个参数,它工作正常。 但如果我有多个,我会收到上述错误。

version for the right syntax to use near 'usr_lastname','usr_login'='firstname','lastname' at line 1 in

public function updateById($id, $data)
{
    #print_r($data);
    foreach ($data as $field => $value){
        $fields[] = '`'.$field.'`';
        $targets[] = ':'.$field;
        $values[] = $value;
    }

    $stmt = $this->db->prepare("UPDATE ".$this->table." SET ".join(',', $fields)."=".join(',', $targets)." WHERE id = $id");

    foreach ($targets as $pos => $target){
        switch (true){
            case is_int($values[$pos]) : $type = PDO::PARAM_INT; break;
            case is_bool($values[$pos]) : $type = PDO::PARAM_BOOL; break;
            case is_string($values[$pos]) : $type = PDO::PARAM_STR; break;
            case is_null($values[$pos]) : $type = PDO::PARAM_NULL; break;
            default : $type = PDO::PARAM_STR; break;
        }


        $stmt->bindValue($target, $values[$pos], $type);
        print_r($stmt);
    }

    $stmt->execute();
    $json = array(
        'success' => true,
        'result' => $value
    );
    echo json_encode($json);
}  

我没有看到任何“,”错误。

有什么建议我错了或遗失了吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你的问题在这里:

SET ".join(',', $fields)."=".join(',', $targets)."
UPDATE的

语法是这样的:

col1 = :col1, col2 = :col2, col3 = :col3 ...

现在你的代码是这样的:

col1,col2,col3 = :col1, :col2, :col3

所以如果你只有一个参数就可以正常工作(col1 =:col1)

最简单的解决方案是改变您准备$fields$targets的方式,例如:

foreach ($data as $field){
    $updateFields[] = '`'.$field.'` = '.':'.$field
}

你的SQL应该是这样的:

"UPDATE ".$this->table." SET ".join(',', $updateFields)." WHERE id = $id"