今日はPHP+MySQLで私がよく使っている構文をまとめます。
このようなテーブルを用意し、
機械的にPHPの配列にハッシュつきで変換する。
利点
・SQLを変更するだけで全てのテーブルパターンに対応できる。
・マスタを一発で読み取る場合等、多くの形式で使用できる
・テーブルの中身を知らなくても実装できる(ある意味デメリットでもある)
・大量のデータを様々な条件で取得や解析する場合に割と高速に動作する
・テーブルの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 は変数の名前空間を汚しがちになるので、なるべく関数内等で分離するとよいかも。
ID | name | address |
---|---|---|
1 | Sato | Tokyo |
2 | Takahashi | Saitama |
3 | Suzuki | Seattle |
このようなテーブルを用意し、
機械的に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 = "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
}
利点$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 は変数の名前空間を汚しがちになるので、なるべく関数内等で分離するとよいかも。