PDO查询时出现语法错误

时间:2016-12-09 11:01:38

标签: php mysql pdo

我写了一个在包装器中可用的更新函数,实际上函数看起来像这样:

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。我的代码出了什么问题?

3 个答案:

答案 0 :(得分:2)

试试这个:)

这行代码导致问题:

$fieldDetails .= "`$key`=:$key,";

在这里你要在每一列之后添加一个逗号(,),最后的字符串你将获得额外的尾随逗号(,)删除它和所有集合。

所以在循环之后添加:

$fieldDetails = rtrim($fieldDetails, ',');

答案 1 :(得分:1)

$fieldDetails .= "`$key`=:$key,";
                              ^

这里总是有一个尾随逗号,结果是:

..., WHERE

你应该将单个字段放入一个数组,然后implode,这会将逗号放到正确的位置。

答案 2 :(得分:0)

如果$data为空,而不执行循环且$fieldDetails保持为空,则会导致语法错误。