PDOオブジェクトのまとめ（new）

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

<h2>データベースに接続する（new PDO とPDOException）</h2>

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

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

```php:.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;    // 切断

```

<h2>挿入した直近のIDを取得する（lastInsertId）</h2>

最新のIDを取得する場合にはPDO::lastInsertId()を使います。

MySQLでは、Autoincrementのカラムを取得してくるため、
新しくIDを発行し直した場合に、IDをSELECT文で取得するのではなく
lastInsertIDを用いて取得してきます。

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

```php:.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";
}
```

<h2>レコードの情報を取得する（fetch）</h2>
PDOStatement::fetch()を使います。引数には取り出し方を指定します。

取り出す要素をすべて取り出す場合
PDOStatement::fetchAll()で取り出せます。

```php:.php
$table = 'Sample1';

$state = $pdo->query("SELECT * FROM  $table WHERE id=1");
// 引数なしだと０からの配列になる。
$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";
}
```
<h2>エラー情報を取得する（errorInfo）</h2>
POD::errorInfo(),PDOStatement::errorInfo()からエラー情報を取得できます。
errorInfo()からの値は
エラーコード()、
ドライバーエラーコード(driver code)、
ドライバーエラーメッセージ(driver message)の配列です。

```php:.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);    // => エラーを出力
```

<h2>大きいオブジェクトを扱う</h2>
フィールドのデータ型をBLOBにします。
大きいオブジェクトとは一般的に4KB以上です。

データを設定するときはPDOStatement::bindParam()や
PDOStatement::bindValue()などを使用して引数にPDO::PARAM_LOB指定します。

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

```php:.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";
}
```

<h2>効率的にSQL文を実行する(プリペアドプロシージャ,ストアドプロシージャ)</h2>
PDO::prepare()で基本的なSQL文を設定し、
PDOStatement::bindValue(),
PDOStatement::bindParam()で変動するパラメータを設定し、
PDOStatement::execute()でSQL文を実行します。

PDOStatement::bindValue()と違い
PDOStatement::bindParam()は与えられた値を参照として受け取ります。

```php:.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";
}
```