准备好的语句,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指出的,event
是a 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)";
我正在尝试向 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指出的,event
是a 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)";