首页 > 解决方案 > Prepared statements, SQLSTATE[HY093]: Invalid parameter number

问题描述

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

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

现在这只是一个测试,我计划在我真正得到一个查询工作后让它成为动态的。

$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);

标签: phpmysqlpdoprepared-statementon-duplicate-key

解决方案


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

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

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

最后,正如 FunkFortyNiner 所指出的,event它是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)";

推荐阅读