質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Zend Framework

Zend Frameworkは、PHP5で記述されたWebアプリケーションフレームワークです。Zend Frameworkには守らなければならない開発の規定というものは存在せず、MVCなどの複数のコンポーネントを提供しています。

Q&A

解決済

1回答

1815閲覧

更新処理が行われた場合だけ、リクエストパラメータを保存する仕組みを作りたい

soich

総合スコア176

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Zend Framework

Zend Frameworkは、PHP5で記述されたWebアプリケーションフレームワークです。Zend Frameworkには守らなければならない開発の規定というものは存在せず、MVCなどの複数のコンポーネントを提供しています。

0グッド

0クリップ

投稿2017/04/12 10:45

現状の問題を以下に箇条書きでまとめさせていただきました。
何卒ご一読いただけますと幸いです。

##環境
PHP 5.3
Zend Framework 1.11.14
MySQL 5.6.14

##やりたいこと
DBの更新処理を行った時だけグローバル変数の$_REQUESTをMySQLに履歴として保存したい
→更新処理を行ったアクション限定でDB保存処理を行いたい
(各アクションにDB登録処理を書くのではなく、親クラスで更新処理を行ったことを判定して$_REQUEST登録処理を行いたい)

##現状把握・問題
更新処理を行ったアクションが統一されていない(registActionだったりupdateActionだったりする)

##思いついた案

  • HTTPメソッドがPOSTで送られるもので絞り込んで登録

→indexActionやconfirmActionでPOSTされているので、ホワイトリストで絞り込みが必要
→ホワイトリストの管理運用が必要になるので、できればやりたくない

  • アクションでホワイトリストを作成して絞り込んで登録

→ホワイトリストの管理運用が必要になるので、できればやりたくない

  • 保存する各アクションにフラグを設定する

→現存のアクションがあまりに多く、今後追加が必要になることもあり、できればやりたくない

#これができれば実現できそうだと思うもの

  • PHPのプロセス内でUPDATE文を実行したことを検知してDBに登録する

これぐらいしか案が思いつかず、途方に暮れております・・・

ソースで書くとこんなイメージです。

  • 子クラスその1
class Ko_First extends Oya{ public function indexAction() { //ここの$_REQUESTは登録しない(HTTPメソッドがPOST) } public function registAction() { //ここの$_REQUESTは登録したい(HTTPメソッドがPOST) } }
  • 子クラスその2
class Ko_Second extends Oya{ public function indexAction() { //ここは登録しない } public function confirmAction() { //ここの$_REQUESTは登録しない(HTTPメソッドがPOST) } public function updateAction() { //ここの$_REQUESTは登録したい(HTTPメソッドがPOST) } }
  • 親クラス
class Oya{ ・・・ public function postDispatch() // $_REQUESTをDBに登録する処理 } }

postDispatch()はAction後に行われるメソッドです。

参考になればどんな内容でもいいので、アドバイス頂けましたら幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

全体的に意味がわからないのですが、
UPDATE文をPHPから発行するなら、発行後にrow_count()などして
影響があったかどうか確認しますね
それが「$_REQUESTをMySQLに履歴として保存したい」にどうつながるのでしょうか?
更新を検知してそれを元に更新したらまた更新が検知されて無限ループですよね?
また$_REQUEST=パラメータ全部をどう登録したいのかもよくわかりません。

むしろ$_REQUESTの値をつかってUPDATE文を発行して、影響がなければすなわち
$_REQUESTを投入しないし、影響があればUPDATEされるのだから
単にUPDATE文を1回発行するだけで良い話のような気がします

trigger sample

データ用テーブルAと履歴用テーブルB
テーブルAのaidは主キーだが履歴を取る場合Bの主キーにはナリえないのでBに新たに
主キーbidを設定し、更新された日時も別途保存することとする

SQL

1create table tblA(aid int primary key,val1 int,val2 int,val3 int); 2create table tblB(bid int primary key auto_increment,aid int ,val1 int,val2 int,val3 int,modified datetime);

トリガー作成

SQL

1drop trigger if exists a_to_b; 2delimiter // 3create trigger a_to_b after update on `tblA` 4for each row begin 5insert into tblB SET aid=old.aid,val1=old.val1,val2=old.val2,val3=old.val3,modified=now(); 6end; 7// 8delimiter ;

(1)データ投入

SQL

1insert into tblA values(1,101,201,301),(2,102,202,302),(3,103,203,303);

tblAにはデータが新規投入されるが、tblBには投入されない

(2)更新データを投入

SQL

1insert into tblA values(2,112,212,312),(4,104,204,304) on duplicate key update val1=values(val1),val2=values(val2),val3=values(val3);

id=2は更新されるのでtblBに古いデータが投入される、id=4は新規なので無視

(3)更新データを投入

SQL

1insert into tblA values(2,122,222,322),(4,104,204,304) on duplicate key update val1=values(val1),val2=values(val2),val3=values(val3);

id=2は更新されるのでtblBに古いデータが投入される
(tblBのidはダブっているのが確認できる)
id=4は全てのvalが元のデータと一緒なので更新がかからないので無視

投稿2017/04/13 01:38

編集2017/04/13 03:37
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soich

2017/04/13 02:48

コメントありがとうございます。 わかりづらい文章だったかもしれません。すみません Aテーブルーデータを保存するテーブル BテーブルーAテーブルの更新履歴を残すテーブル としてお話いたします。 >更新を検知してそれを元に更新したらまた更新が検知されて無限ループですよね? <?php class A extends B{ public function updateAction(){ // UPDATE文(Aテーブルに対して) } } class B{ public function postDispach(){ if([UPDATEが行われたかの判定]){ //update文(Bテーブルに対して) } } } $a = new A(); $a->updateAction(); //実際は画面からupdateActionを叩く想定 ?> このような流れで処理を行おうと思っているのですが、これでは無限ループにはならないと思っています。 >「$_REQUESTをMySQLに履歴として保存したい」にどうつながるのでしょうか? ご説明いただいている通り、UPDATE文で$_REQUESTのデータをAテーブルに保存しますがUPDATEがされる為、AテーブルのUPDATE前のデータは消えてしまうと認識しています。 その履歴をBテーブルに別途保存したいと考えています。バックアップ的な意味合いで更新履歴を残しておきたいのです。 >また$_REQUEST=パラメータ全部をどう登録したいのかもよくわかりません。 $_REQUESTはjson形式の文字列にして一つのカラムに保存するつもりです。 >発行後にrow_count()などして影響があったかどうか確認しますね 認識が間違っていたら申し訳ないのですが、updateの場合は既存の行の値を変更するだけなのでrow_countの数字は変わらないと思うのですがいかがでしょうか? 以上を踏まえて何か解決策がありましたら、よろしくお願いいたします。
yambejp

2017/04/13 03:38 編集

Aテーブルが上書き更新される際にBテーブルに退避させるのであれば トリガーで処理すればいいと思います。(トリガーのサンプル追記しときました)
soich

2017/04/13 13:42

トリガーという方法があるのですね。 実際に導入可能か検証してみます。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問