PHPとMySQL連携のプログラミング
- WEBデザイン・開発教室用の「PHPプログラミング」をする上でPHPとMySQL連携プログラミングなどの基本的なプログラミング方法を説明する内容です。
- プログラミングの前提として、SQL文の操作として「MySQLのSQL文法とコマンド操作」と「トランザクション処理とSQLコマンド操作」、データベースの設計についての「ER図とデータベース設計」の本サイト内容を理解している必要があります。
- PHP5とMySQL連携プログラミングは、機能拡張モジュールの「mysql」か、「mysqli」あるいは「PDO_MySQL」のAPIを利用して作成します。「mysql」は、PHP 5.5で非推奨となり、PHP 7で削除され、「PDO_MySQL」は、データアクセスの抽象化レイヤを提供するPDO(PHP Data Objects)拡張モジュール(ドライバ)であり、MySQL、Oracle、PostgreSQL、Microsoft SQL Server、IBM DB2等のインターフェースに対応しています。
「mysqli」は、ベンダー固有ドライバの「mysqlnd」ネイティブドライバ(PHP5.3.0以降)に対応しており、「PDO_MySQL」の1.2~1.5倍の処理性能といわれています。
- 機能拡張モジュールの「mysqli」をベースとし、DB接続からクエリ実行、エラーメッセージなどを実現したクラスを作成してPHPプログラミングを容易にできるようにします。(「PHPのクラス・オブジェクトプログラミング」の習得済みを前提)
PHPとMySQL連携のプログラミング
PHPとMySQL連携のプログラミング※画像クリックで拡大表示
※アイコンの機能:表示
実行 ダウンロード
- PHPとMySQL連携処理の概要は、
- PHPのMySQL操作は、「MySQLのPHP機能拡張」を選択してMySQLログインして、MySQLとの接続が可能になります。「MySQLのPHP機能拡張」は、3種類の「mysql」「mysqli」「PDO_MySQL」の利用が可能です。
- PHPプログラミングで利用するSQL文は、コマンドプロンプト操作(CUI)と同様な内容で、「データ定義(DDL)」「データ操作(DML)」「データ制御(DCL)」の実行が可能です。
- PHPプログラミングは、3種類の「MySQLのPHP機能拡張」用の関数を通して、SQL文でDB項目や値の追加・変更・削除等の処理が実現できます。
- 今回のPHPプログラミングで説明するDB環境としては、
「MySQLのSQL文法とコマンド操作」で作成したデータベース「list_db」を利用し、MySQLのメンテナンス・ユーティリティ「phpMyAdmin」で、Grant文の入力と実行を行う。
■GRANT文:「GRANT all PRIVILEGES ON list_db.* TO user@localhost IDENTIFIED BY 'eLerning_PWD';」
これにより、MySQL接続は、ユーザーID『user』、パスワード『eLerning_PWD』で、データベース『list_db』の全てのテーブルとアクセスが可能になります。
「list_db」sqlファイルダウンロード
- MySQL接続ログインと検索のプログラミングは、
~[mysqli]と[PDO_MySQL]の比較プログラミング~
命令/関数 | 説明 |
プログラム内容 |
mysqliによる DB接続と切断 「オブジェクト指向型」 |
- new演算子でクラスのオブジェクト生成(コンストラクタで接続処理)
- 接続のエラー判断「mysqli_connect_error()
- DB切断「close()
|
「オブジェクトの$dbを生成して、エラー判断し、OK時に"$db->host_info"メソッドでホスト情報を表示、DB切断まで」の一連処理。
|
PDO_MySQLによるDB接続と切断 |
- "try ~ catch ~"文により、MySQLデータベースに接続して、インスタンス作成とエラー判断「PDOException」でスローする。
|
「オブジェクトの$dbを生成して、エラー判断し、OK時に"$db->getAttribute()"メソッドでホスト情報を表示」の一連処理。
|
mysqliによる 検索一覧 「オブジェクト指向型」 |
- sql文によるquery()メソッドで検索「$result = $db->query($sql)」
- 検索結果オブジェクト($result)をfetch_xxx()メソッドでループ(while)処理。
|
「query()メソッドのsql文で検索して、検索結果をfetch_assoc()メソッドの繰り返し」の処理。
|
PDO_MySQLによる検索一覧 |
- query()メソッドで検索、オプションで連想配列のみのPDO::FETCH_ASSOC定数の設定。
- 検索結果の配列をループ(foreach)処理。
|
「query()メソッドでsql文とオプションで連想配列のみのPDO::FETCH_ASSOC定数の設定による検索」の処理。
|
mysqliによる プリペアドステートメント検索 「オブジェクト指向型」 |
- プリペアドステートメント「文字列データを'?'で指定したsql文」のprepare()メソッドでstatementオブジェクト作成
- プリペアドステートメントのパラメータ「?」に変数をバインド
- 検索クエリの実行「execute()」
- resultオブジェクト生成「get_result()」(PHP5.3以降)
- resultオブジェクトからデータ取り出し「fetch_xxx()」
|
「prepare()メソッドでstatementオブジェクト作成し、sql文の「?」に変数をバインドとexecute()でクエリ実行してresultオブジェクト生成して、fetch_xxx()でデータ取り出し」の処理。 ・クエリ結果の行数は、resultオブジェクトのnum_rowsで取得
|
PDO_MySQLによるプリペアドステートメント検索 |
- プリペアドステートメント「文字列データを'?'で指定したsql文」のprepare()メソッドでstatementオブジェクト作成
- バインドするデータを配列で指定して検索クエリの実行「execute(array(...))」
- statementオブジェクトからデータ取り出し「fetch(),fetchall()」
|
「prepare()メソッドでstatementオブジェクト作成し、execute()でsql文の「?」に対応するデータを配列(バインド)指定してクエリ実行。statementオブジェクトのfetch()他でデータ取り出し」の処理。 ・クエリ結果の行数は、statementオブジェクトのrowCount()で取得
|
- MySQLのトランザクション処理は、
【SQL文による実行手順】
- MySQLは、省略値でオートコミントがオン「1」になっているため、AUTO COMMITモードのOFF「0」の設定: SET AUTOCOMMIT=0;
- 分離レベルの設定:SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
コミットされるまでトランザクション内で読み取り(同じSELECT文)を何回実行しても、同じ値となることを保証(MySQLのデフォルトモード)
- トランザクションを開始:BEGIN;
- sql文を準備して、挿入を実行する: INSERT INTO list_db VALUES( xxx, ...);
- savepointを設定する: SAVEPOINT tr20160629;
- 別の挿入を実行する。: → 更新処理の実行:
- エラーが判断されたので、savepointまでロールバック: ROLLBACK TO SAVEPOINT tr20160629;
- OKの場合は、コミット: COMMIT;
【トランザクション処理の関数比較】
項目 | MySQLi | PDO_MySQL |
自動コミットをOFF | autocommit(FALSE) | SQL文で実行 |
トランザクション処理の開始 | begin_transaction() ※PHP5.5以降 | beginTransaction() |
コミット | commit([$name]) ※[$name]は、PHP5.5以降 | commit() |
ロールバック | rollback([$name]) ※[$name]は、PHP5.5以降 | commit() |
セーブポイント設定 | savepoint([$name]) ※PHP5.5以降 | - |
セーブポイント削除 | release_savepoint([$name]) ※PHP5.5以降 | - |
MySQLi機能拡張のクラス作成とプログラミング
機能拡張モジュールの「mysqli」には、「手続き型」と「オブジェクト指向型」があります。
「手続き型」は、作成したクラス構成内容のプロパティ、メソッドに限定されますが、「オブジェクト指向型」の場合には、「クラスの継承」を利用して、作成したプロパティ、メソッド利用に加えて、スーパークラスのメソッドもできるオブジェクトが形成できます。
- MySQLiの「手続き型」クラス作成とプログラミングは、
項目 | プログラム内容説明 |
クラスの作成 |
【MySQLi手続き型の基本処理クラス】
- コンストラクタの引数:「データベース接続+テーブル名」の連想配列
- プロパティ利用:
フィールド名と型・デフォルト値、 エラー内容($DBerror)、 直前実行SQL文($DBsql)他
- メソッド利用:
・クエリ:query($sql), ・レコード取得:fetch(), fetch_assoc(), ・レコード数:rowcount(), ・クローズ:close() 他
|
クラス利用による一覧表作成 |
コンストラクタ設定したフィールド属性内容(構成)の表示とクエリ:「query()」、検索結果を連想配列取得:「fetch_assoc()」のメソッド実行による一覧表の作成
|
- MySQLiの「オブジェクト指向型」継承クラス作成とプログラミングは、
項目 | プログラム内容説明 |
クラスの作成 |
【MySQLiオブジェクト指向型の継承クラス】
- コンストラクタの引数:「データベース接続+テーブル名」の連想配列
- プロパティ利用:
フィールド名と型・デフォルト値、 エラー内容($DBerror)、 直前実行SQL文($DBsql)他
- メソッド利用:
・クエリ: Query($sql, $mode), ・レコード取得: Fetch($mode), ・レコード取得(連想): FetchAssoc(), ・statementレコード取得: FetchStmt(), ・レコード数: Rowcount(), ・クローズ: Close()
・sql文準備: Prepare($sql), ・sql文実行: Execute(), ・バインド用タイプ取得: BindParamType($ary), ・バインド入力と出力設定: BindParam(&$ary),BindResult(&$ary), ・プリペアドステートメントの準備から実行まで: PrepareExec($sql,$ary), ・プリペアドステートメントの準備からレコード保存まで: PrepareExecResult($sql,$ary), PrepareExecStore($sql,$ary,&$outary) 他
※スーパークラスと同じ名称メソッドのとき、大文字表現(キャメルケース)。
|
クラス利用による一覧表作成 |
コンストラクタ設定したフィールド属性内容(構成)の表示と継承クラスのクエリメソッド:「Query()」、検索結果を配列取得メソッド:「Fetch()」の実行による一覧表の作成
|
スーパークラスと継承クラスの混合利用 (プリペアドステートメント検索) |
継承クラスのクエリメソッド:「Query()」、Fetchメソッド:「Fetch()」実行とプリペアドステートメントをスーパークラスのメソッド利用した混合実行
|
継承クラスの検索準備:「Prepare()」、検索実行:「Execute()」、検索結果の配列取得:「FetchStmt()」のメソッド実行。スーパークラスのバインド入力設定「bind_param()」、バインド出力設定「bind_result()」を一部利用
|
全て継承クラスのメソッドの実行 (プリペアドステートメント検索) |
プリペアドステートメントを継承クラスのメソッド:検索準備・バインド・実行メソッド:「PrepareExecGetResult()」の実行
(PHP5.3以降に対応)
|
プリペアドステートメントを継承クラスのメソッド:検索準備・バインド・実行・保存メソッド:「PrepareExecStore()」の実行
|
CRUD処理クラス作成とプログラミング
(MySQLi機能拡張)
「オブジェクト指向型」のCRUD処理は、既に作成したMySQLiの基本処理「オブジェクト指向型」クラスにメソッドを追加して、クラス名を「MySQLi_eCRUD」として作成します。
追加したメソッドは、「プリペアドステートメント」をベースとした基本メソッドを組み合わせた内容で作成しています。