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

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 は初心者向けマニュアルの基本的なタスクにのみ適しており、実際の問題について開発者に実際の支援を提供するものではありません。
したがって、開発者は何らかの抽象化ライブラリを採用して、すべての汚い仕事を行わせる必要があります。

そこで、あらゆる点で PDO よりも優れたsafeMysqlの例を示します。

$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 関数で遊ぶことができる醜いコードとは異なり、このコードは読み取り可能です。これは重要事項です。1年ほど経っても、このコードが何をするのかがわかります。

NLZ の回答は完璧な例です。コードは不要で非常に不可解なコードで汚染されます。
コードを検索するときは、まずビジネス ロジックを探します。そして、SQL クエリのごく一部を作成することだけを目的としたこのような無用なコード ブロックは、目まいを起こさせ、本当の問題を隠してしまいます。内部のどこかに移動する必要があります

于 2013-02-20T08:52:54.263 に答える