プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、PDOを利用してMySQLのDBに接続してみる。
「mysql_connect()」等の「mysql_xxx()」系関数がPHP5.5.0で非推奨になったのだそうな。
将来的になくなるから「MySQLi」か「PDO_MySQL」を使えと書いてありました。

じゃあせっかくだからPDOを使ってみましょうか、というのがきっかけです。

ちなみにPDOは「PHP Data Objects」の略で、DB接続用のクラスね。
データベースの種類を気にしないで使えるようです。
「mysql_connect()」「pg_connect()」のようにDB毎に使い分けなくて良いんですってさ。
PHP5.1.0以降は標準でくっついているそうなので気が向いた方は使ってみてください。

それでは早速使ってみましょう♪

まずは下準備……はPHPのバージョンが新しければ必要ないと思います。
「php.ini」の「extension=ほげほげ」の部分を確認して、

MySQLを使うなら

extension=php_pdo_mysql.dll

PostgreSQLを使うなら

extension=php_pdo_pgsql.dll

SQLiteを使うなら

extension=php_pdo_sqlite.dll

あたりがコメントアウトされていないことだけ確認してください。

PDOの解説サイトを眺めると、たまに

extension=php_pdo.dll

が必要との説明がありますが、これはバージョンが古い場合です。
PHP 5.3以降では無視してもOK。PDOのDLLは必須ではなくなったんですってさ。

それでは実際の使い方ですが、こんな感じφ(--)

■接続
$pdo = new PDO('DBの種類:dbname=DB名;host=ホスト名;charset=文字エンコーディング指定', 'ID', 'パスワード');


$pdo = new PDO('sqlite:データベースファイルへのパス');

です。
DBの種類:dbname= ~ 」はDSNと呼ばれる部分です。
MySQLに接続する場合は「'mysql:dbname=test_db;host=localhost;charset=utf8'」
PostgreSQLに接続する場合は「'pgsql:dbname=test_db;host=localhost;charset=utf8'」
SQLiteに接続する場合は「'sqlite:test_db'」のように指定します。
SQLiteはユーザID、パスワードが無いのでご注意ください。
またMySQL、PostgreSQLの「charset=文字エンコーディング指定」の部分は
PHP 5.3.6以降で有効のようです。
それ以前は

//SET NAMES
$stmt = $pdo->query('SET NAMES utf8');
if (!$stmt) {
    $err = $pdo->errorInfo();
    die('SET NAMES 失敗:' . $err[2]);
}

のように「SET NAMES」で指定する必要があるみたいですね。
脆弱性があるけど(-。-)ぼそっ

それではサンプルコードφ(--)
//$dsn = 'mysql:dbname=test_db;host=127.0.0.1';
$dsn = 'mysql:dbname=test_db;host=127.0.0.1;charset=utf8';
$user = 'user';
$pwd = 'pwd';

//DB接続
try {
    $pdo = new PDO($dsn, $user, $pwd);
} catch (PDOException $e) {
    die('DB接続失敗:' . $e->getMessage());
}

/*******************************
//SET NAMES
$stmt = $pdo->query('SET NAMES utf8');
if (!$stmt) {
    $err = $pdo->errorInfo();
    die('SET NAMES 失敗:' . mb_convert_encoding($err[2], 'UTF-8','SJIS-win'));
}
*******************************/

■検索
「query()」メソッドを使うやり方と「prepare()」「execute()」メソッドを使うやり方があります。
「query()」メソッドを使うやり方は例えばこんな感じφ(--)
$sql = 'SELECT * FROM tbl_test01;';
$stmt = $pdo->query($sql);
if (!$stmt) {
    $err = $pdo->errorInfo();
    die('SELECT 失敗:' . $err[2]);
}

//結果取得
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
    print_r($data);
}

簡単に補足すると

$stmt = $pdo->query($sql);

でSQL実行

$data = $stmt->fetch(PDO::FETCH_ASSOC)

でフェッチです。

「prepare()」「execute()」メソッドを使うやり方はこんな感じφ(--)
$sql = 'SELECT * FROM tbl_test01 WHERE pk_id >= :id_start and pk_id <= :id_end;';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':id_start' => 5,
                    ':id_end' => 7,
                ));
if (!$ret) {
    $err = $pdo->errorInfo();
    die('SELECT 失敗:' . $err[2]);
}

//結果取得
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
    print_r($data);
}

「:id_start」と「:id_end」は勝手に名前を決めたプレースホルダね。
実際の値はexecute()時に指定しています。

もちろん
$sql = 'SELECT * FROM tbl_test01 WHERE pk_id >= :id_start and pk_id <= :id_end;';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':id_start' => 5,
                    ':id_end' => 7,
                ));
if (!$ret) {
    $err = $pdo->errorInfo();
    die('SELECT 失敗:' . $err[2]);
}

//結果取得
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
    print_r($data);
}

$ret = $stmt->execute(array(
                    ':id_start' => 10,
                    ':id_end' => 20,
                ));
if (!$ret) {
    $err = $pdo->errorInfo();
    die('SELECT 失敗:' . $err[2]);
}

//結果取得
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
    print_r($data);
}

