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 语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 性能不佳 INSERT 或 PHP PDO

MySQL PDO INSERT ... SELECT IF 语句不起作用

通过 PDO 扩展与 MySQL 数据库交互(下)

MySQL与PDO [重复]

pdo连接mysql操作方法

mysql execute() (PDO) 不在表中插入任何内容