2017-02-14 8 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はところで – Mihai

+1

fetchAllのは完全に返されますあなたをdownvote結果を変数に変換します。その変数は配列であり、結果セットの各行に1つ存在します。 fetchAllで使用するパラメータに応じて、行配列の配列または行オブジェクトの配列 – RiggsFolly

+0

\ PDO :: FETCH_ASSOCおよび\ PDO :: FETCH_NUMを使用すると、フェッチモードを定義できます。 \ PDO :: FETCH_ASSOCはフィールド=>値配列のみを返すのに対し、\ PDO :: FETCH_NUMは数字キーを配列に返す – bxN5

答えて

1

fetchAllは完全な結果セットを変数に返します。その変数は配列であり、結果セットの各行に1つ存在します。 fetchAllで使用するパラメータによっては、行配列の配列または行オブジェクトの配列になります。

しかし、あなたは$resultPDO::query方法はPDOStatementオブジェクトを返しますので、var_dump($result)を使用しているものを確認するために、まず第一に、あなたの構文で

// 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

私はtypo '$ row> name'を '$ row-> name'にする必要があります。 – RiggsFolly

+0

はい、うまくいきます。どうもありがとう! – zztop

0

をいくつかの少しの誤差があります。さらに、あなたの場合は配列ではなく、PDOStatementオブジェクトです。 http://php.net/manual/en/pdo.query.phpを参照してください。 その後、私はあなたがSQLインジェクションからあなたを防ぐことによって、複数回それを実行し、より安全になるなら、性能に優しいので、PDO::prepare()PDO::execute()メソッドを使用して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) { 
     ... 
    } 
} 
関連する問題