ホーム > カテゴリ > PHP・Laravel・CakePHP >

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による上記のデータイメージ]

wikipedeiaで補足: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>';

[結果]

wikipedeiaで補足:SQLインジェクション

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以降である必要があります。

wikipedeiaで補足:トランザクション

PHP公式ページ

mysqliのメンバ一覧





関連記事



公開日:2015年09月12日
記事NO:01348


この記事を書いた人

💻 ITスキル・経験
サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。

画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ
プチモンテ代表、アーティスト名:プチモンテ
🎵 音楽制作
BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は叙情詩、叙情的な楽曲が多い。楽曲制作は2023年12月中旬 ~

オリジナル曲を始めました✨

YouTubeで各楽曲を公開しています🌈
https://www.youtube.com/@petitmonte

【男性ボーカル】DA・KA・RA | 新たな明日が風と共に訪れる

【男性、女性ボーカル】時空を超越する先に | 時空と風の交響曲

【女性、男性ボーカル】絆 | 穏やかな心に奏でる旋律