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 not support 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
で追加した値と同じになっていることが実行結果から分かると思います。