CodeZine(コードジン)

特集ページ一覧

PDOでサクサクDB開発

データベースへのアクセスを抽象化するPHP Data Objectの利用

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/07/10 00:00
目次

PDOのコンストラクタ

 先ほどはデータベースに接続する例として以下のスクリプトを書きました。

connection
try {
    $pdo = new PDO("mysq:host=localhost; dbname=pdotest",
                   "root", "password");
} catch(PDOException $e){
    var_dump($e->getMessage());
}

// 切断
$pdo = null;

 ここで、PDOの引数には以下の値を入れることができます。

pdo __construct
PDO(データベースのデータソース名(DSN),
 データベースにアクセスするユーザー名,
 ユーザーのパスワード,
 PDOのオプション)

 DSNには、データベースに接続するための文字列を書きます。PEAR::DBでは

peardb_dsn
mysql://root:password@localhost:3306/

 のように記述していると思いますが、PDOでは違うので注意してください。また、ユーザー名とパスワードもPDOのコンストラクタに記述します。

DSNについて

PDOが対応しているDBMS

 PDOでは以下のDBMSに対応しており、各DBMSのDSNは以下の用になります(localhostにある pdotestデータベースに接続する例)。

DSNの例
DBMS DSN
MySQL mysql:host=localhost; dbname=pdotest
PostgreSQL pgsql:host=localhost; dbname=pdotest
Firebird firebird:dbname=localhost:pdotest.fdb
Oracle oci:dbname=/localhost/pdotest
Sybase dblib:host=localhost; dbname=pdotest

 また、SQLiteはファイルモードとメモリモードの2つで実行でき、SQLite2とSQLite3で少し記述が違います。

DSN
SQLite DSN
SQLite2 sqlite2:/path/to/pdotest.sq2
SQLite2(memory) sqlite2::memory:
SQLite3 sqlite:/path/to/pdotest.sq3
SQLite3(memory) sqlite::memory

 詳しくは「PDOがサポートしているドライバ」を参照してください。

先ほどのサンプルでDSNを切替える

 ここで先ほど作成した接続サンプルを試してみます。

dbms_connections
try {
    $pdo = new PDO("mysql:host=localhost; dbname=pdotest",
                   "root", "password");
    var_dump($pdo->getAttribute(PDO::ATTR_DRIVER_NAME),
        $pdo->getAttribute(PDO::ATTR_SERVER_VERSION));
} catch (PDOException $e){
    var_dump($e->getMessage());
}

try {
    $pdo = new PDO("pgsql:host=localhost; dbname=pdotest",
                   "root", "password");
    var_dump($pdo->getAttribute(PDO::ATTR_DRIVER_NAME),
        $pdo->getAttribute(PDO::ATTR_SERVER_VERSION));
} catch (PDOException $e){
    var_dump($e->getMessage());
}

try {
    $pdo = new PDO("sqlite::memory");
    var_dump($pdo->getAttribute(PDO::ATTR_DRIVER_NAME),
        $pdo->getAttribute(PDO::ATTR_SERVER_VERSION));
} catch (PDOException $e){
    var_dump($e->getMessage());
}

try {
    $pdo = new PDO("sqlite2::memory");
    var_dump($pdo->getAttribute(PDO::ATTR_DRIVER_NAME),
        $pdo->getAttribute(PDO::ATTR_SERVER_VERSION));
} catch (PDOException $e){
    var_dump($e->getMessage());
}

 筆者の環境での上記の実行結果は次のようになっています。

result
string(5) "mysql"
string(15) "5.0.18-standard"
string(5) "pgsql"
string(5) "8.1.2"
string(6) "sqlite"
string(5) "3.2.8"
string(7) "sqlite2"
string(6) "2.8.17"

PDOStatementの主なメソッド(1/2)

データのCRUDに使うメソッド

 PDOのメソッドqueryまたはprepareを発行すると、その戻り値はPDOStatementオブジェクトで取得できます。PDOStatementでは次のようなメソッドがあり、データのCRUDに使います。使用できる引数については、マニュアルを参照してください。

 これらは主にSQL文とPHPの結びつけを行うメソッドです。

 bindParambindValueでは次のようなSQLに対してバインドすることができます。

