【问题标题】:Using PDO named parameters throws error: SQLSTATE[HY000]: General error: 1 near "(": syntax error使用 PDO 命名参数会引发错误:SQLSTATE[HY000]: General error: 1 near "(": 语法错误
【发布时间】:2015-08-11 14:08:08
【问题描述】:

我正在尝试使用以下方法更新我的 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:语法错误

有人能指出错误是什么吗?我想我不太明白如何使用命名参数。

【问题讨论】:

  • 我认为您的声明中不需要()
  • @fibono 你不能使用它们两次,这意味着独一无二。一个值只能使用一个唯一占位符一次。但是现在您在查询中使用了两次。
  • @fibono 阅读该评论:stackoverflow.com/questions/31944102/… ?
  • @fibono 仅供参考:重新打开问题并稍微清理一下您的问题。还添加了一个答案,只是为了给您一些文档链接,并稍微解释一下问题是什么以及如何解决它。

标签: php sql sqlite pdo


【解决方案1】:

所以你的第一个问题是,你的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)并将你的反引号放在保留字周围。

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2013-06-20
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2011-12-27
    相关资源
    最近更新 更多