带有IN子句的MySQL PDO

Lan*_*nce 5 php mysql pdo

我正在将我的所有查询切换为PDO格式,而我特别遇到涉及IN()子句的问题.

$nba[0] = "Boston Celtics";
$nba[1] = "New York Knicks";
$nba[2] = "Houston Rockets";

$query = "SELECT game_id
        FROM table
        WHERE date_int >= :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(':date_int' => $limit, ':team' => $team, ':list' => implode(',', $nba)));
Run Code Online (Sandbox Code Playgroud)

Pee*_*Haa 6

IN不能像其他值一样参数化.所以只需要使用内插占位符和值.我一直在考虑尝试在PHP中实现它一段时间.然而,我从来没有考虑过这个问题.

我也看到你:list在查询中有两次相同的命名参数().如果您使用真实的预准备语句,这也是不可能的.请注意,当您使用mysql驱动程序和PDO时,您必须禁用模拟的预准备语句.

  • +1表示非法多次使用相同参数(:list)以及有关禁用模拟预准备语句的其他信息.谢谢PeeHaa (2认同)

小智 4

你可以这样解决这个问题:

$nba = array();
$nba[0] = "Boston Celtics";
$nba[1] = "New York Knicks";
$nba[2] = "Houston Rockets";

$params = array(':date_int' => $limit, ':team' => $team);
$nba_teams = array();
for($i=0;$i<count($nba);$i++){
    $nba_teams[] = ':list' . $i;
    $params[':list' . $i] = $nba[$i];
}

$query = "SELECT game_id
    FROM table
    WHERE date_int >= :date_int 
    AND (home_team = :team OR away_team = :team) 
    AND home_team IN(".implode(',', $nba_teams).")
    AND away_team IN(".implode(',', $nba_teams).")
    ORDER BY game_date_int ASC 
    LIMIT 1";            

$stmt = $db->prepare($query, $params);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

还没有测试过,但我想你知道我在尝试什么