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"