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

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

ただいまの
回答率

88.09%

PHPで別ファイルに値を渡す方法につきまして

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 10K+

score 36

初歩的なご質問で申し訳ありませんが、ご教授お願いいたします。

前提・実現したいこと

フォームなどを利用して、別ファイルにて処理をし、エラーがあった場合にフォームページに戻す場合に
エラーの内容を渡す処理を考えております。
その際に僕の知識では、セッションの利用、GETでのURLでの受け渡しくらいしか調べてもわからなかったです。

実際にやりたいことは、POSTのような形で受け渡しをしたいのですが、可能なのでしょうか?
可能な場合、この関数を使うや、参考URLなどをご提供いただけましたら幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/03/10 00:44

    「可能です」という回答で十分なのでしょうか?

    キャンセル

  • nerd

    2017/03/10 09:15

    ご指摘ありがとうございます。具体的な情報等のご提供をお願いしたかったです。

    キャンセル

回答 2

+1

簡単なサンプルだけ(こまかい調整はしていません)
typeミスだけなおしてあります

  • send.php
<?PHP
session_start();
$err["a"]=isset($_SESSION["error"]["a"])?$_SESSION["error"]["a"]:"";
$err["b"]=isset($_SESSION["error"]["b"])?$_SESSION["error"]["b"]:"";
$err["c"]=isset($_SESSION["error"]["c"])?$_SESSION["error"]["c"]:"";

$data["a"]=isset($_SESSION["data"]["a"])?$_SESSION["data"]["a"]:"";
$data["b"]=isset($_SESSION["data"]["b"])?$_SESSION["data"]["b"]:"";
$data["c"]=isset($_SESSION["data"]["c"])?$_SESSION["data"]["c"]:"";

print <<<eof
<form method="post" action="y.php">
※答えはすべて「1」とする<br>
<input type="text" name="a" value="{$data["a"]}">{$err["a"]}<br>
<input type="text" name="b" value="{$data["b"]}">{$err["b"]}<br>
<input type="text" name="c" value="{$data["c"]}">{$err["c"]}<br>
<input type="submit" value="go">
</form>
eof;
?>
  • recv.php
<?PHP
session_start();
$a=filter_input(INPUT_POST,'a');
$b=filter_input(INPUT_POST,'b');
$c=filter_input(INPUT_POST,'c');

$_SESSION["data"]=["a"=>$a,"b"=>$b,"c"=>$c];
$_SESSION["error"]=[];
if($a!=="1") $_SESSION["error"]["a"]="bad data";
if($b!=="1") $_SESSION["error"]["b"]="bad data";
if($c!=="1") $_SESSION["error"]["c"]="bad data";

if(count($_SESSION["error"])>0){
  header("Location:{$_SERVER["HTTP_REFERER"]}");
  exit;
}

unset($_SESSION["data"]);
print <<<eof
ok!<br>
<a href="{$_SERVER["HTTP_REFERER"]}">戻る</a>
eof;
?>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/10 10:16

    yambejp様

    ご回答、サンプルのご提供誠に有難うございます。

    説明の仕方が悪くて申し訳ございません。
    セッションや、GETを使用しなくて、POSTのような形で値を保有しつつ戻れるのかを知りたかった次第です。

    どの説明ページ、書籍でも、HTMLもしくはPHPでPOSTし、別ファイルに移動しての処理途中のエラーに関してはセッション利用もしくは、URLにGET用コードを用い[header]で飛ばすという感じでしたので、ご質問に至った感じでした。

    コードはすごく勉強になる書き方で参考にさせていただきます。

    キャンセル

  • 2017/03/10 10:32

    POSTでRedirect出来るのかと言う話であれば、「出来ない」と考えてください。
    「post redirect」とかでググればたくさん情報出てきます。
    その前提で、回避策としてsessionを使ったり、別途私が回答しているような工夫をしているのが現状ですね。

    キャンセル

checkベストアンサー

0

私がやる場合は「別ファイル」とはせずに「別Method」にすることで対応しますね。
そのフォーム処理を行う「FormControllerクラス」を作成し、その中で「input(入力)」「complete(完了)」のMethodを作成する。(必要に応じて「confirm(確認)」)

inputの画面からcompleteに遷移する際、入力エラーで戻す場合はcompleteメソッド内からinputメソッドを呼べばよい形になります。

class FormController {

    protected $postData;  //Postされたデータを持つプロパティ
    protected $errorMessages = array();

    //コンストラクタ
    public function FormController() {
        //POSTされたデータがあったら、プロパティに格納
        $postData = isset($_POST) ? $_POST : null;
    }

    //入力画面用Method
    public function input() {
        //入力画面を表示
        include VIEW_PATH.'input.view.php';
    }

    //完了画面用Method
    public function complete() {
        try {
            //Postデータのバリデート
            $this->validate();
            //Postされたデータの処理(DBに登録したり、メールを送ったり)
            $this->transactData();
            //完了画面の表示
            include VIEW_PATH.'complete.view.php';

        //入力エラーがあった場合、エラーを表示
        } catch(Exception $e) {
            $errorMessage = $e->getMessage();
            include VIEW_PATH.'input.view.php';
        }
    }

    //入力データのバリデート
    protected function validate() {
        if(is_null($this->postData) || !is_array($this->postData) {
            throw new Exception('入力して下さい');
        }
        foreach($this->postData as $key => $val) {
            switch($key) {
                case 'name' : 
                    if(strlen($val) > 10) {
                        throw new Exception('名前は10文字以内で入力して下さい');
                    }
            }
        }
        return true;
    }
}

サンプルコードなので色々適当ですが、validate処理のところあたりは、全部チェックしてからエラーを返したりするようにすれば使えるのではないかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/10 10:56

    kunai様

    ご回答、サンプルコードの提供誠に有難うございます。

    Methodの利用で処理だけを別で作成し呼び込めば、同一ページでの展開となるとの認識になるのですね。
    オブジェクト指向?の部分がいまいちまだ理解できていなかったのと、メリットに関してもいまいち理解できていなかった部分がわかった気がしました。

    素人の疑問にお付き合いいただき誠に有難うございました。
    お二方には本当に感謝させていただきます。

    キャンセル

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る