SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

PDOでサクサクDB開発

データベースへのアクセスを抽象化するPHP Data Objectの利用


  • X ポスト
  • このエントリーをはてなブックマークに追加

PDOの各種メソッド(2/2)

quote

 PDO::quoteはSQL文をクオートします。ただし、実行するSQLとしてPDO::quoteを用いるのはお薦めしません。SQL文を発行するならばPDO::prepareで行うのが良いでしょう。

 また、PDO::prepareでプリペアドステートメントとして実行する方が、SQLインジェクションを防ぐ意味でもキャッシュが行われたりする意味においても良く、そういった意味ではPDO::quoteでクオートしたSQLを使うメリットはありません。

quote
try {
    $pdo = CZ_PDO::getConnection();

    // 以下のSQLをクオート処理します。
    $sql = $pdo->quote(
"SELECT * FROM CD WHERE ID = \'hoge\'
 and ID = $\"'aa.'\" ;'\;and ID = \"c:\\php\"");;
    var_dump($sql);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
string(83) "'SELECT * FROM CD WHERE ID = \''hoge\''
 and ID = $"''aa.''" ;''\;and ID = "c:\php"'"

errorCode/errorInfo

 PDO::errorCodeおよびPDO::errorInfoはデータベースからのエラーメッセージおよびエラーコードを取得します。PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTIONが設定されている場合は、PDOExceptionで取得できる値と同じになります。

error
try {
    $pdo = CZ_PDO::getConnection();

    // エラー時にPDOException をthrowしないように変更します。
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
    // 存在しないテーブルから取得する
    $pdo->query("SELECT * FROM CASSETTE");
    var_dump($pdo->errorCode(), $pdo->errorInfo());

    // PDOException をthrowするように変更します。
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 存在しないテーブルから取得します。
    $pdo->query("SELECT * FROM MD");
    var_dump($pdo->errorCode(), $pdo->errorInfo());
} catch (PDOException $e) {
    var_dump($e->getCode(), $e->errorInfo, $e->getMessage());
}

 上記の実行結果は次のようになります。エラーコードやエラーメッセージはDBMSや、PDOのドライバによって違います(今回はSQLite3/pdo_sqliteの実行結果です)。

result
string(5) "HY000"
array(3) {
    [0]=>
    string(5) "HY000"
    [1]=>
    int(1)
    [2]=>
    string(23) "no such table: CASSETTE"
}
string(5) "HY000"
array(3) {
    [0]=>
    string(5) "HY000"
    [1]=>
    int(1)
    [2]=>
    string(17) "no such table: MD"
}
string(51) "SQLSTATE[HY000]: General error: 1 no such table: MD"

getAttribute/setAttribute

 PDOの属性を操作できます。設定できる属性については後ほど詳しく説明します。

attribute
$pdo = CZ_PDO::getConnection();

var_dump($pdo->getAttribute(PDO::ATTR_ERRMODE));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
var_dump($pdo->getAttribute(PDO::ATTR_ERRMODE));

// PDOのドライバによっては固有の設定値があります。
// 以下はMySQLなどのドライバで使えますが、
// SQLiteではサポートされていない属性
var_dump($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT));
result
int(2)
int(0)

Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not
 support this function: driver does not support that attribute ...
bool(false)

getAvailableDrivers

 PDOで読み込んでいるPDOドライバ名を返します。以下がサンプルです。

driver
var_dump(PDO::getAvailableDrivers());

 PDO::getAvailableDriversはstaticであるため、PDOから直接参照します。ここで取得される値は「php.ini」などでextension=pdo_sqlite.soなどと読み込んでいるドライバが返されます。筆者の場合、上記の実行結果は以下になりました。

result
array(7) {
    [0]=>
    string(7) "sqlite2"
    [1]=>
    string(5) "mysql"
    [2]=>
    string(5) "pgsql"
    [3]=>
    string(6) "sqlite"
    [4]=>
    string(8) "firebird"
    [5]=>
    string(5) "dblib"
    [6]=>
    string(3) "oci"
}

lastInsertId

 PDO::lastInsertIdは最後に追加されたIDまたはシーケンスを返します。

lastinsertid
try {
    $pdo = CZ_PDO::getConnection();

    var_dump($pdo->query("SELECT last_insert_rowid()")->fetchColumn());
    var_dump($pdo->lastInsertId());
    $pdo->query(
"INSERT INTO CD(ID, TITLE, CONTENT) VALUES(22, 'ABC', 'ABC SONG')");
    var_dump($pdo->lastInsertId());
    $pdo->query(
"INSERT INTO CD(ID, TITLE, CONTENT) VALUES(12, 'ABC', 'ABC SONG')");
    var_dump($pdo->lastInsertId());

} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
string(1) "4"
string(1) "4"
string(2) "22"
string(2) "12"

 上記はSQLiteで実行し、SELECT last_insert_rowid()を発行しました。

 PDO::lastInsertIdと同じIDが返ってくるので正しく動作してると言えると思います。また、INSERTを発行したときも、INSERTで追加した値と同じになっていることが実行結果から分かると思います。

次のページ
PDOStatementのその他のメソッド

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

ハタ(ハタ)

PHPの魅力に取り付かれた一人。現在はSeasar.PHPとしてSeasar(Java)をPHP5に移植する活動をしている。http://blog.xole.net/(ブログ)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/433 2007/12/13 16:05

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング