こしあん日記 ~写真と猫とサッカーと~

子供たちの記録用にはじめたが、思春期になり写真を撮らせてもらえなくなる。写真と愛猫とサッカーが中心のブログです。

mysqliクラスを利用したDB連携処理の覚書(その1)

PHPのバージョン5.5以上からMySQLの拡張モジュールmysql_queryが非推奨になり、バージョン7以降は利用できなくなった。
代わりのモジュールとしてmysqliとPDO(PHP Data Objects)が用意された。

最近プログラミングもするようになった私にとって、過去のことはどうでもいい(新しいモジュールの無いサーバでの仕事はノーサンキュー)ので、新しいモジュールを使うわけだが、PDOの方がデータベースを選ばないので汎用性は高いが、fetch関連がいろいろややこしいと聞いたのでmysqliを選択。(後日fetch関連はmysqliもPDOと特に変わりがないことに気づきショック)

基本的に設定ファイルに書き込む内容になると思うが、一応備忘録として残しておこうと思う。
記述はオブジェクト型を採用している。



データベースとの接続

$mysqli = new mysqli('ホスト名','ユーザー名', 'パスワード','データベース名');
if( $mysqli->connect_errno ) {
	echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
exit();
}

2行目以降はデータベースへの接続ができなかった場合の処理。

データの抽出(SELECT文)

$stmt = $mysqli->query("SELECT * FROM テーブル名 WHERE 条件");

SELECTの後ろの*(アスタリスク)は指定したテーブルのカラムすべてを抽出する意味。
特定のカラムのみ抽出する場合はカラム名を指定する。

上記でデータベースの指定テーブルから抽出処理をしただけなので、抽出した情報を利用する場合は

$stmt = $res->fetch_assoc();

変数に抽出内容を配列で渡してあげたり

$count = $stmt->num_rows;

変数に抽出件数を渡してあげたり
とやりたいことに応じて処理が必要になる。

プリペアドステートメントを使ったデータの抽出(SELECT文)

変数など情報を書き換えれるものを利用し、データベースに処理を行う場合は、プログラマの意図しない処理をされないようにプリペアドステートメントを利用する。
イメージ的には使うときだけ開いて、必ず閉じる処理を行うことと、SQL文中にPHPの変数を書かず、後で紐づけ(バインド)することでSQLインジェクション対策ができている感じ。
記述ルールに癖があり結構戸惑った。

$stmt = $mysqli -> prepare("SELECT * FROM テーブル名 WHERE id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$stmt->close();

今回はWHERE句の条件としてid = $user_idとしてみた。
1行目のWHERE句ではid = ?とし、
2行目のbind_paramで?は$user_idという紐づけを行う。ちなみにiはintのi。
3行目のexecuteで処理を実行し
4行目でプリペアを閉じる。

しかし、このままでは$stmtはPHPで利用できる値は入っていない(入っているのは抽出処理をしたという結果だけ)ので、プリペア閉じる前に処理が必要になる。
例えば、結果を変数に配列で入れる場合はexecuteした後に

$result = $stmt->get_result();
$aaaa = $result->fetch_all(); 

と記述すると$aaaaに配列で情報が入る。

(次回へ続く)