web-dev-qa-db-ja.com

PDOはテーブルから1列を1次元配列にフェッチします

私はPDOにかなり慣れていないため、MySQLで動作させることができます。新しいデータを挿入して単一の結果を取得することに問題はないようですが、これは行き詰まっています。

材料で構成されたテーブルがあります。すべての材料を1つの配列にしようとしています。

クエリを直接SQLで実行したところ、すべての結果が表示されましたが、PDOではfetchだけではこれを取得できません。以下のようにfetchAllアプローチを使用すると、すべての結果が得られますが、配列だけではなく多次元配列になります。

別のfetchメソッドはありますか、または結果を$a[]に追加するループを作成する必要がありますか?

$ingredient_q = "SELECT
        `ingredient_name`
         FROM
            `ingredients`
        ";

$ingredient_stmt = $pdo->query($ingredient_q);

$ingredient_stmt ->setFetchMode(PDO::FETCH_ASSOC);

$a = $ingredient_stmt->fetchAll();

私が試したこと:

$a = $ingredient_stmt->fetchAll(); // Returns a multidimensional array (not what I want)
$a = $ingredient_stmt->fetch(); // Returns one single result (the first entry)
$a[] = $ingredient_stmt->fetch(); // Returns one single result but in a multidimensional array.

どんな助けでも大歓迎です。

21
SamesJeabrook
<?php
$sql = "SELECT `ingredient_name` FROM `ingredients`";
$ingredients = $pdo->query($sql)->fetchAll(PDO::FETCH_COLUMN);
66
Tanatos

フェッチした行をforeachまたはwhileする必要があります。

foreach ($ingredient_stmt->fetchAll() as $row) {
var_dump($row);
}

while ($row = $ingredient_stmt->fetch()) {
var_dump($row);
}

どちらも少し等価ですが、foreachは大きな配列をロードするときに大きなメモリロードを生成しますが、whileは一度に1行取得します。

fetchfetchAllの使い方に注意してください。前者はしばらくの間、各行を1つずつ移動し、後者はforeachを対象としています。