• ベストアンサー

フォーム入力前後のテーブルデータの同一性の確認方法は?(トランザクション?)

PHP4.3 + PEAR + PostgreSQL + Apache + Linux/Debian Sarge を使っています。 重複を許さないデータを登録するために、既に登録されているデータを確認しつつ、テーブルに新データを追加する方法についてお尋ね致します。 下記の流れを考えています。 (1)既に登録されているデータを画面に表示する。  ↓ (2)フォームを利用してユーザーが新データを入力する。  ↓ (3)フォーム入力を受信して、新データをテーブルに追加する。 この場合、(1)でのデータ表示から(3)のデータ追加登録までトランザクションをかけておかなければ、他のユーザーが同じデータを追加登録してしまう恐れがあるかと思います。 一方、(1)においてデータベースに接続した時に得たインスタンス(?)を $_SESSION['db'] = DB::connect(DSN)           (PEARを利用しています) のようにしてセッション変数に保存しても、(3)の処理に引き継ぐことができませんでした。 このような処理はどのように行えばよいのでしょうか。

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

表示して入力して更新するまでトランザクション をかけるなんてとても稼動に耐えられないでしょう。 更新時にトランザクションで再検索をかけて 更新し、駄目な場合はエラーを返すので十分だと 思います。

RASUM2
質問者

お礼

yambejp様、ありがとうございます。 御助言を参考にさせて頂きます。

その他の回答 (1)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 データベースに接続した時に得たインスタンス(DBハンドル、と呼称することが多いです)はセッションをまたいでは引き継げません。 画面設計を見直すことをお勧めいたします。

RASUM2
質問者

お礼

がる様、ありがとうございます。 ド素人なりに考えてみます。 私にとっては、DBハンドルはセッションをまたげないことがはっきりしました。

