PDOの各種メソッド(2/2)
quote
PDO::quoteはSQL文をクオートします。ただし、実行するSQLとしてPDO::quoteを用いるのはお薦めしません。SQL文を発行するならばPDO::prepareで行うのが良いでしょう。
また、PDO::prepareでプリペアドステートメントとして実行する方が、SQLインジェクションを防ぐ意味でもキャッシュが行われたりする意味においても良く、そういった意味ではPDO::quoteでクオートしたSQLを使うメリットはありません。
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()); }
上記の実行結果は以下になります。
string(83) "'SELECT * FROM CD WHERE ID = \''hoge\''and ID = $"''aa.''" ;''\;and ID = "c:\php"'"
errorCode/errorInfo
PDO::errorCodeおよびPDO::errorInfoはデータベースからのエラーメッセージおよびエラーコードを取得します。PDO::ATTR_ERRMODEにPDO::ERRMODE_EXCEPTIONが設定されている場合は、PDOExceptionで取得できる値と同じになります。
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の実行結果です)。
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の属性を操作できます。設定できる属性については後ほど詳しく説明します。
$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));
int(2) int(0) Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does notsupport this function: driver does not support that attribute ... bool(false)
getAvailableDrivers
PDOで読み込んでいるPDOドライバ名を返します。以下がサンプルです。
var_dump(PDO::getAvailableDrivers());
PDO::getAvailableDriversはstaticであるため、PDOから直接参照します。ここで取得される値は「php.ini」などでextension=pdo_sqlite.soなどと読み込んでいるドライバが返されます。筆者の場合、上記の実行結果は以下になりました。
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またはシーケンスを返します。
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()); }
上記の実行結果は以下になります。
string(1) "4" string(1) "4" string(2) "22" string(2) "12"
上記はSQLiteで実行し、SELECT last_insert_rowid()を発行しました。
PDO::lastInsertIdと同じIDが返ってくるので正しく動作してると言えると思います。また、INSERTを発行したときも、INSERTで追加した値と同じになっていることが実行結果から分かると思います。

"SELECT * FROM CD WHERE ID = \