2012-10-02 50 views
1

我有一個字段「ID」一個簡單的表格,當我執行此代碼...PDO顯示出比預期

$dbh = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass); 

$sql = 'SELECT * FROM logolist'; 
$q = $dbh->query($sql); 
while($r = $q->fetch()){ print_r($r); } 

...我得到這個輸出更多結果:

Array 
(
    [ID] => 2 
    [0] => 2 
) 
Array 
(
    [ID] => 4 
    [0] => 4 
) 

如您所見,字段「ID」下有一個[0]。如果我添加更多的字段,我會不斷在數組中獲得更多的額外元素。就像每個領域都在輸出它的價值2次。

這是爲什麼?

+2

您是否試圖與'而($ R = $ Q->取(PDO :: FETCH_ASSOC)){的print_r($ R); }'? –

+0

爲什麼人們使用while循環來獲取PDO結果? –

+0

當你用'mysql_ *'工作大約10年時,你有一個小偏執狂,並且一遍又一遍地做同樣愚蠢的事情。我相信你有我的觀點@ N.B。 :) –

回答

1

我現在遇到具有獲取MySQL的結果循環的這種做法,我想知道爲什麼人們這樣做,所以我會寫下這個答案,並嘗試澄清一些事情。

1)你不需要循環來獲取結果 2)你得到結果重複的原因是因爲你正在接收一個關聯數組和基於索引的結果。這是默認行爲。

你可以做的是這樣的:

$dbh = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass); 

// Tell PDO to throw exceptions in case of a query error 
$dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

try 
{ 
    $result = $dbh->query("SELECT * FROM logolist")->fetchAll(PDO::FETCH_ASSOC); 

    // Your result is now in $result array which is associative. 
    // If it's empty - no results were found. 
    // In case of an error, you'd go to catch block of the code and you'd echo out an error. 
} 
catch(PDOException $e) 
{ 
    echo "Error reported: ". $e->getMessage(); 
} 
+0

不建議使用此方法。如果您想使用PDOStatement對象,則無法這樣做。 –

+0

我很抱歉,但我認爲你在這裏。如果您有任何消息來源聲稱不建議使用此方法 - 請發佈它們以支持您的聲明,並請說明在此特定情況下您將無法使用PDOStatement。 –

+0

你怎麼樣?就像你說的,'$ result'現在是一個數組。您無法對原始的「PDOStatement」對象執行任何操作,因爲其引用已丟失。另外,關於PHP中方法鏈接的爭論非常激烈,總的來說,最強烈的爭論是,它阻礙了可讀性,並且很難理解它的最終結果。在這種情況下,有價值的'PDOStatement'對象也會丟失。如果你想說,再次執行查詢,你將無法這樣做(不創建另一個查詢和另一個實例)。 –

1

您正在提取數字和關聯。

檢查PDO文檔:

http://php.net/manual/en/pdostatement.fetch.php

(你正在使用PDO :: FETCH_BOTH(默認))

+0

很好,你如何解決它? :) –

+0

閱讀頁面。它有例子。 –

+0

http://i1.kym-cdn.com/photos/images/original/000/210/119/+_2acc5a8841f8752904d37f90a8014829.png,它應該出現在你的答案中。從Google訪問此頁面的人不想點擊3個不同的網站來獲得答案,同樣,如果提供完整的答案,則會獲得更多選票。 –

4

,對於fetch()是正常的,沒有任何屬性(它的套FETCH_BOTH默認情況下)。它的工作原理與舊的mysql_fetch_array()0是數字索引。

如果切換到聯想將只得到字段:

while($r = $q->fetch(PDO::FETCH_ASSOC)){ 
    print_r($r); 
} 

PDOStatement::fetch - 爲所有樣式。

1
while($r = $q->fetch(PDO::FETCH_ASSOC)){ print_r($r); } 

PDO::FETCH_ASSOC只會得到帶有關聯鍵的值,沒有數字索引。