0

同じページ検証を行うが外部処理を行うこの連絡先/見積もりフォームをまとめようとしています。フォーム アクションに入る変数を設定しました。フォームが検証されると、変数/URL が同じページから処理ページに変更されます。ただし、すべての必須フィールドが入力された後、フォームを処理するために送信ボタンを 2 回クリックする必要があります。送信ボタンを押すと、最終的にメールが送信され、サンキュー ページが読み込まれます。ここで投稿を検索し、複数のことを試しましたが、解決策が見つかりませんでした。私は間違いなくphpの専門家ではなく、まだ初心者なので、これを達成するための最良の方法ではないかもしれませんが、これを完了する方法についてのアイデアをいただければ幸いです. ここに私が持っているものがあります:

<?php

....

if (empty($Name) && empty($Company) && empty($Address1) && empty($City) && empty($State) && empty($Phone))
{
    echo '<p class="tan">The fields marked with an * are required.</p>';
$Process = 'samepageurl'; 

}

/*else if (empty($Name) || is_numeric($Name))
{
echo '<p class="tan"><b>Please enter your name.</b></p>';
}*/

else if (empty($Company) || is_numeric($Company))
{
echo '<p class="tan"><b>Please enter your company name.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($Address1) || is_numeric($Address1))
{
echo '<p class="tan"><b>Please enter your address.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($City) || is_numeric($City))
{
echo '<p class="tan"><b>Please enter your city.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($State) || is_numeric($State))
{
echo '<p class="tan"><b>Please enter your state.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($Phone) || ctype_alpha($Phone))
{
echo '<p class="tan"><b>Please enter your phone number.</b></p>';
$Process = 'samepageurl'; 

}

else if (strlen($Phone) < 10 || strlen($Phone) > 12 || ctype_alpha($Phone) || ctype_space($Phone))
{
echo '<p class="tan"><b>Please enter a phone number with an area code.</b></p>';
$Process = 'samepageurl'; 

}

else if (isset($Name) && isset($Company) && isset($Address1) && isset($City) && isset($State) && isset($Phone))
{
$Process = 'processingurl';
}
?> 

<form action="<?php echo $Process; ?>" method="post" class="print"  >
<p><input type="hidden" name="recipient" value="responses@url.com"/> 
<input type="hidden" name="subject" value="Web Site Response"/>
<input type="hidden" name="redirect" value="thankyou.html"/></p>

... form fields ...

</form>    

前もって感謝します!

4

1 に答える 1

0

最初に欠落している変数をチェックし、次に変数を抽出して検証し、それらに基づいてコンテンツを提供します。

<?php
  function verifyPostContains(&$req) {
    global $_POST;
    $missing = array();
    foreach($req as $var => $_) {
      if(!isset($_POST[$var])) {
        $missing[] = $var;
      }
    }
    return $missing;
  }

  $requirements = array('name'=>'','city'=>'','state'=>'',...);
  $missing = verifyPostContains($requirements);

  if(count($missing)>0) {
    $content = formErrorReport($missing);
    sendHeaders();
    echo $content;
    exit();
  }

  // extract, making sure to sanitize
  $name = sanitize($_POST["name"]);
  ...

  $errorHtml = array();
  // validate by reference. Effectively call testName($name).
  if(failsValidation($name, "testName")) {
    $errorHtml [] = generateError(NAME_ERROR, $name);
  } else { $requirements["name"] = $name; }
  if(failsValidation($city, "testCity")) {
    $errorHtml [] = generateError(CITY_ERROR, $city);
  } else { $requirements["city"] = $name; }
  ...

  if(count($errorHTML)>0) {
    generateErrorPage($requirements, $missing, $errorHTML);
  } else { processForm($requirements); }
?>

このコードは、実行する必要のあるさまざまな処理を実行する関数があり、エラー HTML を生成するための文字列定数がいくつかあることを前提としています。

初心者の方は、サーバーで PHP を使用し、クライアントで JavaScript を使用してフォーム処理を行う方法を説明するチュートリアルをグーグルで検索することをお勧めします。コードのように、データのテスト中にエラーをエコーするコードを提供するチュートリアルを見つけた場合は、先に進んでください。良いチュートリアルではありません。1 つのエラーを検出した後に停止するものを見つけた場合は、同様に移動します。値が JavaScript で正しいことを確認するように指示し、「クライアントで既にこれを検証したので、PHP で値を直接使用します」というメッセージを見つけた場合も、先に進んでください。以下を説明するチュートリアルを探します。

  • JavaScript を使用して、すべてのフォーム フィールドにデータが存在することを確認します。そのため、すべてのフィールドにデータが存在するまで送信ボタンは無効になります。
  • PHP でデータが基準に一致することを確認して、ページを使用せずにサーバーに POST するだけの人が、実行できないはずのあらゆる種類の楽しいことを注入して逃げることがないようにします。
  • エラーがある場合はすべてのエラーが説明されたページを生成し、フォームに間違ったデータが再入力されますが、間違っていることが強調表示されます
  • エラーがなければ、投稿リクエストを処理します。

(チュートリアルで、POST 呼び出しが受け入れられたか拒否されたかを示すヘッダーを除いて、ページ コンテンツを実際に応答として生成するために POST 要求が必要ではないことが説明されている場合はボーナス ポイントです。)

于 2013-03-21T15:21:51.797 に答える