LoginSignup
9
11

More than 5 years have passed since last update.

PDOオブジェクトのまとめ(new)

Posted at

PDOオブジェクトのメソッドまとめです

データベースに接続する(new PDO とPDOException)

接続にはデータベース(DB)とそのuserID,passをnew PDOとして渡してあげる必要があります。
そして実行(query)を行うことで、DBに接続することができます。
なお、接続に失敗した場合は例外処理(PDOException)としてスローされるのでtry,catchで捕捉します。

接続を切る場合にはNULLを使用します

.php

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を用いて取得してきます。

取得するカラム名を指定することも可能です。

.php
$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()で取り出せます。

.php
$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)の配列です。

.php
// エラーを出力
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指定します。

直接生のデータを渡すことも出来ますし、ファイルのハンドルを渡すこともできます。

.php
$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()は与えられた値を参照として受け取ります。

.php
// 設定するパラメータの名前を明示的に指定する場合は「:」を付けた名前にする
$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";
}
9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11