4
function readDB($db,$event)
{
    try {
        $rows = array();
        $sql = "SELECT \"Red Score\", \"Blue Score\", red1, red2, red3, blu1, blu2, blu3 FROM Matches WHERE Event='$event' AND Type='Q' ORDER BY Number;";
        foreach($db->query($sql) as $row)
        {
            $rows[] = $row;
            echo count($row) . "<br/>";
        }
        printArray($rows);
    } catch(PDOException $e) {
        $rows = 'aids';
        echo $e->getMessage();
    }

    $db = null;
}

関連する関数は次のとおりです。クエリを実行し、結果を 2D 配列に入れます。条件なしで 1 つのフィールドのみを選択するようにクエリを変更しても、2 つのものが返されます。

コードは正しいデータを返します。各レコードが複製されます。つまり、8 行が 16 行になります。クエリを SQLite3 コンソールで実行すると、それぞれが 1 回ずつ返されます。
サンプル:
PHP:

51    51    27    27    836    836    435    435    1102    1102    245    245    88    88    1293    1293  
33    33    30    30    401    401    3489   3489   415     415     3475   3475   4722  4722  2655    2655  

SQLite3:

51    27    836    435    1102    245    88    1293  
33    30    401    3489   415     3475   4722  2655  

なぜこれが起こっているのか誰か説明できますか?

編集:申し訳ありません。ペーストを埋め込みコードに置き換えました。そうしようと思ったはずです。

EDIT EDIT: 解決策: PDOStatement::setAttribute(); でデフォルトのフェッチ モードを設定します。この問題の原因となっている FETCH_BOTH にデフォルト設定されています。解決策を探すのに間違った場所を探しました。
詳細については、ドキュメントをご覧ください: http://www.php.net/manual/en/pdostatement.fetch.php

4

1 に答える 1

10

デフォルトでは、PDO は列名と列番号でインデックス付けされた結果の配列をフェッチします (つまり、DB からの値は、2 つの異なるキーで配列に 2 回表示されます)。したがって、デフォルトのフェッチ モードを使用している場合は、おそらく結果セットのこれらの表現の両方を循環していることになります。ありがとう、リヴ、この説明は役に立ちます。

解決策: PDOStatement::setAttribute(); でデフォルトのフェッチ モードを設定します。この問題の原因となっている FETCH_BOTH にデフォルト設定されています。解決策を探すのに間違った場所を探しました。詳細については、ドキュメントをご覧ください: http://www.php.net/manual/en/pdostatement.fetch.php

于 2013-03-19T13:46:49.837 に答える