【问题标题】:Prepared statements, SQLSTATE[HY093]: Invalid parameter number [duplicate]准备好的语句,SQLSTATE[HY093]:无效的参数号[重复]
【发布时间】:2020-05-29 17:37:52
【问题描述】:

我正在尝试编写一个查询来插入/更新一个表,这是我第一次使用准备好的语句,我收到了错误 SQLSTATE[HY093]: Invalid parameter number 但据我所知,我正在传递所有列/值必填。

(我试图在不使用 bindParam 的情况下执行此操作,如示例 #2 here

目前这只是一个测试,我计划在查询实际运行后将其变为动态。

$data_test = [
            ':event_id' => 3354,
            ':event'    => 'TESTESTEST',
            ':staff_booking_id' => 27255,
            ':is_read' => 'yes',
            ':priority' => 'medium'
        ];

        $q = "INSERT INTO events(event_id, event, staff_booking_id, is_read, priority) 
              VALUES(:event_id, :event, :staff_booking_id, :is_read, :priority) 
              ON DUPLICATE KEY UPDATE event_id = LAST_INSERT_ID(:event_id), event = :event, staff_booking_id = :staff_booking_id, is_read = :is_read, priority = :priority;";

        $result = $this->db->prepare($q);
        $result = $result->execute($data_test);

【问题讨论】:

  • @FunkFortyNiner 我见过两次使用同一个占位符的问题,这可能取决于您的驱动程序是否支持它。仿真可能会解决问题。
  • @tadman 这就是我的意思,谢谢。
  • @tadman(和亚当)。我找到了the duplicate 并关闭了问题。这就是我之前的意思。我用谷歌搜索了正确的词。
  • @FunkFortyNiner 我已经阅读并添加了PDO::ATTR_EMULATE_PREPARES => true,,但我现在收到错误SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'event = 'TESTESTEST', staff_booking_id = '27255', is_read = 'yes', priority = 'm' at line 3 我看不出有任何问题,有什么想法吗?
  • 是的,因为EVENT是mysql的保留字。要么将其重命名为未保留的名称,要么在其周围使用刻度。

标签: php mysql pdo prepared-statement on-duplicate-key


【解决方案1】:

正如 FunkFortyNiner 和 tadman 所评论的,问题可能来自您重复使用同一个占位符这一事实。

实际上 MySQL 语法并不要求您重用命名参数:您可以使用 VALUES() 来引用最初为 INSERT 传递的值。

另外,您尝试使用LAST_INSERT_ID() 更新event_id 似乎不正确;我不确定这是不是有效的语法——无论如何,如果这是表的主键,那么你不想更新它。

最后,正如 FunkFortyNiner 所指出的,eventa reserved word in MySQL,所以需要引用。

$q = 
    "INSERT INTO events(
        event_id, 
        `event`, 
        staff_booking_id, 
        is_read, 
        priority
    ) 
    VALUES(
        :event_id, 
        :event, 
        :staff_booking_id, 
        :is_read, 
        :priority
    ) 
    ON DUPLICATE KEY UPDATE 
        `event` = VALUES(`event`),
        staff_booking_id = VALUES(staff_booking_id),
        is_read = VALUES(is_read), 
        priority = VALUES(priority)";

【讨论】:

  • 还有EVENT被保留在mysql中的事情。我在他们在 cmets 的问题下添加了a note,以回应他们上面的问题。
  • @FunkFortyNiner:是的,你是对的,没有发现。我相应地编辑了我的答案......谢谢。
  • 我之前也没有发现,直到我注意到their comment 出现了一个新错误。这就是让我再次(仔细)查看他们的代码的原因。编辑:你知道;我很高兴即使在我关闭它之后你也能给出答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2023-01-09
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2019-09-28
相关资源
最近更新 更多