php.iniにDSNを定義する
pdo.dsn.sqlserver=”mssql:host=localhost; dbname=db”
pdo.dsn.sybase=”sybase:host=localhost; dbname-db”
pdo.dsn.firebird=”firebird:User=foo;Password=baa;Database=DB.GDE;DataSource=localhost;Port=3050”
pdo.dsn.mysql=”mysql:host=localhost;dbname=db;charset=utf8”
pdo.dsn.oracle=”oci:db”
pdo.dsn.oracle=”oci:dbname=//localhost:1521/db”
pdo.dsn.odbc=”odbc:DSN=DB;UID=foo;PWD=baa”
pdo.dsn.postgresql=”pgsql:host=localhost port=5432 dbname=db user=foo password=baa”
pdo.dsn.sqlite3xonfile=”sqlite:/var/www/html/hoge/db.sqlite”
pdo.dsn.sqlite3xonemory=”sqlite::memory::”
pdo.dsn.sqlite2xonfile=”sqlite2:/var/www/html/hoge/db.sqlite”
pdo.dsn.sqlite2xonmemory=”sqlite2::memory::”
データベースに接続する
try {
$db = new PDO(‘sqlserver’,username,password);
//$db = new PDO(‘odbc’); //DSNにユーザー・パスワードを登録しているので不要
//$db = new PDO(‘sqlite’); //SQLiteはユーザー・パスワードの概念がないので不要
} catch (PDOException $e) {
die (‘データベースに接続できませんでした:’.$e->getMessage());
}
SQLを発行する
exec()メソッド、またはquery()メソッドによる。
exec()メソッドは操作したレコード数を返す。
query()メソッドは結果セットを返す。
INSERT、UPDATE、DELETE、CREATE TABLE等はexec()メソッドを使う
try {
$db = new PDO(‘sqlite’);
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //データベース操作のエラーをPDOException例外とする
$db->exec(‘CREATE TABLE master(id INTEGER AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),email VARCHAR(100))’);
} catch (PDOExeption $e) {
die(‘テーブルを作成できませんでした:’.e->getMessage());
}
SELECT文はレコードセットを返してくるのでquery()メソッドを使う
PDO::query(string sql_statement)
ユーザー入力から動的にSQLクエリを生成する
quote()メソッドでエスケープする
string PDO::quote(string hoge [,int parameter_type])
プレイスホルダで置き換える
例1)
$db = new PDO(‘sqlite’);
$object = $db->prepare(‘INSERT INTO master(name,email) VALUES(?,?)’);
$object->execute(array($_POST[‘name’],$_POST[‘email’]));
?の部分にパラメータが埋め込まれる。
例2)
?の代わりに:<name>形式で明示的に指定。
ついでにbindParamでパラメータと値を事前に対応付けてから実行。
$db = new PDO(‘sqlite’);$object = $db->prepare(‘INSERT INTO master(name,email) VALUES(:name,:email)’);
$object->bindParam(‘:name’,$_POST[‘name’],PDO::PARAM_STR,50);
$object->bindParam(‘:email’,$_POST[‘email’],PDO::PARAM_STR,100);
$object->execute();
SELECTした結果を順に処理する
$db = new PDO(‘sqlite’);
$rset = $db->query(‘SELECT * FROM master’);
while ( $row=$rset->fetch(PDO::FETCH_ASSOC)) {
print ($row[‘name’]);
print ($row[‘email’]);
}
※実際にはHTMLに組み込むと思うので<table>やら<td>やらで適当に括って使う。
トランザクション
トランザクションの開始
exec(‘BEGIN’)
コミット
exec(‘COMMIT’)
ロールバック
exec(‘ROLLBACK’)

