WebDesign Dackel

PHPでMySQLを操作、PDOについて

PHPでMySQLを操作、PDOについて

Hatena0
Google+0
Pocket0
Feedly0

僕はこれまでフレームワークやWordPressを使わないでデータベースの操作を行なう際、PHPで用意されているmysql関数を自分で使いやすいようにinsert()などのメソッドを持ったクラスを作ってました。

ただ、PHP5.5でmysql拡張モジュールが非推奨になるよ!って記事をいくつか見て、新しいものへの対応をしていかなきゃなと思って、今更感がありますがこれまで使ったことの無かった「PDO」の勉強を最近少しずつ初めてます。

参考記事:PHP 5.5 で mysql 拡張モジュールが非推奨になり、将来において WordPress を筆頭にさまざまな CMS のアップグレード作業が必要になります

MySQLへの接続

恥ずかしながらMySQL以外のデータベースを使ったことが無いので接続方法はMySQLで。ただ、PDOはデータベースの種類に関係無く同じような記述が出来るみたいです。

try {
    $pdo = new PDO("mysql:dbname=db_name;host=localhost", "username", "password");
} catch (PDOexception $e) {
    exit($e->getMessage());
}
//$result = $pdo->query("SET NAMES utf8");
if ( ! $result ){
    $info = $pdo->errorInfo();
    exit($info[2]);
}

$pdo変数にPDOクラスのインスタンスを代入します。
接続の際に発したエラー情報はPDOexceptionの次に書いている$e変数に入ってくるのでtry文でcatchすれば、エラー処理が可能です。
~~また、SET NAMES utf8では文字コードの指定をしています。~~

※コメントより、「SET NAMES utf8」を使わないように(URL先を参照)ご指摘を頂きましたので修正しました。

PHPでデータベースに接続するときのまとめ

SQLを実行

基本です。PDOのquery()メソッド内にSQL文を記入します。

$obj = $pdo->query("ここへSQL文を記入");

テーブルのデータを一覧

query()メソッドの戻り値であるオブジェクトのfetch()メソッドで、mysql_fetchと同じ事が出来ます。引数にしているのは、PDO::FETCH_ASSOCという定数で、mysql_fetch_assoc()と同様に戻り値を連想配列で受け取れます。
PDO::FETCH_NUMを指定することで、通常の配列として受け取ることも出来ます。

$result = $pdo->query("SELECT * FROM table_name");
while( $data = $result->fetch(PDO::FETCH_ASSOC) ){
    print $data["author_name"];
}

プレースホルダーを使う

これはとっても便利ですね。最初にSQL文を用意しておいて、値の変化のある箇所を予め決めておけます。(なんだか良さを上手く説明出来ませんっ)

$result = $pdo->prepare("SELECT * FROM table_name WHERE id > :number1");
$result->bindValue(":number1", 10, PDO::PARAM_INT);
$flg = $result->execute();
if ( ! $flg ){
    $info = $result->errorInfo();
    exit($info[2]);
}

query()メソッドの代わりに、prepare()メソッドを使ってSQL文定義しておきます。その際値の入ってくる箇所に、「:」に続けて変数と同じように半角英数字を使って指定しておきます。
その後、bindValue()メソッドを使って値の指定をしていきます。
第1引数に「:」に続けて指定した名前、第2引数に実際に入れる値を指定します。数値の指定をする場合はPDO:PARAM_INTを第3引数に指定して、数値を挿入することを明示しなければダメみたいです。文字列を入れる場合は第3引数は特に必要ありません。

また、一度定義したプレースホルダーは使いまわす事が出来る為、同じ様な形式のSQL文を何度も書くことは必要なくなります。

$result = $pdo->prepare("SELECT * FROM table_name WHERE id > :number1");
$result->bindValue(":number1", 10, PDO::PARAM_INT);
$flg = $result->execute();
if ( ! $flg ){
    $info = $result->errorInfo();
    exit($info[2]);
}

print "<h1>PraceHolder Query [id > 10]</h1>";
while( $data = $result->fetch(PDO::FETCH_ASSOC) ){
    print "<p>".$data["id"]."</p>";
}

// 連続したプレースホルダーの使用
$result->bindValue(":number1", 20, PDO::PARAM_INT);
$flg = $result->execute();
if ( ! $flg ){
    $info = $result->errorInfo();
    exit($info[2]);
}

print "<h1>PraceHolder Query [id > 20]</h1>";
while( $data = $result->fetch(PDO::FETCH_ASSOC) ){
    print "<p>".$data["id"]."</p>";
}

また、プレースホルダーを利用するメリットは、指定する値を自動で適切にエスケープをしてくれるところにあります。
以上で、簡単ながらPDOの使い方の基礎の基礎を書いてみました。まだまだわからないことが多いのですが実際に使ってみて更に理解を深めようと思っています。そういえばエラー処理についてexcute()の後のエラー処理について書いていませんでしたが、こんな感じで使うんだなと今は思って書いています。笑
また、新しく覚えた事があったら追記していこうと思います。