PDOより高速なmysqliの使い方とまとめ[データベース操作]
PHPで汎用的にデータベースを操作をする「PDO」クラスがありますが、データベースが「MySQL」の場合は「mysqli」クラスを使用したほうが高速で処理をする事が可能となっています。今回は「mysqli」の使い方をまとめました。
事前準備
データベースを操作する前に次のテーブルとデータを設定します。「mysqli」の使い方だけを見たい方は飛ばしても構いません。
[テーブル]
CREATE TABLE IF NOT EXISTS mst_book ( no int(11) NOT NULL AUTO_INCREMENT, title varchar(50) NOT NULL COMMENT 'タイトル', author varchar(50) NOT NULL COMMENT '作者', price int(11) NOT NULL COMMENT '価格', PRIMARY KEY (no), KEY author (author), KEY Price (price) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
[データ]
INSERT INTO mst_book (no, title, author, price) VALUES (1, '学問のすゝめ', '福澤諭吉', 880), (2, '注文の多い料理店', '宮沢賢治', 600), (3, '脱亜論', '福澤諭吉', 980), (4, '銀河鉄道の夜', '宮沢賢治', 1280), (5, '羅生門', '芥川龍之介', 680), (6, '風の又三郎', '宮沢賢治', 900);
[phpMyAdminによる上記のデータイメージ]
データベース接続
MySQLに接続する方法となります。(UTF8)
$mysqli = @new mysqli(host_or_ip,user_id, password, dbname); // connect_errorはPHP5.3.0以降で有効 if ($mysqli->connect_error) { die('DB接続エラー ' . $mysqli->connect_error); } $mysqli->set_charset('utf8'); ... データベースの処理 // データベース接続の終了 $mysqli->close();
「host_or_ip」はホスト名またはIPアドレス
「user_id」はユーザー名
「password」はパスワード
「dbname」はデータベース名
を設定します。
文字コードがUTF8以外の場合は「set_charset('utf8');」の部分を適宜、変更して下さい。
SELECT(標準)
データベースにSELECTのSQLを投げて結果を出力します。
$sql = "SELECT title,author,price FROM mst_book " . " WHERE author='宮沢賢治' AND price >= 900 "; unset($db_data); if ($result = $mysqli->query($sql)) { while ($row = $result->fetch_assoc()) { $db_data[] = $row; } $result->free(); } echo '<table border="1">'; for($i=0;$i<count($db_data);$i++){ echo '<tr>'; echo '<td>' . $db_data[$i]['title'] . '</td>'; echo '<td>' . $db_data[$i]['author'] . '</td>'; echo '<td>' . $db_data[$i]['price'] . '</td>'; echo '</tr>'; } echo '</table>';
[結果]
SELECT(バインド)
今度はバインドを使用してデータベースにSQLを投げて結果を出力します。バインド機能は「SQLインジェクションの対策」になりますので通常はこちらの方を使用すると思います。
$sql = "SELECT title,author,price FROM mst_book " . " WHERE author=? AND price >= ? "; // 初期化 unset($db_data); $cnt =0; // パラメータ用変数 $author = "宮沢賢治"; $price = 900; // プリペアドステートメントの作成 if ($stmt = $mysqli->prepare($sql)) { // パラメータに変数をバインド // ※第一引数は型指定(s= string d= double i=integer b=blob) // ※日付型も「s」となります。 if ($stmt->bind_param("si", $author,$price)){ // SQLの実行 if ($stmt->execute()){ // 結果変数をバインドする if($stmt->bind_result($title,$author,$price)){ while ($row = $stmt->fetch()) { $db_data[$cnt]['title'] = $title; $db_data[$cnt]['author'] = $author; $db_data[$cnt]['price'] = $price; $cnt++; } } } } $stmt->close(); } echo '<table border="1">'; for($i=0;$i<count($db_data);$i++){ echo '<tr>'; echo '<td>' . $db_data[$i]['title'] . '</td>'; echo '<td>' . $db_data[$i]['author'] . '</td>'; echo '<td>' . $db_data[$i]['price'] . '</td>'; echo '</tr>'; } echo '</table>';
[結果]
UPDATE/INSERT
UPDATE(更新)/INSERT(挿入)の操作方法は、前述した「SELECT(標準)」「SELECT(バインド)」の手法と同じで「SQL」と関連した部分だけを変更すればそのまま実行可能です。
トランザクション
データベースのトランザクション機能の使い方です。
// トランザクションの開始 if ($mysqli->autocommit(FALSE)){ // 「UPDATE」または「INSERT」の実行 if(...){ // コミット if ($mysqli->commit()) { ... }else{ // ロールバック $mysqli->rollback(); } } }
トランザクションを使用するには操作するテーブルがトランザクションに対応しているテーブル型(InnoDB形式)である必要があります。
トランザクションには「mysqli::begin_transaction」というメンバもありますが、MySQLのバージョンがMySQL5.6以降である必要があります。