我正在将我的所有查询切换为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)
IN不能像其他值一样参数化.所以只需要使用内插占位符和值.我一直在考虑尝试在PHP中实现它一段时间.然而,我从来没有考虑过这个问题.
我也看到你:list在查询中有两次相同的命名参数().如果您使用真实的预准备语句,这也是不可能的.请注意,当您使用mysql驱动程序和PDO时,您必须禁用模拟的预准备语句.
小智 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)
还没有测试过,但我想你知道我在尝试什么
| 归档时间: |
|
| 查看次数: |
3371 次 |
| 最近记录: |