MySQL PDO INSERT ... SELECT IF 语句不起作用
Posted
技术标签:
【中文标题】MySQL PDO INSERT ... SELECT IF 语句不起作用【英文标题】:MySQL PDO INSERT ... SELECT IF statement not working 【发布时间】:2016-06-10 05:40:27 【问题描述】:编辑:愚蠢的变量名不匹配。即使经过多年的编码,也会犯一些简单的错误。
$query = "
INSERT INTO table1 (team_id, user_id, team_leader, start_date)
SELECT b.team_id,
a.user_id,
IF (a.agent_id = :leader, 1, 0),
:startdate
FROM table2 a
LEFT JOIN table3 b ON a.ccb_team_id = b.ccb_team_id
WHERE b.team_active = 1
AND a.user_active = 1
AND b.metro_id = :metroid
AND a.ccb_team_id = :teamid
ON DUPLICATE KEY
UPDATE team_leader = VALUES(team_leader)";
数据:
$query_data = array(
':metroid' => $metro_id,
':leader' => $a->ccb_leader_id,
':startdate' => $datetime,
':teamid' => $a->ccb_team_id
);
如果我在 phpMyAdmin 中使用 PDO 变量所在的实际数据尝试上述查询,则它可以正常工作,并将相关用户的 team_leader 正确设置为 1。在 PHP CLI 中运行,它不起作用,所有 team_leader 字段都恢复为 0。
我已验证 $a->ccb_team_leader
包含正确的信息。 PDO 变量在 IF 语句中不起作用吗?
编辑:所以在我的 PDO 查询中使用它时,这似乎实际上是某种对象问题。来自 simplexml 的对象 $a 输出值很好,但在查询中使用时却没有输出......
【问题讨论】:
字段名和表名不能绑定。结束了。 它不是字段或表名,它是一个值。 IF(a.agent_id = 123456,1,0).:startdate FROM table2
文字可能出现在 SELECT 列表中。
试试case而不是IF(a.agent_id=:leader,1,0)
? case when a.agent_id=:leader then 1 else 0 end
a.agent_Id 和 :leader 是什么数据类型?也许 if 函数遇到了数据类型不匹配的问题?
【参考方案1】:
您必须重写查询,以便参数位于 where 子句中。请参阅文档中的示例:http://php.net/manual/en/pdostatement.bindparam.php。
或者您可以自行转义文字并将其直接添加到您的查询字符串中。
【讨论】:
谢谢,我不知道 PDO 绑定只能存在于 WHERE 子句中。我会自己逃避。它不应该给出错误吗?它同时处理 IF 和 CASE 版本,没有错误。 @DaveK,您可以在查询中的任何位置使用bind
参数/值作为value replacements
。您不限于where
子句。
我正要问这个问题,因为它仍然不起作用。我已经在 SELECT 中尝试了 IF 或 CASE ,并将变量添加到查询字符串而不是 PDO 中,它仍然无法在 CLI 上运行,但在 phpmyadmin 上很好,所以这是我缺少的其他东西.....
我还找不到更好的来源,但这个bug report 及其修复也表明绑定值可能出现在SELECT
列表中,而不仅仅是WHERE
子句中。
以上是关于MySQL PDO INSERT ... SELECT IF 语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章