PHPとMySQLをPDO接続で連携する話

こんにちは。たきもとです。

先日はMySQLコマンド一覧をまとめました。
その時の記事はこちら。
MySQL コマンド一覧 | たきもとけんご.com


今回はPHPでMySQLを操作する方法について紹介します。

動作環境

windows8.1 64bit

vagrant 1.8.1
centOS 6.7
Apache 2.2.15

MySQL 14.14
PHP 5.6.20

PuTTY 0.67

Chrome    

テーブル設定

MySQLを立ち上げたら次の設定を行います。
これはお決まりの作業です。
詳しくは前回の記事を参考にして下さい。

前回の記事はこちら。
MySQL コマンド一覧 | たきもとけんご.com

  1. mkdir :作業ディレクトリの作成
  2. mysql -u root :MySQLにrootでログイン
  3. create database ○○ :データベース作成
  4. grant all on ○○(←DB名).* to □□(←ユーザ名)@localhost identified by ‘◇◇(←パスワード)’ :ユーザ、パスワードの設定
  5. use ○○(←DB名) : データベース選択
  6. create table ○○(←テーブル名) (); :テーブル設定


PDO設定

PDOとは

PHP Data Object MySQLをはじめ、様々なデータベースを扱えるようになる仕組みのこと。    


準備

index.php

データベース関連情報は定数としてまとめる。

DSN :Data Source Name データベースシステムに接続するための文字列。
今回はMySQLに接続。

データベースの操作は try, chatchで行う。
オプション(setAttribute)は次のページを参照。
ここではデフォルトのエラーハンドルを指定。
Exception の形で例外を投げる。
PDO::setAttribute | PHPマニュアル    

テーブルの設定

PDOでSQLを実行するコマンドは3種類ある。

  1. excec(): 結果を返さない安全なSQL
  2. query(): 結果を返す安全なSQL. 何度も実行されないSQL.
  3. prepare(): 結果を返すSQL. 安全対策が必要.複数回実行されるSQL.

その時々のシチュエーションに合わせてどのコマンドを使うかを選択する。
prepare()はSQLをキャッシュしてくれるのでよく使われる(らしい)。

ここではexcecを利用して基本的なデータベースの接続とテーブルへのデータ挿入を実現する。

prepare()

prepare()の基本的な使い方

prepare()を使うと,statementオブジェクトが返ってくる。
この返り値を変数に入れて更にコードを記述してゆくのが一般的。

先程と同様に execute() でMySQLに接続する。
ここではprepareと予約語を用いてデータを挿入する。

予約語は ? を使うが、実際には :変数名 という形を取れば何でも良い。
これについては後述する。

prepare()で名前付きパラメータを使う

先程は ? を予約語にしたが、別のモノを試してみる。
先述した通り :フィールド名(カラム名) という形を用いる場合、excecute時には

  • キー

という具合に扱う。

予約語 ? は挿入する値が何でもOKというメリットが有る。
一方で、 :フィールド名 の記述は、フィールド名が多い場合に便利。

bindValue()

テーブルの一部を変更したい、またはフィールド(カラム)毎に値を設定したい時に便利な方法。
bindValueについてはこちらのページに詳細がまとめられています。
PDOStatement::bindValue | php.net    

    bindValueの第3引数にはデータ型を指定する。
ここで指定するデータ型についてはこちら。
定義済み定数 | php.net

execute() の引数を指定しない場合は、bindValueで指定した値がそのまま実行される。
bindValueをループと併用すると、多くのデータの一部を変更するような処理が実現可能。  

   

名前付きパラメータを用いる場合

名前付きパラメータ使用時は、bindValue第1引数に次のように指定する。

bindParam()

  • bindValue(): ?(予約語)と値をバインド
  • bindParam(): 変数への参照をバインド

bindParam()では予め変数を指定しておき、後から変数の中身を変更することが可能。 コードをすっきりまとめたいときに。

query()による抽出

本ページ上部でquery()について次のように記述しました。
改めて書くと次のようになります。

PDOでSQLを実行するコマンドは3種類ある

excec(): 結果を返さない安全なSQL
query(): 結果を返す安全なSQL. 何度も実行されないSQL.
prepare(): 結果を返すSQL. 安全対策が必要.複数回実行されるSQL.

ここではquery()とPDO::Fetchを用いた抽出方法を紹介する。
PDO::Fetchについてはこちらを参照。
PDOStatement::fetch | php.net    

指定したデータの全てを表示する場合は次のメソッドを利用する。
PDOStatement::fetchAll | php.net

prepare()を使った条件付き抽出

like を使った抽出

likeを使ったあいまい検索についてはこちらのページで紹介しました。
MySQL コマンド一覧 | たきもとけんご.com    
ここではその応用として、idに 5 を含むデータを抽出する方法を紹介します。

order by ~~ desc を用いてデータを降順(逆順)に並べる方法

データの並べ替えには order を利用します。
このあたりのコマンドはこちらにまとめました。
MySQL コマンド一覧 | たきもとけんご.com    

execute()の引数は基本的には文字列で渡される。

limitを指定した場合は数字を扱うので、bindValueを利用する。
数字を扱うので、データ型まで指定する。

PDO::FETCH_CLASS

抽出したデータを直接クラスで使いたいときがある。
そんな時に PDO::FETCH_CLASSを利用すると便利。    

FETCH_CLASSでは自動的にテーブルのカラムをクラスのプロパティとして設定してくれる。

レコードの更新・削除

PHPからMySQLを操作してレコードの更新・削除を行うことができる。

  • update: テーブルの更新
  • delete: テーブルの削除


transaction

ある処理が確実に終わっていることを知りたい時がある。
そんなときに便利なのがtransactionだ。
transactionはある一連の処理が終わることを保障してくれる仕組み。


たとえば、次のようなテーブルがあるとする。

id=16 から id=15 へ scoreを40点移動させることを考える。
このとき、
id:16 → 100 – 40 = 60
id:15 → 11 + 40 = 51
となるはず。

このscoreの移動の一方が何らかの理由で行われない時、作業を中断して元の状態に戻すまでの処理を考える。

スポンサーリンク
336 x 280 – レクタングル(大)
336 x 280 – レクタングル(大)
  • このエントリーをはてなブックマークに追加

この記事が気に入ったら
いいね!しよう

トップへ戻る