使用PDO命名参数抛出错误:SQLSTATE [HY000]:一般错误:1接近"(":语法错误

时间:2015-08-11 14:08:09

标签: php sql sqlite pdo

我正在尝试使用以下命令更新我的SQLite数据库:

$insertion = $db->prepare("UPDATE roles SET ($set_string) WHERE entryDate = :entryDate AND name = :name");
$insertion->execute($assoc_data);   

这里$set_string是一串属性和参数,这就是我想要的。一个print_r() $set_string收益:

name = :name,
entryDate = :entryDate,
development = :development,
adhoc = :adhoc,
mentoring = :mentoring,
documentation = :documentation,
codeReview = :codeReview,
meetings = :meetings,
learning = :learning,
waste = :waste,
workPrioritization = :workPrioritization,
management = :management,
applicationTraining = :applicationTraining

$assoc_data是一个关联数组,包含我想用以下内容更新数据库的所有数据:

Array (
    [name] => Bobby Bob
    [entryDate] => 2015-08-11
    [development] => 0
    [adhoc] => 0
    [mentoring] => 0
    [documentation] => 0
    [codeReview] => 0
    [meetings] => 0
    [learning] => 0
    [waste] => 0
    [workPrioritization] => 0
    [management] => 0
    [applicationTraining] => 100
)

我收到以下错误:

  

例外:SQLSTATE [HY000]:一般错误:1接近"(":语法错误

有人可以查明错误是什么吗?我想我不太了解如何使用命名参数。

1 个答案:

答案 0 :(得分:3)

所以你的第一个问题是你的SQL UPDATE语法是错误的。您不需要使用括号,如文档中所示:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

第二个占位符必须是唯一的。这意味着您只能为一个值使用它们一次。正如您可以阅读PHP manual

  

当您调用PDOStatement :: execute()时,您必须为要传递给语句的每个值包含唯一参数标记

最后namemysql reserved word,因此应该在其周围放置`

表示首先删除您的括号,然后使用唯一占位符(您不能拥有2x :name:entryDate),并将您的反引号括在保留字之内。