2017-02-14 67 views
-3

我是PDO的新手,無法將提取結果放入數組中。MYSQL/PHP:使用帶PDO的FetchAll創建數組

以下代碼成功查詢數據庫。不過,我想將結果放入一個數組中,以便我可以單獨處理數組中的元素。我不確定下面是什麼$result。它已經是一個數組了嗎?或者它是什麼。我想我需要使用fetchAll來獲取數組。如果是這樣,將不勝感激適當的代碼做到這一點。或者如果$results已經是一個數組,那麼與fetchAll會有什麼區別?

//USE PDO TO CONNECT TO DBASE 
$hostdb = "my host"; 
$namedb = "mydb"; 
$passdb = "bypass"; 
$userdb = "myusername"; 

try { 
    // Connect and create the PDO object 
    $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb); 
    $conn->exec("SET CHARACTER SET utf8");  // Sets encoding UTF-8 

    // Define and perform the SQL SELECT query 
    $sql = "SELECT * FROM `comments` WHERE `userid` IN(118)"; 
    $result = $conn->query($sql); // THIS WORKS 
// $result = $sql->fetchAll(PDO::FETCH_OBJ); //THIS DOES NOT WORK 
    if($result !== false) { 

    // Parse the result set 
    foreach($result as $row) { 
     echo $row['id']. ' - '. $row['name']. ' - '. $row['category']. ' - '. $row['link']. '<br />'; 
    } 
    } 

    $conn = null;  // Disconnect 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 
+1

它返回一個對象,但你可以遍歷任何物體或array.For使用fetchall你需要執行準備,RTFM.Didnt downvote你BTW – Mihai

+1

使用fetchall將返回完整結果集變成一個變量。該變量是一個數組,結果集中每一行發生一次。根據您在fetchAll中使用的參數,它將是一個行數組或行對象數組。 – RiggsFolly

+0

\ PDO :: FETCH_ASSOC和\ PDO :: FETCH_NUM允許您定義讀取模式。 \ PDO :: FETCH_ASSOC將返回只有字段=>值數組,而\ PDO :: FETCH_NUM返回數組與數字鍵 – bxN5

回答

1

fetchAll會將完整的結果集返回到變量中。該變量是一個數組,結果集中每一行發生一次。根據您在fetchAll中使用的參數,它將是一個行數組或行對象數組。

但你有一些小錯誤在你的語法

// Define and perform the SQL SELECT query 
$sql = "SELECT * FROM `comments` WHERE `userid` IN(118)"; 

$result = $conn->query($sql); 
if($result !== false) { 

    // use $result here as that you PDO::Statement object 
    $allRows = $result->fetchAll(PDO::FETCH_OBJ); 

    // Parse the result set 
    foreach($allRows as $row) { 
     // also amend here to address the contents of the allRows i.e. $row as objects 
     echo $row->id. ' - '. $row->name. ' - '. $row->category. ' - '. $row->link. '<br />'; 
    } 
+0

這是有道理的。它不會拋出錯誤。但是,$ allRows似乎是空的,無論是在代碼中還是使用print_r迭代。在原始代碼中,它回顯了約10行,因此它不是空的。 – zztop

+0

我有一個錯字'$ row> name'應該是'$ row-> name'就這麼簡單嗎? – RiggsFolly

+0

是的,讓它工作。非常感謝! – zztop

0

首先要知道什麼是$result使用var_dump($result)因爲PDO::query方法返回一個PDOStatement對象的對象。此外,在你的情況下,它不是一個數組,它是一個PDOStatement對象。請參閱http://php.net/manual/en/pdo.query.php。 之後,我建議使用PDO::prepare()PDO::execute()方法來運行您的SQL查詢,因爲它性能友好,特別是如果您要通過防止SQL注入來多次運行並更安全。請參閱http://php.net/manual/en/pdo.prepare.php。 畢竟,PDO::fetchAll()將返回你已經想要的結果集的數組。請參閱PHP PDO::fetchAll()手冊。 所以我會做的是:

$sql = "SELECT * FROM `comments` WHERE `userid` IN(118)"; 

$statement = $conn->prepare($sql); 
if($statement->execute()) 
{ 
    $results = $statement->fetchAll('Your prefered fetch style'); 

    foreach($results as $result) { 
     ... 
    } 
}