コード
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テーブルからcodeとname列を選択している場合、各行は次のような連想配列として$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行ずつ取得することで、メモリの使用量を節約し、アプリケーションのパフォーマンスを向上させることができます。
コメントを残す