2017-06-16 5 views
2

私は電子メールアドレスを検証しようとしているフォームを持っています。電子メールアドレスが正しくない場合は、「有効な電子メールアドレスを入力してください」という値が必要です。フォームの "email"入力ボックスに返されます。何が間違っているのですか?検証は行われていません。私は私の電子メールでフォーム情報を受け取り、一度投稿したユーザーは「ありがとう」ページに送られますが、検証は行われません。私は "電子メール"入力に何かを入れることができ、フォームが提出されます。PHPを使用した電子メールの検証

<form action="../php/contact.php" method="post"> 
    <p>First Name:</p> 
    <input class="box_style" type="text" name="first_name" required maxlength="20" /> 

    <p>Last Name:</p> 
    <input class="box_style" type="text" name="last_name" required maxlength="25" /> 

    <p>Email:</p> 
    <input class="box_style" type="text" name="email" required maxlength="50" /> 

    <p>Contact Number (optional):</p> 
    <input class="box_style" type="text" name="contact_number" maxlength="12" /> 

    <p>How did you find us?</p> 
    <select class="box_style" name="how" required> 
    <option value="choose">Select...</option> 
    <option value="referal">Referal</option> 
    <option value="website">Website</option> 
    <option value="search">Search Engine</option> 
    <option value="card">Business Card</option> 
</select> 

<p>Enquiries:</p> 
    <textarea class="box_style" name="inquiries" cols="30" rows="10"></textarea> 

    <input class="box_style" type="submit" name="submit" value="Submit"/> 
</form> 

と、これはPHP

<?php 

function test_input($data) { 
$data = trim($data); 
$data = stripslashes($data); 
$data = htmlspecialchars($data); 
return $data; 
} 

// define variables and set to empty values 
$fName = $lName = $email = $cNum = $how = $enquiries = ""; 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
$fName = test_input($_POST["first_name"]); 
$lName = test_input($_POST["last_name"]); 
$cNum = test_input($_POST["contact_number"]); 
$how = test_input($_POST["how"]); 
$enquiries = test_input($_POST["enquiries"]); 

$email = test_input($_POST["email"]); 
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    print "<p>Please type a valid email address.</p>"; 

header("Location: www.mysite/thankyou.com"); 
}}; 

$email_from = '[email protected]'; 
$email_subject = "New Inquiry"; 
$email_body = "You have received a new message from" ." ". "$fName" ." ". "$lName" ."\n". 
"$inquiries"."\n". 
"Referal Type:" ." ". "$how" ."\n". 
"Contact Number:" ." ". "$cNum" ."\n"; 

$to = "[email protected]"; 
$headers = "From: $email_from \r\n"; 
$headers .= "Reply-To: $email \r\n"; 
mail($to,$email_subject,$email_body,$headers); 


?> 

では、あなたが

+0

妥当性確認のように見えますが、正しいかどうかは問題ありません。 – Ice76

+1

'print"

有効なメールアドレスを入力してください。

"; header( "Location:www.mysite/thankyou.com"); 'レスポンスを出力してすぐに別のページをロードします。したがって、応答は失われます。 – Martin

+0

はい@マーティンは正しいです。シンプルなフォーム処理スクリプトでこれを行う最善の方法は、すべてのロジックを1つのスクリプトに移動して、それ自身にポストすることです。ロジックをパーツに分割します。パーツには、要求が上部のポストであるかどうかをチェックし、そこにエラーを設定します。それから、すべてがOK(電子メールを送信する)か、そうでないセクションに落ち、通常は値が入力されてフォームが出力され、エラーがディスプレイに追加されます。 – gview

答えて

0

ここにフォームのaction属性を持つことによって、エラーメッセージを表示する方法を示しOPのコードの簡易版ですありがとうございましたフォームを表示するのと同じURL。コードは、ユーザーのためにいくつかの素晴らしいタッチを例示:

<?php 

    include("php4myform.php"); 
?> 

<html> 
<head> 
    <title>Email Validate</title> 
</head> 

<body> 
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST"> 
    <label for="email">Email: </label> 
    <input id="email" name="email" required maxlength="50" value="<?php echo $e_mess; ?>"> 
    <input type="submit" name="submit" value="Submit"> 
    <input type="reset" id="clear" value="clear"> 
</form> 

<script src="myJS4forms.js"></script> 
</body> 
</html> 


php4myform.php:

<?php 

$e_mess = ""; 

if (isset($_POST['submit']) && $_POST != null) { 
    $tainted_email = trim($_POST["email"]); 
    $sanitized_email = filter_var($tainted_email, FILTER_SANITIZE_EMAIL); 

    if(!filter_var($sanitized_email, FILTER_VALIDATE_EMAIL)) { 
     $e_mess = "Please type a valid email address."; 
    } 
    else 
    { 
     // Data is good to go. 

    } 
} 

myJS4forms.js:

var d = document; 
d.g = d.getElementById; 

var email = d.g("email"); 
var reset = d.g("clear"); 


function selFoc(obj){ 
    obj.focus(); 
    obj.select(); 
} 



window.onload = function() { 
    selFoc(email); 
}; 


reset.addEventListener("click",function(e) { 
     e.preventDefault(); 
     email.value=null; 
     selFoc(email); 
}); 

いくつかの注意事項:

$ _SERVER ["REQUEST_METHOD"]によるテストの欠点は、ユーザーmi空のフォームを送信してください。したがって、この例のPHPコードは、フォームが送信されたかどうか、およびPOSTにデータが含まれているかどうかを確認するためにテストします。

filter_varとパラメータFILTER_EMAIL_SANITIZEでhtmlspecialchars()を使用することをお勧めします。このdiscussionhereも参照してください。このコードでは、代わりに$_SERVER['PHP_SELF'] - basis:this articleを保護するためにhtmlspecialchars()を使用しています。

マジッククオートが推奨されておらず、PHP5.4以降になったので、stripslashes()を削除しました。オンラインManualを参照してください。 (addslashes()を使用してデータをエスケープすることはお勧めできません - mysqli_real_escape_string()を使用することをお勧めします)また、FILTER_SANITIZE_EMAILを指定したfilter_varはスラッシュを削除します(Manual参照)。

+1

FILTER_SANITIZE_EMAILを使用して確認する前にあなたのメールをサニタイズすることで、回答を改善することができます:) –

+1

ありがとうございます;私はその提案を感謝します。 – slevy1

+0

ありがとうございました。私はすべての情報を調べて、一緒に作れるかどうか確認しています。 – user2058201

-1

"header()"関数を使用してユーザーをリダイレクトする場合は、スクリプトの実行を停止する必要があります。したがって、正しい方法は次のようなものになります。

$email = test_input($_POST["email"]); 
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    print "<p>Please type a valid email address.</p>"; 
    header("Location: www.mysite/thankyou.com"); 
    exit(); 
} 

スクリプトを終了しないと、ファイルの残りの部分を実行し続けます。

第2に、ユーザーに何かを印刷してすぐに彼を他の場所にリダイレクトすると、メッセージは表示されません。リダイレクトを行い、そこにメッセージを表示したい場合は、おそらくセッション変数にメッセージを格納し、それを「ランディングページ」に表示する必要があります。

関連する問題