関連するQ&A

  • 複数テーブルへのデータ更新

    sql server 2012環境です。 c sharpを利用してDB登録処理を書いています。 10万件のデータを3つのテーブルにそれぞれ入れたいのですが、一度に 10万件でなく、1万件ずつコミットさせたいと思っています。 データの元となるテーブルは1つで、それに10万件のデータが あるイメージです。 イメージとしては トランザクション開始 テーブル1へ1万件登録 テーブル2へ1万件登録 テーブル3へ1万件登録 コミット というようなことを10回ループしたいのですが、可能でしょうか。 1つのトランザクション内で3テーブルへ更新をかけるやり方がよくわかりません。 あとは大元のテーブルをrow_numberを使って1万件ずつselectすればどうだろうかと 思っています。

  • フォーム入力、更新後処理で指定テーブルへのバックアップ方法

    受注DBを作成しています。 テーブル1:受注テーブル (受注日,受注訂正日,得意先名・・) テーブル2:受注テーブル履歴テーブル     (受注日,受注訂正日,得意先名・・) フォーム :受注入力フォーム があります。 受注を受けたら受注入力フォームへ入力します。 受注が変更になった場合、受注訂正日に入力後、 最初に入力したデータを受注テーブル履歴テーブル へ自動的にバックアップをとりたいと考えています。 更新後処理で、「値の代入」で処理するのでしょうか?イベントプロシージャーで入力するのでしょうか? バックアップは、初回受注入力フォームへ入力した データをすべてバックアップしておきたいと 考えております。 よろしくお願いいたします。

  • フォームから入力してテーブルにデータを落とすタイミング

    お世話になっております。 業務上Access2000を使ってDBの構築をすることになりましたが、ひとつわからないことが出てきましたのでよろしくお願いいたします。 それは、フォームからデータを入力する際に「更新」ボタンを押して初めてテーブルに落とすようにしたいのですが、その方法がわからず困っております。 Accessの「ボタン」でレコード操作で変更を保存ボタンを設置させて試しても「保存」ボタンを押す前からデータがテーブルに落ちてしまっているようです。 これを、「保存」ボタンを押して初めてテーブルにデータが落ちるVBAでのロジックの組み方をどなたかよろしくお願いいたしす。

  • 【ACCESS】フォームのデータでテーブル作成

    写真のようなフォーム上に「既設のフィールドの追加」でテーブルの値を追加し、分割フォームでデータを表示するフォームがあります。その後フォーム上のテーブルでフィルターをかけて、その状態のテーブルに対してクエリなどの処理をしたいと思いっております。 そこでフィルターをかけた状態のテーブルのデータを他のテーブルへ追加または新規作成することは可能でしょうか? 写真だと「フィールド1」をフィルタ「あ」をかけてあだけのデータを表示させてその状態のテーブルを別のテーブルへ追加または新規作成したいです。 実際のテーブルには100以上の項目があり使用者によってフィルタをかける項目も違うため自由にフィルタをかけた状態で別のテーブルへデータを追加したいと考えています。 拙い説明で申し訳ありませんがご指導よろしくお願いいたします。

  • ACCESS 入力フォームでテーブルへデータを複数追加する

    自力で問題解決できないのでお願いします。 1画面の入力フォームでテーブルへデータを複数追加をしたいと考えています。 例) ☆ 入力フォーム ________________________________________________________ 顧客番号 [0001] 顧客氏名 [山田太郎] 受付日付 [2008/6/18]   購入商品      えんぴつ      消しゴム      ボールペン                       [ 登録 ] _______________________________________________________________                 ↓ ☆ テーブルデータ _______________________________________________________________ 0001  山田太郎  2008/6/18  えんぴつ 0001  山田太郎  2008/6/18  消しゴム 0001  山田太郎  2008/6/18  ボールペン _______________________________________________________________ 以上のように入力フォーム1画面に対してテーブルのデータが入力分発生するようにしたいです。 VBAは触れないので、できればAccessの対話式で解決できればと思っています。URL等があれば教えてください。 よろしくお願いします。(⌒ ⌒)(_ _)ぺこ

  • Accessのフォームとテーブルについて教えてください。

    Access2003を使用しています。 既存のフォームAにフィールド3個を増やしました。 フォームAはテーブル(1)と連動していました。 追加したフィールドはテーブル(6)のものです。 ところがフォーム上で追加フィールドに入力が出来なくなりました。3フィールドのうち、ひとつはコンボボックスです。表示はされますが確定ができません。 フォームAのSQLステートメントではテーブル(1)・(6)以外にテーブル(2)・(3)・(4)・(5)が結合されています。 フォームAからするとテーブル(2)・(3)・(4)・(5)のデータはIDの名称を見るための参照用です。 テーブル(6)は、追加フィールドのコンボボックスが参照用で、他の2追加フィールドは、フォームから入力してテーブル(6)に反映させたいものです。 テーブル(6)の画面では入力できます。 フォーム上からは入力できません。 設定が何か欠けているからでしょうか? 他の質問では2つのテーブルをひとつのフォームにする場合は、クエリを別に設けた方がいいとなっています。フォームが出来上がっているので、できればクエリを設けずに行いたいのですが、よくない方法でしょうか? 手順なども踏まえて教えていただけると助かります。 よろしくお願いいたします。

  • ACCESSのフォームで入力したデータをテーブルに追加したい

    初歩的な質問だとは思いますが、自分の思うようにならず困っています。 テーブルのデータを元に日付のみメインフォームで単票形式で表示し、日付以外の項目はサブフォームで表形式で入力するフォームを作成したのですが、サブフォームの表形式の最後の行がいつも空白になり、そのデータが日付のみ入力され、テーブルのフィールドに追加されています。 説明がうまくできずわかりにくいとは思いますが、分かる方よろしくおねがいします。

  • PHP入力フォームについて

    現在入力フォームを作っています。 流れとしてはDBに入っている会員情報をフォーム上に呼び出して(各inputにはDB内の会員の情報が表示される)各会員が自分の情報を編集できるというフォームです。 ここで質問なのですが、会員の人が自分の入力内容を変更した際に入力漏れがあるとフォーム画面に戻るのですがその際に入力した内容が表示されるのではなくDB内のデータが表示されてしまいます。 これをDB内のデータではなく入力した内容にしたいのですが、どうしたらよろしいでしょうか? ソースは下記になります。 form.php <?php DB呼び出し・・・ $_SESSION['name'] = $row['name']; ・・・ ?> <?php echo $_SESSION['err_name']; ?> <input type="text" name="name" value="<?php echo $_SESSION['name']; ?>" /> confirm.php <?php $name = htmlspecialchars($_REQUEST['name']); if(!strlen($name)) { $_SESSION['err_name'] = '氏名を入力してください。'; $errFlag = true; } else { unset($_SESSION['err_name']); } エラーの時はform.phpに戻る ?> <?php echo $name; ?> としています。 とても省略していますが、お分かりの方がいらっしゃいましたら教えていただけると助かります。

    • 締切済み
    • PHP
  • Access フォームからの入力結果をテーブルにすることはできない?

    Access フォームからの入力結果をテーブルにすることはできない? 使用しているのはWindows XP、Access 2003です。 とある調査結果をデータベース化する仕事を与えられています。 データ1件あたりの構成要素を一目で見れるようにするために「こういうレイアウトのフォームを作って」と上司からリクエストが出ています。 まず、今手元に集まっているデータについては、 Excelで一覧表作成 → Accessにインポートしてテーブル作成 → オートフォームでフォーム作成し、デザインビューでレイアウト変更 というふうにして、上司から言われたフォームは作りました。 今後、データは増えていくので、作ったフォームから新たにデータの追加をしていくことになるのですが・・・。 フォームからデータを追加しても、元となったテーブルにはリンクしませんよね? とすると、データを追加した結果をテーブルにしたい場合はどうしたらいいのでしょうか? 今度は、そこからクエリを組む必要も出てくるため、テーブルにしたいのですが・・・。 Accessについては、以前勤めていた会社の研修で習っただけで詳しい使い方をずいぶん忘れてしまっています。今回、自分なりにいろいろ調べてはみたのですが、よくわかりませんでした。 もしかしたら、Accessの使い方を基本的に間違っているでしょうか・・・ よろしくお願いします。

  • テーブルとフォーム等の分割について

    現在、3種類のテーブルを用意しています。 1)データ格納用テーブル(メインテーブル。情報の追加登録・修正用として) 2)基幹システムのDBとリンクしているテーブル(クエリを使用してのリアルタイム検索用として) 3)追加修正が発生しない固定的な情報を持つテーブル ある情報によるとメインDBとクエリやフォーム(アプリケーション?)とは分けて保存、 使用した方が良いという事を聞きました。 これを意識して1)のメインテーブルは独立させ、2)と3)はアプリケーションのテーブルとし、 アプリケーション側からメインテーブルにリンク設定しクエリやフォームを作成しています。 その際、メインテーブル側に持たせるべきテーブルとはどの様なものなのか判断が付きません。 もしかしたら2)も3)もメインテーブル側に持たせ、アプリケーション側のテーブルは全て リンクを張るべきなのでしょうか? テーブルとフォームの分割とは、この様な考え方で宜しいのでしょうか? こうする最大の目的はマルチアクセスの環境を作る事なのですが・・・・ また、AccessはSQLサーバーやOracle等堅牢なDBではないため、 マルチアクセス環境には向いていないとの話も聞きますが、この点についても 教えて頂ければと思っております。 宜しくお願い致します。

専門家に質問してみよう