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 は変数の名前空間を汚しがちになるので、なるべく関数内等で分離するとよいかも。

4月19日(月)のつぶやき

2010年04月20日 02時52分30秒 | 日記
09:51 from Tween
【爆笑生活】私の目の前でふんばってウ○チするわが子
10:44 from Tween
※関係者各位 本日は携帯電話をおうちにわすれてしまったので、電話メールには反応できません。
運が良ければわが子が電話に・・・でるわけないか。
12:27 from Tween
PS3のTorne同梱版は限定生産だったので、今後は生産無いらしい。
なんだかんだでゲーム機の限定版ばかり買い続けてるなぁ
DSLite > PSP(2000) > DSi > PS3
16:42 from Tween
うちの子は携帯電話で電話をかけた回数2回、電源を入れた回数2回・・・子供って不思議ですね RT @koi_naru: ウチの子はXperia使うぞ(笑) RT @the_simple_1500: ※関係者各位 本日は携帯電話をおうちにわすれてしまったので、電話メールには反応でき
16:45 from Tween
3級勉強しようと思ったら楽勝そうに感じ、問題見るだけで自己満足。 RT @riumama: 漢検って、うけて何か意味ある検定なのか?
16:50 from Tween
俺はハード売らないからなぁ。集めるのがある意味趣味。ちなみにソフトも。ほんとにいらないソフトは売るが・・・ RT @romagico: @the_simple_1500 でも限定生産とかのハードってそのゲーム廃れるとなんとも言えない雰囲気になるからいや。ソフトは売れるがハードを
16:51 from Tween
ベガスのチョコ食い過ぎた。やるぞー
17:49 from Tween
手が腱鞘炎かも。あ、雷鳴った
18:01 from Tween
京王線・都営新宿線 橋本~神保町 朝7:18→8:42
ちなみに昼間は急行でぴったり1時間
by the_simple_1500 on Twitter