1

我最近听说很快 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)进行查询时,它工作得很好。

有什么建议么?

谢谢,

4

2 回答 2

2

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

于 2013-01-31T13:51:18.117 回答
0

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

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

但是使用良好的数据库访问库,您可以按照您尝试过的方式(徒劳地)使用原始 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);
于 2013-01-31T13:55:24.073 回答