0

したがって、ユーザーが送信を押すと、フォームはそれらを処理ファイルにスローし、それらのフィールド値のいずれかが検証されない場合、そのプロセスフォームはユーザーを元のページに送り返すフォームを持っています。何が悪いのかを伝えるメッセージを追加すると便利だと思ったので.....

たとえば、フォーム ページ (contact.php) は次のように構成されます (以下)。

<?php 
$errormssg = stripslashes(str_replace("'","",$_GET['errormssg']));
if($errormssg){
    echo $errormssg;    
} 
?>
<html>
<form fields here >
</html>

PHP プロセス フォームは多かれ少なかれ次のように構成されます (以下)。

<?php 

<form validation code goes here and if it fails, then throws them back to form page exactly 
like this (below)

header("Location:contact.php?errormssg='You seem to have forgotten one of the fields'");



?>

私が得ている問題は、連絡先ページを最初にロードしたときにエラーが発生することです。これは、連絡先ページが最初にロードされたときに$_GET['errormssg']存在しないためだと思います。

私は次のようなことを試しました

if($_GET['errormssg']){
    echo $errormssg;
}

それでもエラーが発生します。これについて間違った方法で行っていますか?

私が本質的にやろうとしているのは、連絡先ページが読み込まれたときにエラーメッセージがメッセージを吐き出す唯一の方法は、ユーザーが処理フォームから送り返された場合です。したがって、メッセージが存在する場合は指定された領域にエコーし、存在しない場合は何も表示しません。

これどうやってするの??ありがとうございます。

4

6 に答える 6

5

値が定義されているかどうかを最初に確認する必要があります。

if (isset($_GET) && isset($_GET['errormssg'])) {
    echo $_GET['errormssg'];
}

編集: MrCode $_GET によると、常に定義されるようになりました。私が PHP を学んだのはその時ではなく、それ以来、習慣を失うことはありませんでした。混乱して申し訳ありません。if の最初の部分は必要ありません

于 2012-12-05T16:53:13.160 に答える
2

if(isset($_GET['errormsg'])){

これはうまくいくはずです:)

于 2012-12-05T16:53:40.027 に答える
2

次のようなものを試してください:

if(isset($_GET['errormsg']) {
   echo $_GET['errormsg'];
}
于 2012-12-05T16:54:00.530 に答える
2

試す:

if(isset($_GET['errormssg']))

于 2012-12-05T16:52:44.883 に答える
1

他の回答が言っているように、それを使用する前に、変数が設定されているかどうかを確認する必要があります。Undefined index設定されていない配列要素にアクセスしようとすると、PHPは自動的に通知を発行します。

エラーメッセージシステムには、より良い解決策があります。欠点は、ユーザーがクエリ文字列を使用してページ上の直接コンテンツを基本的に変更できることです。最初の問題は、XSSに対して脆弱であるため、メッセージを通過させるhtmlspecialchars()か、それhtmlentities()を防ぐ必要があることです。XSSがなくても、ユーザーはページにコンテンツを設定できますが、これは望ましくありません。

最も簡単な解決策は、メッセージ全体ではなく、URLでエラーコードを使用することです。PHPでは、エラーコードをメッセージにマッピングできます。これの利点は、ユーザーがメッセージの内容を改ざんすることはできませんが、コードを変更して別のメッセージを生成することはできます。

さらに良い解決策は、セッションに基づいたメッセージキューシステムを使用することです。これは、メッセージの配列をセッション変数として格納することで機能します。メッセージを表示する必要がある場合は、配列に追加するだけです。フロントエンドでは、セッション配列内のメッセージをループして出力してから、(重要なことに)配列をクリアできます。

これは、ユーザーから完全に分離されており、連絡フォームだけでなく、システム全体またはサイト全体で機能するため、より優れています。以下は簡単な例です。

// add a message if validation fails
MesssageManager::addMessage('You seem to have forgotten one of the fields');

フロントエンドで、順序付けされていないリストにメッセージを出力し、それらをクリアします。

<html>

<?php echo MessageManager::getHTML(); MessageManager::clear(); ?>

</html>

クラスは次のようになります

session_start();
class MessageManager
{
    public static function addMessage($message)
    {
        if(isset($_SESSION['messages']))
        {
            $_SESSION['messages'][] = $message;
        }
        else
        {
            $_SESSION['messages'] = array($message);
        }
    }

    public static function clear()
    {
        $_SESSION['messages'] = array();
    }

    public static function getHTML()
    {
        $h  = '<ul>';
        foreach($_SESSION['messages'] as $message)
        {
            $h .= '<li>' . htmlentities($message) . '<li>';
        }
        $h .= '</ul>';

        return $h;
    }
}
于 2012-12-05T17:00:48.147 に答える
1

まず、元の質問に対処したいと思います。明らかな答えはすでにあるのでisset()..指摘したいのは、1)$_GET事前の存在を確認する必要はありません。それは無駄なコードです。したがって、次のような例:

if(isset($_GET['errormsg']) {
  echo $_GET['errormsg'];
} 

は確かに正しい使い方です。最初に初期化せずに使用すると、いつでもPHP の通知と警告が表示されることも指摘したいと思います。$_GET['foo']たとえば、これは通知生成します: (注: 以下の例では、「errormsgsg」を「errormsg」に変更しました。二重の「s」が削除されていることに注意してください)

$errormsg = stripslashes(str_replace("'","",$_GET['errormsg']));
if(isset($errormsg)) {
  echo $errmsg;
}

$errmsg実際、コードが変更されない限り、常に設定されるため、そのコードは非常に冗長です。これを適切に使用するには、次のように言います。

if(isset($_GET['errormsg'])) { 
   $errormsg = stripslashes(str_replace("'","",$_GET['errormsg']));
   echo $errormsg;
}

の使い方も紹介したいと思い!empty()ます。 次の例で実証できるものと!empty()は異なります。isset()

$x = '';
if(isset($x)) { echo 'This will fire, since $x *is* set, just empty'; }
if(!empty($x)) { echo 'This will not fire, even though $x is set, it is empty'; }

あなたの例では、それはおそらく目立たない違いを生むだけです。

header()次に、元の質問とは直接関係ありませんが、と URLの使用が非常に間違っていることを指摘したいと思います。

header("Location:contact.php?errormssg='You seem to have forgotten one of the fields'");

これはすべて間違っています。代わりに、次のようなものを使用する必要があります。

header("場所: contact.php?errormsg=" . urlencode("フィールドの 1 つを忘れたようです"));

Location: と URL の間のスペースに注意してください。技術的には、これはまだ正しくありませんが、機能します。これを行う 100% 適切な方法 (RFC によると) は、次のようにヘッダーに完全なURL を含めることです。

header("Location: http://www.yoursite.com/contact.php?errormsg=" . 
  urlencode("You seem to have forgotten one of the fields"));

stripslashes()データを適切に URL エスケープ/エンコードする場合は必要ありません。

于 2012-12-05T17:04:53.237 に答える