PDO クラスを使ったデータベースへの接続からテーブルレコード取得、及びデータレコードに対しての登録・更新・削除、さらにトランザクションについて、以下の記事で説明してきました。
⇒PHP PDO(PHP Data Objects)クラスを使ったデータベースへのアクセスについて
⇒PHP PDO(PHP Data Objects)クラスを使ったデータベースへのアクセス(登録、更新、削除)について
⇒PHP PDO(PHP Data Objects)クラスを使ったトランザクションについて
⇒PHP PDO(PHP Data Objects)クラスを使った「AUTO_INCREMENT」カラムの取得について
そこで、今回は PDOStatement クラスの中で使うと思われるメソッドについて説明します。
- PDOStatement::closeCursor — カーソルを閉じてステートメントを再実行できるようにする
- PDOStatement::errorInfo — 文ハンドラにおける直近の操作に関連する拡張エラー情報を取得する
- PDOStatement::fetchAll — 全ての結果行を含む配列を返す
- PDOStatement::rowCount — 直近の SQL ステートメントによって作用した行数を返す
■PDOStatement::closeCursor — カーソルを閉じてステートメントを再実行できるようにする
カーソル とはデータ取得SQL(SELECT)を実行し、データをフェッチする時の位置を指し示すポインタの様な概念です。
closeCursor はその カーソル を廃棄し再度のSQL実行を有効とします。 以下にスクリプト例を示します。
<?php /* [pdo19.php] */ ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); // MySQLデータベースに接続 $dsn = "mysql:host=localhost;dbname=pdo;"; $user = 'root'; $password = 'password'; try { // PDOクラス生成(データベース接続) $pdo = new PDO($dsn, $user, $password); } catch (PDOException $e) { // エラー発生 die('データベース接続ERROR:'.$e->getMessage()."\n"); } // 全データ取得SQL $sql = "select * from `tm_shohin` order by id"; // SELECTクエリの準備 $pdostmt = $pdo->prepare($sql); // SELECTクエリの実行 $pdostmt->execute(); // 先頭のデータ取得 $result = $pdostmt->fetch(); // 2番目のデータ取得 $result = $pdostmt->fetch(); echo "id:".$result["id"]." name :".$result["name"]." price:".$result["price"]."\n"; // カーソルクローズ $pdostmt->closeCursor(); // 再度SELECTクエリの実行 $pdostmt->execute(); // 先頭のデータ取得 $result = $pdostmt->fetch(); echo "id:".$result["id"]." name :".$result["name"]." price:".$result["price"]."\n"; // 接続を閉じる $pdo = null; ?>
これを実行すると以下の様に表示されます。 カーソルクローズ後、再度クエリ実行した時に、先頭からフェッチされるのがわかります。
C:\xampp\htdocs\_test>php pdo19.php id:2 name :パソコン002 price:202000 id:1 name :パソコン001 price:100000
■PDOStatement::errorInfo — 文ハンドラにおける直近の操作に関連する拡張エラー情報を取得する
errorInfo メソッドは直前のSQL実行に対してのエラー情報を取得します。
エラー情報は以下の様に配列データ(指標:[0 ~ 2])として返されます。
- 情報配列[0]: SQLSTATE エラーコード (これは、ANSI SQL 標準で定義された英数 5 文字の ID)
- 情報配列[1]: ドライバ固有のエラーコード
- 情報配列[2]: ドライバ固有のエラーメッセージ
<?php /* [pdo20.php] */ ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); // MySQLデータベースに接続 $dsn = "mysql:host=localhost;dbname=pdo;"; $user = 'root'; $password = 'password'; try { // PDOクラス生成(データベース接続) $pdo = new PDO($dsn, $user, $password); } catch (PDOException $e) { // エラー発生 die('データベース接続ERROR:'.$e->getMessage()."\n"); } // 全データ取得SQL:エラーがあるSQL $sql = "select * from `tm_shohin` order by "; // SELECTクエリの準備 $pdostmt = $pdo->prepare($sql); // SELECTクエリの実行 $ret = $pdostmt->execute(); if ($ret === false) { // 実行でエラーが発生したので、エラー情報取得 $arr = $pdostmt->errorInfo(); print_r($arr); } // 接続を閉じる $pdo = null; ?>
これを実行すると以下の様に表示されます。
C:\xampp\htdocs\_test>php pdo20.php Array ( [0] => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to us e near '' at line 1 )
■PDOStatement::fetchAll — 全ての結果行を含む配列を返す
fetch メソッドは1行毎のデータを取得しますが、fetch メソッドは全ての結果行を配列で返します。
// fetchメソッド定義 public PDOStatement::fetchAll([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]]):array $fetch_style レコードを呼び出し元に返す方法を制御します。 PDO::FETCH_* 定数のどれかで、デフォルトは PDO::FETCH_BOTH です。 $fetch_argument この引数は、fetch_style の値によって意味が異なります。 PDO::FETCH_COLUMN: ここで指定した、 0 から始まる番号のカラムを返します。 PDO::FETCH_CLASS: ここで指定したクラスのインスタンスを返します。 各行のカラムがクラスのプロパティ名にマッピングされます。 PDO::FETCH_FUNC: ここで指定した関数をコールした結果を返します。 各行のカラムを関数コール時のパラメータとします。 $ctor_args fetch_style が PDO::FETCH_CLASS のときに使う、独自のクラスコンストラクタへの引数。 返り値: 結果セットに残っている全ての行を含む配列を返します。 取得結果がゼロ件だった場合は空の配列を返し、失敗した場合は FALSE を返します。
以下にスクリプトの例を示します。
<?php /* [pdo21.php] */ ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); // MySQLデータベースに接続 $dsn = "mysql:host=localhost;dbname=pdo;"; $user = 'root'; $password = 'password'; try { // PDOクラス生成(データベース接続) $pdo = new PDO($dsn, $user, $password); } catch (PDOException $e) { // エラー発生 die('データベース接続ERROR:'.$e->getMessage()."\n"); } // 全データ取得SQL:エラーがあるSQL $sql = "select * from `tm_shohin` order by id"; // SELECTクエリの準備 $pdostmt = $pdo->prepare($sql); // SELECTクエリの実行 $pdostmt->execute(); // 全ての行を取得 $arr = $pdostmt->fetchAll(); print_r($arr); // 接続を閉じる $pdo = null; ?>
これを実行すると以下の様に表示されます。
C:\xampp\htdocs\_test>php pdo21.php Array ( [0] => Array ( [id] => 1 [0] => 1 [name] => パソコン001 [1] => パソコン001 [price] => 100000 [2] => 100000 ) [1] => Array ( [id] => 2 [0] => 2 [name] => パソコン002 [1] => パソコン002 [price] => 202000 [2] => 202000 ) [2] => Array ( [id] => 3 [0] => 3 [name] => パソコン003 [1] => パソコン003 [price] => 303000 [2] => 303000 ) [3] => Array ( [id] => 4 [0] => 4 [name] => プリンタ001 [1] => プリンタ001 [price] => 50000 [2] => 50000 ) )
■PDOStatement::rowCount — 直近の SQL ステートメントによって作用した行数を返す
rowCount メソッドは相当する PDOStatement オブジェクトによって実行された 直前の DELETE, INSERT, UPDATE 文によって作用した行数を返します。
尚、SELECT 文によって作用した行数を返さないので、別の方法が必要になります。 (取得するSELECT文をラップして「SELECT COUNT(*)...」するとかでしょうか)
<?php /* [pdo22.php] */ ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); }); // MySQLデータベースに接続 $dsn = "mysql:host=localhost;dbname=pdo;"; $user = 'root'; $password = 'password'; try { // PDOクラス生成(データベース接続) $pdo = new PDO($dsn, $user, $password); } catch (PDOException $e) { // エラー発生 die('データベース接続ERROR:'.$e->getMessage()."\n"); } // レコード更新(UPDATE)SQL $sql = "update `tm_shohin` set price = price * 1.1 where id >= :id1 and id <= :id2"; // SQL文の準備 $pdostmt = $pdo->prepare($sql); // データ変数設定 $intId1 = 1; $intId2 = 3; // データバインド $pdostmt->bindValue(":id1", $intId1, PDO::PARAM_INT); $pdostmt->bindValue(":id2", $intId2, PDO::PARAM_INT); // SQL文の実行 $ret = $pdostmt->execute(); // 実行行数の取得 $count = $pdostmt->rowCount(); echo "rowCount(): $count \n"; // 接続を閉じる $pdo = null; ?>
これを実行すると以下の様に表示されます。
C:\xampp\htdocs\_test>php pdo22.php rowCount(): 3
コメント