【问题标题】:MySQL PDO statement with IN clause?带有 IN 子句的 MySQL PDO 语句?
【发布时间】:2026-02-19 01:30:01
【问题描述】:

我最近听说很快 PHP 将弃用所有传统的 mysql 函数(例如:mysql_query()、mysql_num_rows() 等...)。话虽如此,我正在尝试将所有查询转换为 PDO 格式。这个特殊案例给我带来了一些困难,

$team = $_GET['team'];
$ncaa = array("Duke", "Harvard", "Yale", "Stanford");
$limit = idate('z')+14;

$list = join("','", $ncaa);

            $query = "SELECT game_id
                    FROM ncaa_current_season_games
                    WHERE game_date_int >= :game_date_int 
                    AND (home_team = :team OR away_team = :team) 
                    AND home_team IN(:list)
                    AND away_team IN(:list)
                    ORDER BY game_date_int ASC 
                    LIMIT 1";               
            $stmt = $db->prepare($query);
            $stmt->execute(array(':game_date_int' => $limit, ':team' => $team, ':list' => $list));

$num = $stmt->rowCount();

$num 返回为 0。当我使用旧格式(不是 PDO)进行查询时,它工作得很好。

有什么建议吗?

谢谢,

兰斯

【问题讨论】:

  • 我的调试技巧是使用 $stmt->getQuery()->__toString(); 获取最终的 sql,然后在 db 上执行并查找条件,因为如果你不这样做,则相反t 得到任何错误可能查询是正确的,只是不满足您的条件。恕我直言

标签: php mysql pdo


【解决方案1】:

您不能将:list 用作 in 子句的一个占位符,您需要一个占位符来表示一个值。

【讨论】:

    【解决方案2】:

    与任何其他原始 API 一样,PDO 不足以完成任何实际任务。
    准备好的语句也不够用,因为它们只接受 标量数据,而不接受任何复杂的数据类型或任意查询部分。
    因此,开发人员必须帮助自己采用数据库抽象库
    并在他们的应用程序代码中使用这个库方法,而不是原始 API 调用。

    使用原始 PDO,您需要创建 ?动态标记每个 IN 语句值,使用 str_repeat() 函数或类似的东西,将每个值添加到数据数组,然后运行所有火车。
    您可以在此站点上找到大量示例。他们中的一些人虽然很聪明。

    但是有了良好的数据库访问库,您可以按照您尝试(徒劳地)使用原始 PDO 的方式进行操作

    $team = $_GET['team'];
    $ncaa = array("Duke", "Harvard", "Yale", "Stanford");
    $limit = idate('z')+14;
    
    $query = "SELECT game_id
            FROM ncaa_current_season_games
            WHERE game_date_int >= ?s 
            AND (home_team = ?s OR away_team = ?s) 
            AND home_team IN(?a)
            AND away_team IN(?a)
            ORDER BY game_date_int ASC 
            LIMIT 1";               
    $data = $db->getRow($query, $limit, $team, $team, $list, $list);
    

    【讨论】: