4

したがって、次の 2 つのページがあります:pageOne.phppageTwo.php。フォームは次のpageOne.phpとおりです。

<form method="post" action="pageTwo.php"> .... </form>

そして、すべてのデータ収集、検証、挿入、およびメールの送信をpageTwo.php行います (すべてを 2 つの別々のページで行っているのは、ページの更新時にデータが再送信されるのを避けるためです...これが私にとって最も簡単な方法でした)問題)。これまでのところ、すべてが完璧に機能しています。

ここで、フォームの送信後にアラート ボックスを使用して成功/失敗メッセージを表示したいと考えています。たとえば、このソリューションを で試したときポップアップpageTwo.phpボックスが表示されません。これheaderは、そのページの上にこれがあるためだと思います

<?php header("Location: http://TestPages.com/pageOne.php");  ?>

<?php
if( $_POST ) {
     //collect the data
     //insert the data into DB
     //send out the mails IFF the data insertion works

     echo "<script type='text/javascript'>alert('It worked!')</script>";
}else
     echo "<script type='text/javascript'>alert('Did NOT work')</script>";
?>

でこの2 番目の解決策を試したところpageOne.php、ページを更新するたびに警告ボックスがポップアップし、データがデータベースに挿入されてメールが送信されたにもかかわらず、エラー メッセージが表示されました。pageOne.php:

<html>
<body>
   <?php
   if( $GLOBALS["posted"])  //if($posted) 
      echo "<script type='text/javascript'>alert('It worked!')</script>";
   else
      echo "<script type='text/javascript'>alert('Did NOT work')</script>";
   ?>
   <form method="post" action="pageTwo.php"> .... </form>
</body>

とでpageTwo.php

<?php header("Location: http://TestPages.com/pageOne.php");  ?>

<?php
$posted = false;
if( $_POST ) {
     $posted = true;
     //collect the data
     //insert the data into DB
     //send out the mails IFF the data insertion works
}    ?>

なぜこの単純なことが機能しないのですか :( ? それを修正する簡単な方法はありますか? ありがとう!!

アップデート

だから私はdrrcknlsnの提案に従っていくつかの変更を加えました.これは私がこれまでに持っているものです.... pageOne.php:

 <?php
   session_start();

   if (isset($_SESSION['posted']) && $_SESSION['posted']) {
      unset($_SESSION['posted']);
      // the form was posted - do something here
  echo "<script type='text/javascript'>alert('It worked!')</script>";
   } else
      echo "<script type='text/javascript'>alert('Did NOT work')</script>";
 ?>
<html> <body>
   <form method="post" action="pageTwo.php"> .... </form>
</body> </html>

pageTwo.php:

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
     $_SESSION['posted'] = true;

     //collect the data
     //insert the data into DB
     //send out the mails IFF the data insertion works

     header('Location: http://TestPages.com/pageOne.php');
     exit;
} ?>

これらの変更により、ページのリダイレクトと成功メッセージが機能するようになりましたが、ページを開く/更新するたびに失敗メッセージが表示されます (セッションキーがまだ設定されていないためです)...どうすれば回避できますか? 再度、感謝します!!

4

2 に答える 2

0

まず、いくつかのポイント:

  1. 一番下の例でやろうとしているように、変数 (グローバルであっても) はリクエスト間で共有されません。両方のページでアクセスできるよう$postedにするには、何らかの方法で永続化する必要があります。通常、これにはセッション変数 (例: $_SESSION['posted'] = true;) の設定が含まれますが、Cookie、データベース、ファイルシステム、キャッシュなどに永続化することもできます。

  2. if ($_SERVER['REQUEST_METHOD'] === 'POST')の代わりに次のようなものを使用しif ($_POST)ます。 ほとんどの場合、後者はおそらく安全ですが、前者を使用する習慣を身につけることをお勧めします。これは$_POST、有効なPOSTリクエストで空になる可能性があるエッジ ケースが存在し、追跡するのが難しいバグである可能性があるためです。

上記のアドバイスを使用して問題を解決するための 1 つの潜在的なパターン:

pageOne.php:

<?php
session_start();

if (isset($_SESSION['posted']) && $_SESSION['posted']) {
    unset($_SESSION['posted']);

    // the form was posted - do something here
}
?>
...
<form>...</form>

pageTwo.php:

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $_SESSION['posted'] = true;

    // do form processing stuff here

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

// show an error page here (users shouldn't ever see it, unless they're snooping around)
于 2013-06-18T20:28:06.223 に答える
-1

スコープの問題のようです。使用する:

global $posted = true;

http://php.net/manual/en/language.variables.scope.php

于 2013-06-18T19:23:37.667 に答える