コンテンツへスキップ

七十歳からの独習

オブジェクト指向 Work-2-2 PDOクラスでデータを取得(SELECT)prepare版

【ワークの目標】
MariaDB(MySQL)とPHPを使って、WEB上で動く仮想の販売管理システムを作ること。もちろん完成すればわが農園で利用することもできる。

何と、前回の投稿からかなり日数が経過してしまった。

少し、忘れかけてしまっている。

今回は、店舗テーブルに店舗コード、店舗名を追加する。データベースの操作としてはINSERT(挿入)となる。

データベースの登録(INSERT)、更新(UPDATE)、削除(DELETE)を行う場合はは注意が必要だ。データベースを更新する際に、エラーが発生した場合に、データを失う危険性があること。また、複数のユーザがひとつのデータベースを同時に操作する場合には、データベースを操作する一連の処理中には他の処理は行えないようにする必要がある。

そこで、トランザクション処理と言うのを行う。データの登録、更新、削除を行う場合にトランザクション処理を行う。トランザクション処理中に何らかのエラーが発生した場合は、データを元の状態に戻すようにする(ロールバック処理)。

トランザクション処理のイメージ
トランザクション処理のイメージ
3-1【支店のデータの登録】sample3-1.php
  1. <?php
  2. // 変数の初期化
  3. $tenpo_code = "0007";
  4. $tenpo_name = "小林支店";
  5. try {
  6.     // DBへ接続
  7.     $dbh = new PDO("mysql:host=localhost; dbname=sms; charset=utf8", 'root', 'password');
  8.     //トランザクション開始
  9.     $dbh->beginTransaction();
  10.     // SQL作成
  11.     $sql = "INSERT INTO tenpo (tenpo_code,tenpo_name) VALUES(:tenpo_code,:tenpo_name)";
  12.     // SQL実行準備
  13.     $res = $dbh->prepare($sql);
  14.     //値をバインド
  15.     $res->bindValue(':tenpo_code', $tenpo_code, PDO::PARAM_STR);
  16.     $res->bindValue(':tenpo_name', $tenpo_name, PDO::PARAM_STR);
  17.     // SQL実行
  18.     $res->execute();
  19.     $dbh->commit();
  20.     echo "データを".$res->rowCount()."件挿入しました。<br>";
  21. }
  22. //エラー処理
  23. catch(PDOException $e) {
  24.     echo $e->getMessage();
  25.     die();
  26. }
  27. // 接続を閉じる
  28. $dbh = null;
  29. ?>

13行目の
$dbh->beginTransaction();

28行目の
$dbh->commit();

が新しく出てきた記述だ。

トランザクションの処理のイメージにあった、ロールバック処理の記述はないが、beginTransaction();を宣言しておけば、不具合が生じたときにPDO はデータを守るため自動的にロールバックを行うらしい。

$dbh->commit();で一括コミットで処理が終了する。

【注意】
10行目の
$dbh = new PDO(“mysql:host=localhost; dbname=sms; charset=utf8″, ‘root’, ”);
は、セキュリティ上の理由でソース内に記述すべきではない。
PHPのソースは外部からは基本的には見えないが、何らかの原因で見られてしまう可能性も否定できない。外部から見られたくない部分はhtdocsフォルダ外に記述し、sample1-3.phpで記述した方法で読み込むようにする。
もちろん、ログイン名とパスワードも適正に設定する。

【実行結果】

データを1件挿入しました。

tenpoテーブルの中身を確認すると確かにデータが挿入さている。

テーブル内容の確認
テーブル内容の確認

ところで、再度実行すると当然だがエラーとなる。

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘0007’ for key ‘tenpo_code’

日本語に訳すと

SQLSTATE [23000]:整合性制約違反:1062キー ‘tenpo_code’のエントリ ‘0003’が重複しています

1回目の実行ですでに店舗コード0007は登録されている。店舗コードは(tempo_code)は重複しない設定であったのでエラーになった次第。この場合の処理は後で考える。
とりあえず、登録ができることを確認しましたので、ここではこれでOKとする。

これで、ひとまずINSERTは終了。つぎはUPDATE(更新)を学習する。

ホーム » 七十歳からの独習 オブジェクト指向 Work-3-1

七十歳からの独習 オブジェクト指向 Work-3-1

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です