web-dev-qa-db-ja.com

PHP header()はPOST変数でリダイレクトします

私はPHPで作業しており、フォームが投稿するアクションページを作成しています。ページはエラーをチェックし、すべてが正常であれば、データが投稿されたページにエラーをリダイレクトします。そうでない場合は、エラーとPOST変数を含むページにリダイレクトする必要があります。これがどのように機能するかの要点です。

HTMLは次のようになります...

<form name="example" action="action.php" method="POST">
  <input type="text" name="one">
  <input type="text" name="two">
  <input type="text" name="three">
  <input type="submit" value="Submit!">
</form>

action.phpは次のようになります...

if(error_check($_POST['one']) == true){
    header('Location: form.php');
    // Here is where I need the data to POST back to the form page.
} else {
    // function to insert data into database
    header('Location: posted.php');
}

エラーの場合、POST最初のページに戻る必要があります。入力が大きすぎるため、GETを使用できません。可能であれば、SESSIONを使用したくありません。これは可能ですか?

47
Yoshiyahu

セッションを使用したくない場合、できることは同じページへのPOSTだけです。とにかく、どのIMOが最適なソリューションです。

// form.php

<?php

    if (!empty($_POST['submit'])) {
        // validate

        if ($allGood) {
            // put data into database or whatever needs to be done

            header('Location: nextpage.php');
            exit;
        }
    }

?>

<form action="form.php">
    <input name="foo" value="<?php if (!empty($_POST['foo'])) echo htmlentities($_POST['foo']); ?>">
    ...
</form>

これはよりエレガントにすることができますが、アイデアを得る...

19
deceze
// from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}
26
bowsersenior

POSTを別の場所にリダイレクトすることはできません。要求をPOSTすると、ブラウザはサーバーから応答を取得し、POSTが実行されます。それ以降はすべて新しいリクエストです。そこに場所ヘッダーを指定すると、ブラウザーは常にGETメソッドを使用して次のページを取得します。

Ajaxを使用して、バックグラウンドでフォームを送信できます。そうすれば、フォームの値はそのままになります。サーバーが受け入れた場合でも、他のページにリダイレクトできます。サーバーが受け入れない場合は、エラーメッセージを表示し、ユーザーに入力を修正して再度送信させることができます。

6
Jan Thomä

ものにsmartyテンプレートを使用し、POST配列をsmarty配列として設定し、テンプレートを開きます。テンプレートでは、配列をエコーアウトするだけなので、合格した場合:

if(correct){
    header("Location: passed.php");
} else {
    $smarty->assign("variables", $_POST);
    $smarty->display("register_error.php");
    exit;
}

私はまだこれを試していませんが、解決策として試してみるつもりです。ただし、もちろんこの方法は、smartyを使用していることを前提としています。

そうでない場合は、エラーページでフォームを再作成し、情報をフォームにエコーするか、取得および取得で重要でないデータを送り返すことができます

例.

register.php?name=mr_jones&address==......
echo $_GET[name];
0
Derrick

フォームをPOSTで送信する前に、フォームのデータを検証することは有益です。 JavaScript関数を作成してフォームのエラーを確認し、フォームを送信する必要があります。これにより、データが繰り返し送信されることを防ぎ、ブラウザの速度を低下させ、サーバー上の転送ボリュームを使用する可能性があります。

編集:

セキュリティが懸念される場合は、AJAXリクエストを実行してデータを検証するのが最善の方法です。 AJAXリクエストからの応答により、フォームを送信するかどうかが決まります。

0
Evan Mulawski