PDOのコンストラクタ
先ほどはデータベースに接続する例として以下のスクリプトを書きました。
try { $pdo = new PDO("mysq:host=localhost; dbname=pdotest", "root", "password"); } catch(PDOException $e){ var_dump($e->getMessage()); } // 切断 $pdo = null;
ここで、PDOの引数には以下の値を入れることができます。
PDO(データベースのデータソース名(DSN),データベースにアクセスするユーザー名,
ユーザーのパスワード,
PDOのオプション)
DSNには、データベースに接続するための文字列を書きます。PEAR::DBでは
mysql://root:password@localhost:3306/
のように記述していると思いますが、PDOでは違うので注意してください。また、ユーザー名とパスワードもPDOのコンストラクタに記述します。
DSNについて
PDOが対応しているDBMS
PDOでは以下のDBMSに対応しており、各DBMSのDSNは以下の用になります(localhostにある pdotestデータベースに接続する例)。
| 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で少し記述が違います。
| SQLite | DSN |
| SQLite2 | sqlite2:/path/to/pdotest.sq2 |
| SQLite2(memory) | sqlite2::memory: |
| SQLite3 | sqlite:/path/to/pdotest.sq3 |
| SQLite3(memory) | sqlite::memory |
詳しくは「PDOがサポートしているドライバ」を参照してください。
先ほどのサンプルでDSNを切替える
ここで先ほど作成した接続サンプルを試してみます。
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()); }
筆者の環境での上記の実行結果は次のようになっています。
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の結びつけを行うメソッドです。
bindParamとbindValueでは次のようなSQLに対してバインドすることができます。
INSERT INTO CD(ID, TITLE, CONTENT) VALUES(:ID, :TITLE, :CONTENT) INSERT INTO CD(ID, TITLE, CONTENT) VALUES(?, ?, ?)
ここで、:IDや?といった文字はプレースホルダーと呼び、SQLの値が入るところを指定し、bindParamとbindValueはこれらに対して値の結びつけを行います。また、:nameと?は同時に使用することができません。
bindColumnはSQL文のカラムとの結びつけを行います。以下のSQLの場合、idとtitle、contentがPHPとSQL文に結びつけられます。
SELECT id, title, content FROM CD
以下がサンプルです。
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
- PDOStatement::bindValue
- PDOStatement::bindColumn
PDOStatement::execute実行で、指定した変数に値を入れることでその値でステートメントを実行します。PDOStatement::execute実行で、設定した値でステートメントを実行します。SELECT文のステートメントで使用します。PDOStatement::execute実行後、PDOStatement::fetch系メソッドが実行されるまでに、指定したカラムにPHP変数をバインドします。fetch後の結果は指定したPHP変数にバインドされます。また、上記の実行結果は次のようになります。
------------
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"

データベースにアクセスするユーザー名,