Simpleエンジニア

システム開発の備忘録

[PHP][MySQL] PHP+MySQLでDB→配列に変換する定型文

2010年04月20日 20時39分19秒 | PHP
今日はPHP+MySQLで私がよく使っている構文をまとめます。

IDnameaddress
1SatoTokyo
2TakahashiSaitama
3SuzukiSeattle

このようなテーブルを用意し、
機械的にPHPの配列にハッシュつきで変換する。
  • MySQLのFetch関数を利用する
$my = new MySQLi("myhost","user","pass", "mydb");
$sql = "SELECT * FROM mytable ";
$result = $my->query($sql);
$table_array = array();  // テーブル情報を格納する変数
while($row = $result->fetch_assoc() ){
  $table_array[] = $row;
}

利点
・SQLを変更するだけで全てのテーブルパターンに対応できる。
・マスタを一発で読み取る場合等、多くの形式で使用できる
・テーブルの中身を知らなくても実装できる(ある意味デメリットでもある)

  • プリペアドステートメントを使用する
$my = new MySQLi("myhost","user","pass", "mydb");
$sql = "SELECT id, name, address FROM mytable WHERE id >= ?";
$pstmt = $my->prepare($sql);
$pstmt->bind_param("i", $min_id);  // ※1

$table1 = array();  // テーブル情報を格納する変数

$min_id = 2;  // ※1
$pstmt->execute();
$pstmt->bind_result($id, $name, $address);  //※2
// 検索結果の取得開始
while( $pstmt->fetch() ){
  $table1[] = compact("id", "name", "address");
}

$table2 = array();
$min_id = 3;
$pstmt->execute();
$pstmt->bind_result($id, $name, $address);  //※2
// 検索結果の取得開始
while( $pstmt->fetch() ){
  $table2[$id] = compact("id", "name", "address");
  // $table2[$id]["名前"] = $name;  // ※3
}

利点
・大量のデータを様々な条件で取得や解析する場合に割と高速に動作する
・テーブルのfield名と、配列のkey名を変更したい場合に、※3といった利用方法が可能

※1 bind_paramの使い方に注意。
 第1引数・・・対応するバインド変数の型 2番目以降の引数とSQLに依存
 第2引数以降・・・バインドする変数( "2" 等、変数でないものを入れるとエラー)
詳しくは http://www.php.net/manual/ja/mysqli-stmt.bind-param.php

※2 bind_result は execute() と fetch() の間で使用する。
 bind_result, compact, extract は変数の名前空間を汚しがちになるので、なるべく関数内等で分離するとよいかも。