5

我正在将所有查询转换为 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)));
4

3 回答 3

6

IN不能像其他值一样参数化。所以只需要使用 implode 占位符和值。不过,我一直在考虑尝试在 PHP 中实现它。然而,我从来没有比考虑它更进一步。

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

于 2013-02-20T08:44:41.540 回答
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();

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

于 2013-02-20T09:23:30.293 回答
0

PDO 在这种情况下非常弱,因此这项任务将非常繁琐。
与任何其他 API 一样,PDO 仅适用于初学者手册中的基本任务,并且对于任何现实生活中的问题都没有为开发人员提供真正的帮助。
因此,开发人员必须采用某种抽象库来让它完成所有肮脏的工作。

所以,我会给你一个safeMysql的例子,它在任何方面都比 PDO 更好:

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

$query = "SELECT game_id
        FROM table
        WHERE date_int >= ?i 
        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->getAll($query, $limit, $team, $team, $nba, $nba);

看 - 这段代码是整洁、简洁和确定的。它只做有意义的事情,隐藏了绑定复杂数据的所有脏活。与丑陋的代码不同,您可以使用一些 PHP 和 API 函数,此代码是可读的。这是很重要的事情。即使在一年左右之后,您也可以知道这段代码做了什么。

NLZ 的答案是一个完美的例子——代码被不必要的、令人费解的代码污染了。
当您查找代码时,您首先要查找业务逻辑。而这种无用的代码块,只是为了创建一小部分的SQL查询,会让你头晕目眩,把真正的事情瞒着你。
In应该移到内部内部的某个地方。

于 2013-02-20T08:52:54.263 回答