准备好的语句,SQLSTATE [HY093]:参数编号无效

Prepared statements, SQLSTATE[HY093]: Invalid parameter number

我正在尝试向 insert/update a table 编写查询,这是我第一次使用准备好的语句,我收到了错误 SQLSTATE[HY093]: Invalid parameter number 但尽我所能看到我通过了所有要求的 columns/values。

(我尝试在不使用 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 所评论的那样,问题可能是因为您重复使用了相同的占位符。

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

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

最后,正如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)";