fetch(PDO::FETCH_ASSOC)は指定しなくても1行ずつ取得する【PHP MySQL】

コード

try{
    $dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';
    $user = 'root';
    $password = '';
    $dbh = new PDO($dsn,$user,$password);
    $dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    
    $sql = 'SELECT code,name FROM mst_staff WHERE 1';
    $stmt = $dbh ->prepare($sql);
    $stmt -> execute();

    $dbh = null;

    print 'スタッフ一覧<br>';

    print '<form method="post" action="staff_edit.php">';
    while(true){
    //ここの部分はwhileループで1行ずつ取得している
        $rec = $stmt -> fetch(PDO::FETCH_ASSOC);
        if($rec == false){
            break;
        }
        print '<input type="radio" name="staffcode" value="'.$rec['name'].'">';
        print $rec['name'].'<br>';
    }
    print '<input type="submit" value="修正">';
    print '</form>';

}catch(Exception $e){
    print 'ただいま障害により大変ご迷惑をおかけしております。';
    // print "エラーメッセージ: " . $e->getMessage();
    exit();
}

$rec - $stmt->fetch(PDO::FETCH_ASSOC)について


$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
の行は、PDO(PHP Data Objects)を使用してデータベースからデータを取得する際の重要な部分です。この行が具体的に何をしているかを説明する前に、いくつかの基本的な事項を理解する必要があります。

PDOとは?

PDOは、PHPからさまざまなデータベースに対して統一的な方法でアクセスするためのインターフェースです。PDOを使用することで、データベースの種類に依存せずにデータを取得したり、操作したりすることが可能になります。

fetch()メソッド

fetch()メソッドは、SQLクエリの結果から次の行を取得します。このメソッドは様々な形式でデータを返すことができますが、PDO::FETCH_ASSOCオプションを使用すると、結果を「連想配列」として取得できます。

PDO::FETCH_ASSOC

PDO::FETCH_ASSOCオプションを使用すると、列名をキーとした連想配列として結果セットの行を取得できます。つまり、データベースのフィールド名をそのままキーとして使用して、その値にアクセスすることができるようになります。


mst_staffテーブルからcodename列を選択している場合、各行は次のような連想配列として$recに格納されます。

[
    "code" => "選択された行のコード",
    "name" => "選択された行の名前"
]

mst_staffが5行あるとしたら、whileの中で毎回5行を取得しているの?


答えはいいえ。whileループの中で毎回5行を取得しているわけではありません。whileループと$stmt->fetch(PDO::FETCH_ASSOC);の組み合わせは、データベースの結果セットから1行ずつデータを取得して処理するために使用されます。
具体的には、$stmt->fetch(PDO::FETCH_ASSOC);がループの各繰り返しで呼び出されるたびに、結果セットの「次の行」が連想配列の形式で$recに格納されます。そして、その行のデータが処理された後(この場合はHTMLのラジオボタンとして出力されます)、ループは次の繰り返しに進み、次の行が存在する場合はそれを取得します。行がもう存在しない場合($stmt->fetch(PDO::FETCH_ASSOC);falseを返す場合)、whileループは終了します。
つまり、mst_staffが5行ある場合、このwhileループは5回繰り返されます。ループの各繰り返しで1行ずつデータが取得され、全ての行が処理された後にループが終了します。
この方法により、結果セットに含まれる行の数にかかわらず、1行ずつ効率的にデータを処理することができます。これは、大量のデータを扱う場合に特に役立ちます。全てのデータを一度にメモリに読み込むのではなく、必要な時に1行ずつ取得することで、メモリの使用量を節約し、アプリケーションのパフォーマンスを向上させることができます。


この記事が気に入ったらサポートをしてみませんか?