• ベストアンサー

すっきりしたロジックを・・

PHP5.0使用です。 画面からデータを登録(修正)し、DBに書き込むプログラムを作っています。 プログラムは登録(修正)画面→確認画面→DB書き込みの3本に分けて、それぞれセッション変数(またはPOST変数)で情報を渡しています。 3本のスクリプトの最初で、セッション変数→普通の変数へ移す処理を行っているのですが($fld001=$_SESSION('fld001')のように)、変数の数が多いため、いかにも冗長です。 functionでもクラスでもいいのですが、各スクリプトで使い回しが出来るような、すっきりしたいい方法はないでしょうか?

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

  • ベストアンサー
回答No.2

恐らく、extract関数を使えば一発かと extract($_SESSION); あるいは、 extract($_POST); こうすれば $varname1 = $_SESSION[varname1]; $varname2 = $_SESSION[varname2]; .......... とした場合と同じです。

candie-o
質問者

お礼

ありがとうございました。参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • hakugen
  • ベストアンサー率36% (8/22)
回答No.1

こんにちは。 実際使ったことがないので、ちゃんと動くかわからないですけど、オブジェクトとしてセッションに渡せばよいのではないでしょうか。 Class Data{ var fld001; function setFld001($fld001){ $this->fld001 = $fld001; } function getFld001(){ return $this->fld001; } } みたいなクラスを用意しておいて、オブジェクトを生成しておきます。 そして、session_register()関数で登録すれば勝手にシリアライズをしてくれて使えるようです。 あとは、もっと直観的にやるとすれば Class Data{ var $fld001; var $fld002; function setData(){ $this->fld001 = $_SESSION['fld001']; $this->fld002 = $_SESSION['fld002']; } } のような感じのクラスを一つ別ファイルで用意するというのはいかがでしょうか?

参考URL:
http://php.planetmirror.com/manual/ja/language.oop.serialization.php
candie-o
質問者

お礼

