2013-03-19 60 views
2
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; 
} 

這裏是相關的功能。它運行查詢並將結果放入二維數組中。更改查詢以僅選擇一個沒有條件的字段仍返回兩件事。pdo-> query()返回每個結果中的兩個?

該代碼返回正確的數據,只是每個記錄被複制,即一行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

+1

向我們展示一些代碼在這裏,請,不只是在撥弄 – 2013-03-19 04:29:51

+0

請你的代碼直接粘貼到這個問題,而不是發佈到像引擎收錄外部服務。外部代碼可以隨時消失,並且不存在像SO問題那樣的版本控制。因此,未來的讀者可能無法看到外部代碼,因此這個問題將毫無用處或沒有多大意義。 ** StackOverflow與其他人一樣關於未來的參考,因爲它是關於您今天得到您的問題的答案。** – 2013-03-19 04:40:26

+0

您還可以向我們展示回顯正在打印的內容。 – MatRt 2013-03-19 04:42:06

回答

8

「默認情況下PDO將獲取按列名索引的結果和列數(數組即從DB值在數組中出現兩次,有兩個不同的。鍵)。所以如果你使用默認的獲取模式,你可能會循環訪問結果集的兩個表示。謝謝,麗芙,這個解釋有幫助。

解決方案:使用PDOStatement :: setAttribute();設置默認的獲取模式。它默認爲導致此問題的FETCH_BOTH。我在錯誤的地方尋找解決方案。 文檔是在這裏,以獲取更多信息:http://www.php.net/manual/en/pdostatement.fetch.php

+0

我想我再也不能接受我自己的答案了。 – matt 2013-03-19 13:48:19

+0

當我遇到同樣的問題時,設置默認提取模式非常有用。 http://stackoverflow.com/a/4386731/46971 – GabrielC 2014-08-19 08:22:21