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
コメント