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;
}

这是相关的功能。它运行查询并将结果放入二维数组。将查询更改为仅选择一个没有条件的字段仍会返回两件事。

代码返回正确的数据,只是每条记录重复,即一行8 变成一行16。在SQLite3 控制台中运行的查询返回每件事一次。
示例:
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  

谁能解释为什么会这样?

编辑:我很抱歉。我已经用嵌入式代码替换了粘贴。应该想到这样做。

编辑编辑:解决方案:使用 PDOStatement::setAttribute(); 设置默认获取模式 它默认为导致此问题的 FETCH_BOTH。我在错误的地方寻找解决方案。
文档在这里,更多信息:http ://www.php.net/manual/en/pdostatement.fetch.php

4

1 回答 1

10

'默认情况下,PDO 将获取由列名和列号索引的结果数组(即,来自 DB 的值在数组中出现两次,具有两个不同的键)。因此,如果您使用的是默认获取模式,您可能会在结果集的这两种表示中循环。谢谢你,丽芙,这个解释很有帮助。

解决方案:使用 PDOStatement::setAttribute(); 设置默认的获取模式;它默认为导致此问题的 FETCH_BOTH。我在错误的地方寻找解决方案。文档在这里,更多信息:http ://www.php.net/manual/en/pdostatement.fetch.php

于 2013-03-19T13:46:49.837 回答