WEBデザイン・開発講義WEB Design&Development Lecture

PHPとMySQL連携のプログラミング

PHPとMySQL連携のプログラミング

PHPとMySQL連携のプログラミング

PHPとMySQL連携のプログラミング※画像クリックで拡大表示

※アイコンの機能:表示   実行  ダウンロード

  • PHPとMySQL連携処理の概要は、
    PHPプログラミングによるMySQL操作の概要
    1. PHPのMySQL操作は、「MySQLのPHP機能拡張」を選択してMySQLログインして、MySQLとの接続が可能になります。「MySQLのPHP機能拡張」は、3種類の「mysql」「mysqli」「PDO_MySQL」の利用が可能です。
    2. PHPプログラミングで利用するSQL文は、コマンドプロンプト操作(CUI)と同様な内容で、「データ定義(DDL)」「データ操作(DML)」「データ制御(DCL)」の実行が可能です。
    3. 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';
    GRANT文によるMySQLログイン制御の作成
    これにより、MySQL接続は、ユーザーID『user』、パスワード『eLerning_PWD』で、データベース『list_db』の全てのテーブルとアクセスが可能になります。
    「list_db」sqlファイルダウンロード
  • MySQL接続ログインと検索のプログラミングは、
    ~[mysqli]と[PDO_MySQL]の比較プログラミング~
    命令/関数説明
    プログラム内容
    mysqliによる
    DB接続と切断
    「オブジェクト指向型」
    1. new演算子でクラスのオブジェクト生成(コンストラクタで接続処理)
    2. 接続のエラー判断「mysqli_connect_error()
    3. DB切断「close()
    「オブジェクトの$dbを生成して、エラー判断し、OK時に"$db->host_info"メソッドでホスト情報を表示、DB切断まで」の一連処理。
    PDO_MySQLによるDB接続と切断
    1. "try ~ catch ~"文により、MySQLデータベースに接続して、インスタンス作成とエラー判断「PDOException」でスローする。
    「オブジェクトの$dbを生成して、エラー判断し、OK時に"$db->getAttribute()"メソッドでホスト情報を表示」の一連処理。
    mysqliによる
    検索一覧
    「オブジェクト指向型」
    1. sql文によるquery()メソッドで検索「$result = $db->query($sql)」
    2. 検索結果オブジェクト($result)をfetch_xxx()メソッドでループ(while)処理。
    「query()メソッドのsql文で検索して、検索結果をfetch_assoc()メソッドの繰り返し」の処理。
    PDO_MySQLによる検索一覧
    1. query()メソッドで検索、オプションで連想配列のみのPDO::FETCH_ASSOC定数の設定。
    2. 検索結果の配列をループ(foreach)処理。
    「query()メソッドでsql文とオプションで連想配列のみのPDO::FETCH_ASSOC定数の設定による検索」の処理。
    mysqliによる
    プリペアドステートメント検索
    「オブジェクト指向型」
    1. プリペアドステートメント「文字列データを'?'で指定したsql文」のprepare()メソッドでstatementオブジェクト作成
    2. プリペアドステートメントのパラメータ「?」に変数をバインド
    3. 検索クエリの実行「execute()」
    4. resultオブジェクト生成「get_result()」(PHP5.3以降)
    5. resultオブジェクトからデータ取り出し「fetch_xxx()」
    「prepare()メソッドでstatementオブジェクト作成し、sql文の「?」に変数をバインドとexecute()でクエリ実行してresultオブジェクト生成して、fetch_xxx()でデータ取り出し」の処理。
    ・クエリ結果の行数は、resultオブジェクトのnum_rowsで取得
    PDO_MySQLによるプリペアドステートメント検索
    1. プリペアドステートメント「文字列データを'?'で指定したsql文」のprepare()メソッドでstatementオブジェクト作成
    2. バインドするデータを配列で指定して検索クエリの実行「execute(array(...))」
    3. statementオブジェクトからデータ取り出し「fetch(),fetchall()」
    「prepare()メソッドでstatementオブジェクト作成し、execute()でsql文の「?」に対応するデータを配列(バインド)指定してクエリ実行。statementオブジェクトのfetch()他でデータ取り出し」の処理。
    ・クエリ結果の行数は、statementオブジェクトのrowCount()で取得
  • MySQLのトランザクション処理は、

    【SQL文による実行手順】

    1. MySQLは、省略値でオートコミントがオン「1」になっているため、AUTO COMMITモードのOFF「0」の設定: SET AUTOCOMMIT=0;
    2. 分離レベルの設定:SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
      コミットされるまでトランザクション内で読み取り(同じSELECT文)を何回実行しても、同じ値となることを保証(MySQLのデフォルトモード)
    3. トランザクションを開始:BEGIN;
    4. sql文を準備して、挿入を実行する: INSERT INTO list_db VALUES( xxx, ...);
    5. savepointを設定する: SAVEPOINT tr20160629;
    6. 別の挿入を実行する。: → 更新処理の実行:
    7. エラーが判断されたので、savepointまでロールバック: ROLLBACK TO SAVEPOINT tr20160629;
    8. OKの場合は、コミット: COMMIT;

    【トランザクション処理の関数比較】

    項目MySQLiPDO_MySQL
    自動コミットをOFFautocommit(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手続き型の基本処理クラス】
    1. コンストラクタの引数:「データベース接続+テーブル名」の連想配列
    2. プロパティ利用:
      フィールド名と型・デフォルト値、
      エラー内容($DBerror)、
      直前実行SQL文($DBsql)他
    3. メソッド利用:
      ・クエリ:query($sql),
      ・レコード取得:fetch(), fetch_assoc(),
      ・レコード数:rowcount(),
      ・クローズ:close() 他
    クラス利用による一覧表作成 コンストラクタ設定したフィールド属性内容(構成)の表示とクエリ:「query()」、検索結果を連想配列取得:「fetch_assoc()」のメソッド実行による一覧表の作成
  • MySQLiの「オブジェクト指向型」継承クラス作成とプログラミングは、
    項目プログラム内容説明
    クラスの作成 【MySQLiオブジェクト指向型の継承クラス】
    1. コンストラクタの引数:「データベース接続+テーブル名」の連想配列
    2. プロパティ利用:
      フィールド名と型・デフォルト値、
      エラー内容($DBerror)、
      直前実行SQL文($DBsql)他
    3. メソッド利用:
      ・クエリ: 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」として作成します。

追加したメソッドは、「プリペアドステートメント」をベースとした基本メソッドを組み合わせた内容で作成しています。

  • MySQLiの「オブジェクト指向型」CRUDクラス作成は、
    項目プログラム内容説明
    CRUDクラスの作成 【MySQLiのCRUD処理:オブジェクト指向型の追加メソッド】
    ・レコードの挿入: Insert($data, [$mode])
    ・レコードの変更: Update(&$data, [$key], [$mode])
    ・レコードの削除: Delete([$str])
    ・レコードの検索: Search($str, $out_ary, [$key] [,$option])
    ・直近 InsertID 取得: InsertID()
    DBフィールドに対して、入出力するデータは連想配列(キー項目がDBフィールド一致していること)で連携しています。
    レコード挿入
    1. レコードの挿入メソッドで、挿入したいデータを連想配列で指定し、モードを'edit'指定して入力したい項目のみにする。: $db->Insert($data, 'edit');
    2. 直近のInsertしたIDを取得して確認する: $db->InsertID();
    レコード変更
    1. レコードの変更メソッドで、変更したいデータを連想配列(参照渡し)で指定し、IDをキー($key)として、モードを'edit'指定して変更したい項目のみにする。: $db->Update($data, $str, 'edit');
    2. プリペアドステートメントのバインドデータを繰り返し「while( FetchStmt() )」で、編集出力
    レコード削除
    1. レコードの削除メソッドで、削除したいデータを文字列でIDを指定する。: $db->Delete($str,);
    2. DELETEの場合は、対象レコードがない場合でも、OK状態となるので注意して下さい。
    レコード検索
    1. レコードの検索メソッドで、検索したいデータを文字列で指定し、出力連想配列の指定、対象フィールドを指定する。(プライマリーキーの場合は省略可能): $db->Search($str, $outdata, $key);
    2. 得られたデータを編集出力(foreachの繰り返し)
  • MySQLiによるVIEWテーブル作成して一覧表作成は、

    VIEWテーブルは、仮想的なテーブルとして、一覧表などの利用に適しています。

    命令/関数プログラム内容説明
    mysqliによるDROP VIEW +
    CREATE VIEW
    作成のquery()
    1. 「DROP VIEWテーブルのsql文」と「CREATE VIEWテーブルのsql文」をquery()メソッドでテーブル作成
    2. 作成したVIEWテーブルを検索クエリの実行「query()」
    3. 検索クエリ結果からデータ取り出し「fetch_assoc()」のループ処理

PHPとMySQL連携補足説明

PHP,MySQLリファレンス

参考資料の表示

pagetopへ