我正在尝试使用以下命令更新我的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接近"(":语法错误
有人可以查明错误是什么吗?我想我不太了解如何使用命名参数。
答案 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()时,您必须为要传递给语句的每个值包含唯一参数标记。
最后name
是mysql reserved word,因此应该在其周围放置`
。
表示首先删除您的括号,然后使用唯一占位符(您不能拥有2x :name
和:entryDate
),并将您的反引号括在保留字之内。