php - 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);
解决方案
正如 FunkFortyNiner 和 tadman 所评论的那样,问题可能来自您正在重用同一个占位符这一事实。
实际上 MySQL 语法并不要求您重用命名参数:您可以使用VALUES()
来引用最初为 传递的值INSERT
。
此外,您尝试更新event_id
usingLAST_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)";
推荐阅读
- vim - 无法从 vimrc (mac) 成功使用自定义映射的 vim 命令
- sql - 如果运行超过 20 分钟,Postgresql 将终止查询
- javascript - 用于绘制图像的 for 循环
- express - 如果我将所有内容都包含在 jwt 有效负载中,是否需要在数据库中查找用户?
- salesforce - 在 SalesForce 中构建报告/仪表板
- android - 如何在 Google Maps Android 上“增加” VisibleRegion 的大小
- r - 如何在 R 中读取带有初始标签的 XML 文件
- python - 如何修复我的 pandas 数据框中的索引以不将值仅保持为零,并增加值?
- python - 如何将列表列表拆分为字典键/值对?
- python - 如何从列表中获取二维列表但在另一个列表中定义形状