PDOオブジェクトのメソッドまとめです
データベースに接続する(new PDO とPDOException)
接続にはデータベース(DB)とそのuserID,passをnew PDOとして渡してあげる必要があります。
そして実行(query)を行うことで、DBに接続することができます。
なお、接続に失敗した場合は例外処理(PDOException)としてスローされるのでtry,catchで捕捉します。
接続を切る場合にはNULLを使用します
try{
$addr = 'mysql:host=localhost; dbname=mydata';
$user = 'root';
$pass = 'password';
// 接続
$pdo = new PDO($addr, $user, $pass);
$state = $pdo->query('SET NAMES utf-8');
catch(PDOException $e){
echo "database open error: $addr\n $user\n" .
$e->getMessage();
}
$pdo = NULL; // 切断
挿入した直近のIDを取得する(lastInsertId)
最新のIDを取得する場合にはPDO::lastInsertId()を使います。
MySQLでは、Autoincrementのカラムを取得してくるため、
新しくIDを発行し直した場合に、IDをSELECT文で取得するのではなく
lastInsertIDを用いて取得してきます。
取得するカラム名を指定することも可能です。
$table = 'Sample1';
$msg = "INSERT INTO $table name VALUES namae";
$state = $pdo->query($msg);
if($state!=false){
$id = $pdo->lastInsertId(); // => insert された id
echo "insert id:$id\n";
}
else{
$err = $pdo->errorInfo();
echo $err[2] . "\n";
}
レコードの情報を取得する(fetch)
PDOStatement::fetch()を使います。引数には取り出し方を指定します。取り出す要素をすべて取り出す場合
PDOStatement::fetchAll()で取り出せます。
$table = 'Sample1';
$state = $pdo->query("SELECT * FROM $table WHERE id=1");
// 引数なしだと0からの配列になる。
$row = $state->fetch();
echo $row[0] . "\n";
echo $row[1] . "\n";
echo $row[2] . "\n";
$state = $pdo->query("SELECT * FROM $table WHERE id=1");
// 連想配列で取得
$row = $state->fetch(PDO::FETCH_ASSOC);
echo $row['id'] . "\n";
echo $row['name'] . "\n";
echo $row['val'] . "\n";
$state = $pdo->query("SELECT * FROM $table");
// 複数レコードを取得
while($row = $state->fetch()){
echo $row[0] . "\n";
echo $row[1] . "\n";
echo $row[2] . "\n";
}
$state = $pdo->query("SELECT * FROM $table");
// レコードを連想配列で一気に取得
$rows = $state->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row){
echo $row['id'] . "\n";
echo $row['name'] . "\n";
echo $row['val'] . "\n";
}
エラー情報を取得する(errorInfo)
POD::errorInfo(),PDOStatement::errorInfo()からエラー情報を取得できます。 errorInfo()からの値は エラーコード()、 ドライバーエラーコード(driver code)、 ドライバーエラーメッセージ(driver message)の配列です。// エラーを出力
function checkPDOError($obj){
if($obj){
$err = $obj->errorInfo();
echo "sql state error code:" . $err[0] . "\n";
echo "driver error code:" . $err[1] . "\n";
echo "driver error message:" . $err[2] . "\n";
}
}
$table = 'Sample1';
// SQL文がおかしい場合について
// PDOからエラーを取得
$state = $pdo->query("SELET * FROM $table");
checkPDOError($pdo); // => エラーを出力
checkPDOError($state); // => stateはfalse
// PDOStatementからエラーを取得
$state = $pdo->prepare("SELET * FROM $table");
$state->execute();
checkPDOError($pdo); // => 特に問題はない
checkPDOError($state); // => エラーを出力
大きいオブジェクトを扱う
フィールドのデータ型をBLOBにします。 大きいオブジェクトとは一般的に4KB以上です。データを設定するときはPDOStatement::bindParam()や
PDOStatement::bindValue()などを使用して引数にPDO::PARAM_LOB指定します。
直接生のデータを渡すことも出来ますし、ファイルのハンドルを渡すこともできます。
$table = 'Sample1';
// データの登録
$fp = fopen('20130708.jpg', 'rb');
$state = $pdo->prepare("UPDATE $table SET data=? WHERE id=1");
$state->bindParam(1, $fp, PDO::PARAM_LOB);
$state->execute();
// データの取得
$state = $pdo->query("SELECT * FROM $table WHERE id=1");
$row = $state->fetch(PDO::FETCH_ASSOC);
echo $row['data'] . "\n";
// 処理の途中で例外を投げてロールバックさせるサンプルコード
$table = 'Sample1';
try{
// トランザクション開始
if($pdo->beginTransaction()){
$msg = "UPDATE $table SET val=100 WHERE id=2";
$state = $pdo->query($msg);
// commit する前に例外を投げてrollbackしてみる
throw new PDOException("Force exception");
$pdo->commit(); // コミット
}
}
catch(PDOException $e){
$pdo->rollback(); // 問題発生!元に戻す
echo $e->getMessage() . "\n";
}
効率的にSQL文を実行する(プリペアドプロシージャ,ストアドプロシージャ)
PDO::prepare()で基本的なSQL文を設定し、 PDOStatement::bindValue(), PDOStatement::bindParam()で変動するパラメータを設定し、 PDOStatement::execute()でSQL文を実行します。PDOStatement::bindValue()と違い
PDOStatement::bindParam()は与えられた値を参照として受け取ります。
// 設定するパラメータの名前を明示的に指定する場合は「:」を付けた名前にする
$state = $pdo->prepare("UPDATE $table SET name=:name, val=:val WHERE id=:id");
if($state!=false){
// パラメータの設定
if($state->bindValue(':name', 'goto', PDO::PARAM_STR)==false){ echo "error bindValue"; }
if($state->bindValue(':val', 11, PDO::PARAM_INT)==false){ echo "error bindValue"; }
if($state->bindValue(':id', 1, PDO::PARAM_INT)==false){ echo "error bindValue"; }
if($state->execute()==false){
$err = $state->errorInfo();
echo $err[2] . "\n";
}
}
else{
$err = $pdo->errorInfo();
echo $err[2] . "\n";
}
// 設定するパラメータの名前を明示的に設定しない場合は「?」を付ける
$state = $pdo->prepare("UPDATE $table SET name= ? , val= ? WHERE id= ? ");
if($state!=false){
// パラメータの設定
// bindValue()の第一引数は0からではなく1からであることに注意
if($state->bindValue(1, 'goto', PDO::PARAM_STR)==false){ echo "error bindValue"; }
if($state->bindValue(2, 11, PDO::PARAM_INT)==false){ echo "error bindValue"; }
if($state->bindValue(3, 1, PDO::PARAM_INT)==false){ echo "error bindValue"; }
if($state->execute()==false){
$err = $state->errorInfo();
echo $err[2] . "\n";
}
}
else{
$err = $pdo->errorInfo();
echo $err[2] . "\n";
}