insert
INSERT INTO CD(ID, TITLE, CONTENT) VALUES(:ID, :TITLE, :CONTENT)
INSERT INTO CD(ID, TITLE, CONTENT) VALUES(?, ?, ?)

 ここで、:ID?といった文字はプレースホルダーと呼び、SQLの値が入るところを指定し、bindParambindValueはこれらに対して値の結びつけを行います。また、:name?は同時に使用することができません。

 bindColumnはSQL文のカラムとの結びつけを行います。以下のSQLの場合、idtitlecontentがPHPとSQL文に結びつけられます。

select
SELECT id, title, content FROM CD

 以下がサンプルです。

example
try {
    $pdo = new PDO("mysql:host=localhost; dbname=pdotest",
                   "root", "pass");
    $stmt = $pdo->prepare(
"INSERT INTO CD(ID, TITLE, CONTENT) VALUES(:ID, :TITLE, :CONTENT)");
    $stmt->bindParam(":ID", $id);
    $stmt->bindParam(":TITLE", $title);
    $stmt->bindParam(":CONTENT", $content);

    $id = 16;
    $title = "HEXDUMP";
    $content = "Hex Dump Music";
    $stmt->execute();

    $stmt = $pdo->prepare(
"INSERT INTO CD(ID, TITLE, CONTENT) VALUES(?, ?, ?)");
    $stmt->bindValue(1, 17);
    $stmt->bindValue(2, "Minor");
    $stmt->bindValue(3, "Minor Music");
    $stmt->execute();

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare(
"SELECT ID, TITLE, CONTENT FROM CD WHERE ID > ?");
    $stmt->bindParam(1, $id);

    $id = 16;
    $stmt->execute();
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare(
"SELECT ID, TITLE, CONTENT FROM CD WHERE ID > :ID");
    $stmt->bindValue(":ID", 15);
    $stmt->execute();
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare(
"SELECT id, title, content FROM CD WHERE ID = 16");
    $stmt->execute();
    $stmt->bindColumn("id", $id);
    $stmt->bindColumn("title", $title);
    $stmt->bindColumn("content", $content);
    $stmt->fetch();
    var_dump($id, $title, $content);

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare(
"SELECT id, title, content FROM CD WHERE ID = 17");
    $stmt->execute();
    $stmt->bindColumn(1, $id);
    $stmt->bindColumn(2, $title);
    $stmt->bindColumn(3, $content);
    $stmt->fetch();
    var_dump($id, $title, $content);
} catch (PDOException $e){
    var_dump($e->getMessage());
}
  • PDOStatement::bindParam
  • PHPの変数にバインドすることができます。PDOStatement::execute実行で、指定した変数に値を入れることでその値でステートメントを実行します。
  • PDOStatement::bindValue
  • 直接値をバインドすることができます。PDOStatement::execute実行で、設定した値でステートメントを実行します。
  • PDOStatement::bindColumn
  • 上記の2つとは違い、主にSELECT文のステートメントで使用します。PDOStatement::execute実行後、PDOStatement::fetch系メソッドが実行されるまでに、指定したカラムにPHP変数をバインドします。fetch後の結果は指定したPHP変数にバインドされます。

 また、上記の実行結果は次のようになります。

result
------------
array(3) {
    ["ID"]=>
    string(2) "17"
    ["TITLE"]=>
    string(5) "Minor"
    ["CONTENT"]=>
    string(11) "Minor Music"
}
------------
array(3) {
    ["ID"]=>
    string(2) "16"
    ["TITLE"]=>
    string(7) "HEXDUMP"
    ["CONTENT"]=>
    string(14) "Hex Dump Music"
}
------------
string(2) "16"
string(7) "HEXDUMP"
string(14) "Hex Dump Music"
------------
string(2) "17"
string(5) "Minor"
string(11) "Minor Music"

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • ハタ(ハタ)

    PHPの魅力に取り付かれた一人。 現在はSeasar.PHPとしてSeasar(Java)をPHP5に移植する活動をしている。 http://blog.xole.net/(ブログ)

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5