のようにプレースホルダの値だけ変えて複数回実行することも可能です。

■挿入
「prepare()」メソッドを使ってSQL文を組み立て「execute()」メソッドを使って実行します。
プレースホルダを使うことも可能です。

サンプルはこんな感じφ(--)
$sql = 'INSERT into tbl_test01 (column_varchar01, column_int02) VALUES (:column_varchar01, :column_int02)';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':column_varchar01' => 'ほげ1',
                    ':column_int02' => 100,
                ));
if (!$ret) {
    die('INSERT 失敗');
}

■更新
「prepare()」メソッドを使ってSQL文を組み立て「execute()」メソッドを使って実行します。
プレースホルダを使うことも可能です。

サンプルはこんな感じφ(--)
$sql = 'UPDATE tbl_test01 SET column_varchar01=:column_varchar01 WHERE pk_id=:pk_id;';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':column_varchar01' => 'ほげほげ1',
                    ':pk_id' => 40,
                ));
if (!$ret) {
    die('UPDATE 失敗');
}

■削除
「prepare()」メソッドを使ってSQL文を組み立て「execute()」メソッドを使って実行します。
プレースホルダを使うことも可能です。

サンプルはこんな感じφ(--)
$sql = 'DELETE FROM tbl_test01 WHERE pk_id=:pk_id;';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':pk_id' => 41,
                ));
if (!$ret) {
    die('DELETE 失敗');
}

まとめると

・接続はDSN、ID、パスワードを引数にnewする
・検索はquery()かprepare() → execute()
・挿入、更新、削除はprepare() → execute()
・prepare() → execute()ではプレースホルダを使用できる

となります。
トランザクション周りとか変数のバインドとか細かいあれこれは他にもいろいろありますが、
それはおいおい見ていきます。

最後に一連の流れのサンプルを置いておきますね。
「fp_test」というDB(ユーザID/パスワード:user/pwd)に
 pk_id:数値型(プライマリキー)
 column_varchar01:文字列型
 column_int02:数値型
 column_varchar02:文字列型
のカラムを持つテーブル「tbl_test01」がある前提です。
コードはこんな感じφ(--)
<?php

//$dsn = 'mysql:dbname=fp_test;host=127.0.0.1';
$dsn = 'mysql:dbname=fp_test;host=127.0.0.1;charset=utf8';
$user = 'user';
$pwd = 'pwd';

//DB接続
try {
    $pdo = new PDO($dsn, $user, $pwd);
} catch (PDOException $e) {
    die('DB接続失敗:' . mb_convert_encoding($e->getMessage(), 'UTF-8','SJIS-win'));
}

/**********************
//SET NAMES
$stmt = $pdo->query('SET NAMES utf8');
if (!$stmt) {
    $err = $pdo->errorInfo();
    die('SET NAMES 失敗:' . mb_convert_encoding($err[2], 'UTF-8','SJIS-win'));
}
**********************/

//------------------------
//SELECT(query)
//------------------------
//検索
$sql = 'SELECT * FROM tbl_test01;';
$stmt = $pdo->query($sql);
if (!$stmt) {
    $err = $pdo->errorInfo();
    die('SELECT 失敗:' . mb_convert_encoding($err[2], 'UTF-8','SJIS-win'));
}

//結果取得
$i = 0;
print "■$sql";
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $i++;
    print "\n<br>" . $i . ":";
    print_r($data);
}

print "<br>\n<br>\n";

//------------------------
//SELECT(prepare→execute)
//------------------------
//検索2
$sql = 'SELECT * FROM tbl_test01 WHERE pk_id >= :id_start and pk_id <= :id_end;';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':id_start' => 5,
                    ':id_end' => 7,
                ));
if (!$ret) {
    $err = $pdo->errorInfo();
    die('SELECT 失敗:' . mb_convert_encoding($err[2], 'UTF-8','SJIS-win'));
}

//結果取得
$i = 0;
print "■$sql";
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $i++;
    print "\n<br>" . $i . ":";
    print_r($data);
}

//------------------------
//INSERT
//------------------------
$sql = 'INSERT into tbl_test01 (column_varchar01, column_int02, column_varchar02) VALUES (:column_varchar01, :column_int02, :column_varchar02)';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':column_varchar01' => 'ほげ1',
                    ':column_int02' => 100,
                    ':column_varchar02' => 'ほげ2',
                ));
if (!$ret) {
    die('INSERT 失敗');
}

//------------------------
//UPDATE
//------------------------
$sql = 'UPDATE tbl_test01 SET column_varchar01=:column_varchar01 WHERE pk_id=:pk_id;';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':column_varchar01' => 'ほげほげ1',
                    ':pk_id' => 40,
                ));
if (!$ret) {
    die('UPDATE 失敗');
}

//------------------------
//DELETE
//------------------------
$sql = 'DELETE FROM tbl_test01 WHERE pk_id=:pk_id;';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':pk_id' => 41,
                ));
if (!$ret) {
    die('DELETE 失敗');
}

//さよーなら
$pdo = null;

うむ、長かった(--;
ここまで読んでいただいた心優しい方、ありがとうございます。
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:PDO  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事