ありがとうございました。参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPスクリプトでperlスクリプト

    はじめまして。PHP初心者です。助け舟をお願いします。 PHPスクリプトで、formの表示からデータの受け取り→ファイルに書込み→終了画面の表示ができるスクリプトを書くことが出来ました。 これをphpスクリプト1とします。 POSTで受け取った変数を元に処理した変数を返すperlスクリプトがあります。 これをperlスクリプト1とします。 perlスクリプト1をphpスクリプトにすることは私には困難なため、phpスクリプト1のファイルに書き込む前に、perlスクリプト1を実行→返った変数をphpスクリプトで使用しファイルに書込み→終了画面の表示を行いたいです。 こんなことってできますか?

    • 締切済み
    • PHP
  • セッションが動かない

    セッションがちゃんと動かない。 PHPのセッションがちゃんと動きません。 他のプログラムを同じ環境で動かしたところうまく動きましたので、 コードのほうに問題があると思います。 以下のようなコードを書いています <?php require_once '../function.php'; require_once '../config.php'; if (!($_SESSION['date'])) { session_start(); } connect_db() ?> <div id="comu_confirm"> <?php $now = new DateTime(); $date = $now->format('Y/m/d H:i:s'); $title = $_POST['title']; $contents = $_POST['contents']; if ($_SESSION['date']) { $_SESSION = array(); session_destroy(); }elseif($_POST) { } //test $_SESSION['title'] = $title; $_SESSION['contents'] = $contents; $_SESSION['date'] = $date; まず最初はelseifのほうのプログラムを動かして、session変数に値を入れます。 その後、もう一度このファイルに飛んで、二回目はsession変数が入っているので ifのほうに入って、ifの中の処理をするという形にしたかったのですがif文のほうの処理に行きません。 ちなみに、二回目に見たときはURLの欄にセッションIDは表示されていませんでした。 テストとして <?php require_once '../function.php'; require_once '../config.php'; if (!($_SESSION['date'])) { session_start(); } connect_db() ?> <div id="comu_confirm"> <?php $now = new DateTime(); $date = $now->format('Y/m/d H:i:s'); $title = $_POST['title']; $contents = $_POST['contents']; //test $_SESSION['title'] = $title; $_SESSION['contents'] = $contents; $_SESSION['date'] = $date; if ($_SESSION['date']) { $_SESSION = array(); session_destroy(); }elseif($_POST) { } としてみたところ、if文の処理は動いていました。 なにが悪いのでしょうか? 不足した情報がありましたら開示したいと思いますので教えていただければと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 登録ボタン」クリック後、同ページに登録内容を反映させる方法

    php・smartyを使用しています。 (DBはoracleです。DB関連は問題ないと思います。) 「登録ボタン」クリック後、同ページに登録内容を反映させる方法を教えてください。 php・smartyテンプレートは以下のような構成にしています。 <php> ●記述A ---「登録ボタン」がクリックされたらDBに書込み ---if($_POST[xxx}==yyy){zzz;} ●記述B ---DB読込み ---⇒登録内容(ないし、登録されてない事実)を変数に設定 ---⇒smartyテンプレートにアサイン <smartyテンプレート> ●記述a ---登録フォーム ---method=post action={$smarty.server.PHP_SELF} ●記述b ---登録内容表示のためのソース 「登録ボタン」クリックでDB書込みはうまくいき 画面を更新するなどすれば、登録内容も表示されるのですが 「登録ボタン」クリックした直後には 登録内容が反映されません。 if($_POST[xxx}==yyy){ zzz; 記述B } 記述B のように、 記述Bを記述Aの中と外に2度書く形にするのは気持ちが悪いのです。 記述Bを function kijutuB(){ 変数1=・・・ 変数2=・・・ ・・・・・・ } とするには、変数の数だけglobal宣言をしなければならない(?)と思うので 結局効率が悪いです。 何かうまい方法はないものでしょうか?

    • 締切済み
    • PHP
  • 入力フォームで取得した値を、次のページだけでなく、その次のページにも渡したい

    PHPとHTMLで「入力画面→確認画面→登録完了画面(DBに登録する)」というプログラムを作成しています。 「入力画面→確認画面」の場合、入力画面で入力された値をsession_id()で確認画面に渡して表示させているのですが、「確認画面→登録完了画面」の場合、どのようにして値を渡せばよいのかわかりません。 なお、PHPのソースは以下の通りです。 ◆◆◆入力画面(page1.php)◆◆◆ <?php session_start(); $_SESSION["name"] = $_POST["name"]; header("Location: http://xxxxxxxx.page1.php?id=". session_id()); ?> ◆◆◆確認画面(page2.php)◆◆◆ session_start(); $name = $_SESSION["name"]; $obj_file_class->file_open("page2.html"); while(!feof($obj_file_class->file)) { $string = fgets($obj_file_class->file); $buffer = str_replace("AAAA", $name, $string); echo $buffer; } $obj_file_class->file_close($obj_file_class->file); ↑このあと、$_SESSION["name"]を確認画面(page3.php)にどのようにして渡せばいいのかわかりません(登録画面では、確認画面から引き継いだ値をDBに格納しようと考えています)。 PHP勉強中のため、解決策がなかなか思いつきません... 見苦しいソースで申し訳ありませんが、ご回答頂けると幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • php フォーム開発 IE9のみセッション消滅

    フォーム機能での、「入力画面」>「確認画面」>修正するボタン>「入力画面」 という流れの中の、ブラウザIE9でのセッションの消滅について質問させてください。 はまってしまってから3日になります。とうとう力尽きました。 IE9以外の下位バージョンやFireFoxでは問題なく動きます。 まず、環境から。 xmpp 1.7.3 PHP 5.3.1 MySQL 5.1.41 Smarty 3.0.7 ※同一ドメインで、フォームを複数運営させるため、 各フォームのそれぞれの項目(ラジオ,チェックボックス,テキストエリアなど)を管理画面から一意の値と共にDBに格納しています。 各フォームを表示する際は、その一意の値を呼び出して出力しています。 次に、処理の流れです。 (1)「入力画面」では、各入力項目をDBから取得し、少し整形してフォーム画面を出力しています。 Smartyを使っていますので、テンプレートへ アサインする形です。 ※この際、$_SESSION["f"]["no"]に、フォームを大別する一意の値を入れています。 閲覧者が入力した内容は、自身「入力画面.php」にポストして、 空の判別後、$_SESSION["f"]["別の一意の数値"]に保存します。 その直後、エラーチェック関数にそのセッションを通して、通過すれば「確認画面」へリダイレクトします。 /*下記のように*/ $url = "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"])."/確認画面.php"; header("Location: ".$url); exit; (2)「確認画面」では、 「入力画面」を経由したかどうかをphpの先頭でチェックします。 上述の$_SESSION["f"]["別の一意の数値"]を使って、同じエラーチェック関数で審査を行い、 通過すれば「確認画面」を表示するようにしています。 ※実際は、このチェックの前に$_SESSION["f"]["no"]を使ってDBから値を取得したりしています。 /*下記のように*/ $p[2]=フォーム取得関数($_SESSION["f"]["no"]);//DBからフォームに関する個別の値を取得。 if(count($p[2])!=0){ if(エラーチェック関数($_SESSION["f"])){ //エラー 入力画面経由ではないので 「入力画面」へ戻す $url = "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"])."/入力画面?no=".$_SESSION["f"]["no"]; header("Location: " . $url); exit; } }else{ //エラー フォーム関連パーツを取得できないので 「入力画面」へ戻す $url = "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"])."/入力画面?no=".$_SESSION["f"]["no"]; header("Location: " . $url); exit; } (3)問題なければ、 「確認画面」が表示されます。 (4)内容を修正するのであれば、 「修正するボタン」を押して >「入力画面」へと遷移させます。 /*下記のように*/ <テンプレート内> <form action="確認画面.php" method="post"> <input type="submit" name="modify" value="   修正する   "> </form> <確認画面.php内> if(isset($_POST["modify"]){ $url = "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"])."/入力画面?no=".$_SESSION["f"]["no"]; header("Location: ".$url); exit; } (5)確認画面からゲットでnoの値を受ける(入力画面にて) <入力画面.php内> if(isset($_GET["no"]) && is_numeric($_GET["no"])){ //$_GET["no"]つまり$_SESSION["f"]["no"]を使ってDBの値取得 } そしてセッションを維持したままなので、前回の入力項目を修正することができる。 これらの一連の流れは、IE9以外だと正しく動きます。 IE8も含めIE7 IE6 でも正常に動きます。 しかし、(4)の段階で、$_SESSION["f"]["no"]の値が消滅している為か、「入力画面」へと戻ることができません。 細かく言えば、(2)や(3)の段階(最初の「確認画面」へと遷移した時点)では、$_SESSION["f"]["no"]値は生きているようです。 (4)の段階の修正するボタンを押すと消滅しているようです。 <form action="確認画面.php" method="post"> <input type="submit" name="modify" value="   修正する   "> </form> これをポストして、自身「確認画面.php」に再度アクセスすると、 $_SESSION["f"]["no"]が消滅しているようです。 ただ、おかしなことに、確認画面.php内のどこかに print_r(変数); 入れてやると、一応_SESSION["f"]["no"]の値は維持されるようで、 元の入力画面へと遷移できてしまいます。 ※ただ、元の入力画面に戻ったときには、_SESSION["f"]["no"]は消えているようです・・・・。 ※print_rが発動したphpファイルだけが大丈夫なようです。 いろいろネットで検索をかけました。 ドメインにアンダーバーを使ってはダメだとか、session_idやname のことも調べましたが、 どうも該当している問題ではなさそうなんです。 セッションについて理解が深くない自分ですが、session_idが関連づいていない? 他のブラウザやバージョンでは問題なしだが、 IE9のみ特殊な仕様で、header("Location: " . $url);を使うとセッションを関連付けしてくれない? ということなのかなと推測していますが。 もう自分の力量ではどうにもならず・・・・。 そもそも上記のプログラムの流れで、 他のフォームも沢山作ってきましたが、いままでこのような問題には遭遇しませんでした。 正しく稼動しています。 「入力画面」から「確認画面」へは、セッションを使って安全に遷移したいので、 他の方法をとるのは厳しいかなと・・・。 どうぞお力をお貸しください。 何卒よろしくお願いします。

    • 締切済み
    • PHP
  • global変数の取り扱いについて

    石井と申します。 表題の件についてご質問させて頂きます。 現在、DBにセッション情報を保持させるように セッション・プログラムを作っているのですが、 以下のように、セッション関数を登録しているとして、 session_set_save_handler( 'my_sess_open', 'my_sess_close', 'my_sess_read', 'my_sess_write', 'my_sess_destroy', 'my_sess_gc' ); my_sess_read が呼ばれたときに、 DBに登録されていたセッション値をグローバル変数var1に保存し、 my_sess_writeが呼ばれたときに、 my_sess_writeの引数で指定されたセッション・データが、 var1と違うなら、DBを更新させるというふうにしたいと考えています。 それで、質問なのですが、 phpでいうグローバル変数var1は、他人からも参照が可能になっているのでしょうか? (値がスレッド間で共有されるのか?) 別の例えで言うなら、phpのグローバル変数は javaでいうstatic修飾子のような動きをするのでしょうか? 以上、宜しくお願い致します。

    • 締切済み
    • PHP
  • テンプレについて

    プログラム初心者です require_onceでほかのphpを読み込んで使いたいです hoge.php メインのファイル temp.php テンプレファイル(呼び出されるファイル) db.php DB接続だけのファイル(呼び出されるファイル) hoge.phpにtemp.phpをrequire_onceで読み込みます 質問1 hoge.phpにsession_start();がある場合、temp.phpにsession_start();がなくても、temp.phpの中でsession変数は使えますか? 質問2 hoge.phpにrequire_once('db.php');がある場合、temp.phpの中にrequire_once('db.php');を書かなくても、temp.phpの中でdbに接続できますか? 質問3 hoge.phpの中の変数を読み込んだtemp.phpの中で使えますか? また、その逆もできますか? よろしくお願いします

    • ベストアンサー
    • PHP
  • セッション使用時のフォームのデータ

    PHPでsession_start();とした後のフォームで、その後にフォームで入力したデータをPOSTで送って確認画面を表示したとします。 ここで、最初のsession_start();がなければ、ブラウザの戻るボタンで前のフォーム入力画面へと戻っても、入力したデータは保存されたままですが、session_start();とした後では、入力したデータが全てクリアされてしまうようです。 ちょっと修正したい時に、すべてクリアされてしまうとかなり不便なのですが、何かよい方法はないものでしょうか?セッション変数にPOSTするデータを保存する以外で方法はないものでしょうか?

    • ベストアンサー
    • PHP
  • session_unregisterとunsetの違い

    表題の件で質問させて下さい。 ttp://php.s3.to/man/function.session-unregister.html を参考にしているのですが、 「session_unregister() は現在のセッションから name という名前のグローバル変数の登録を 削除します。」 と 「この関数は、nameに対応するグローバル変数 の登録を削除しません。」 で矛盾しているように思えます。 意識して使い分ける必要はありますでしょうか。

    • 締切済み
    • PHP
  • php クラスについて

    普通にデータベースに登録はなんとか出来たので、クラスを作って登録をしてみようと色々なサイトを見て疑問点があり質問をさせて頂きました。 public function userContent($id) { } ここの$idというとこがわかりません。 if文などでは条件式を書くところなのでしょうがクラスでは何を書くべきなのでしょうか。 サイトによっては public function userContent($id) みたいに書いてないときもあります。 クラスを呼び出すページで $user = DB::connect()->userContent($_SESSION['id']); こうした場合()の中には受け取る変数を書いていくという認識でよろしいのでしょうか? 例えば、 insertの場合id,title,textのカラムがあれば クラスを呼び出すページ $user = DB::connect()->userContent($id, $title, $text); クラスを書くページ public function userContent($id, $title, $text) でinsertの内容を書いていく。 という認識で間違いないでしょうか? 初歩的すぎて中々記事が見つからずご質問させて頂きました。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • モテる男性に聞く:彼女いるかどうか
  • Lineで積極的にアプローチしたが断られた
  • 女性の助言はあてにならない
回答を見る