2016-05-06 4 views
1

PHP経由でフォームデータを電子メールで送信する基本的な連絡フォームを設定しました。これはうまく動作しますが、データが入力されていないときにフォームが送信されるのを防ぐために、検証スクリプトをコードにインテグレートするのに問題があります。Javascript/PHPを使用したHTMLフォーム検証

私のコードは、これまでのところです:

$(document).ready(function() { 
$("#form1").validate({ 
    submitHandler: function() { 
     //submit the form 
$.post("<?php echo $_SERVER[PHP_SELF]; ?>", //post 
      $("#form1").serialize(), 
      function(data){ 
       //if message is sent 
       if (data == 'Sent') { 
       $("#message").fadeIn(); //show confirmation message 

      } 
      // 
     }); 
     return false; //don't let the page refresh on submit. 
    } 
}); //validate the form 
}); 

HTMLフォーム

<div id="contact-form"> 
<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1"> 

<input type="text" id="name" name="name"/> 
<input type="text" id="email" name="email"/> 
<input name="submit" type="submit" title="Submit" class="submit_go" value="Submit"/> 

</form> 
<div id="message">Thank you for your message</div> 
</div> 

I:フォームを投稿する

<?php 
//validate 
if(isset($_POST['submit'])) 
{ 
$to="[email protected]"; 
$name=$_REQUEST['name']; 
$email=$_REQUEST['email']; 
$subject="Contact Us"; 
$body="Name: $name \n\n Email Address: $email \n\n"; 
$sent=mail($to, $subject, $body); 
echo 'Sent'; die; 
} 
// 
?> 

JS:

PHPはデータをメールで送信します以下の値を統合しようとしましたidationスクリプトですが、フォームが送信されるのを妨げるものではありませんか?

検証スクリプト

function leftValue(e, t, n) { 
$(this).text(t.parent()[0].style.left) 
} 
$(document).ready(function() { 
required = ["name", "email"]; 
email = $("#email"); 
errornotice = $("#error"); 
emptyerror = "Required Field"; 
emailerror = "Required Field"; 
$("#form1").submit(function() { 
    for (i = 0; i < required.length; i++) { 
     var e = $("#" + required[i]); 
     if (e.val() == "" || e.val() == emptyerror) { 
      e.addClass("form-error"); 
      e.val(emptyerror); 
      errornotice.fadeIn(750) 
     } else { 
      e.removeClass("form-error") 
     } 
    } 
    if (!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA- Z0-9]{2,4})+$/.test(email.val())) { 
     email.addClass("form-error"); 
     email.val(emailerror) 
    } 
    if ($(":input").hasClass("form-error")) { 
     return false 
    } else { 
     errornotice.hide(); 
     return true 
    } 
}); 
$(":input").focus(function() { 
    if ($(this).hasClass("form-error")) { 
     $(this).val(""); 
     $(this).removeClass("form-error") 
    } 
}) 
}); 

答えて

0

クライアントでの検証とは別に、実際にサーバー側で検証を行う必要があります(PHPで)。クライアント側の検証が行われる(ユーザーがJavaScriptを完全に無効にしたことさえあるかもしれない)ことや、ページからの入力はまったく保証されません。

クライアント側の検証:実際のセキュリティと保護が起こる:ユーザー

サーバー側の検証のための目キャンデー。

FWIW:html5では、ブラウザによるクライアント側の検証が可能です。

<form [...]> 
    <input type="text" id="name" name="name" required="required" placeholder="Name" minlength="2" /> 
    <input type="email" id="email" name="email" required="required" placeholder="Email" /> 
    <input name="submit" type="submit" title="Submit" class="submit_go" value="Submit" /> 
</form> 

さらに詳しい情報:先端のための

+0

ありがとう、私のコードのAjaxの部分は、サーバー側の検証を使用していても、通常のフォームの送信を停止していませんが? –

+0

ajaxコール:クライアントからPHPコードを呼び出し、サーバーが検証を行い、オプションでアクションを実行し、コード(succesまたはエラーとエラーメッセージ)を返します。呼び出すjavascriptは、返された値に反応し、オプションでサーバーからのエラーメッセージを表示する必要があります。 – swa66

0

それはちょうど>$("input").hasClass("form-error")$(":input").hasClass("form-error")ような単純なものかもしれません。私はこれが動作しないようにする何かを見ません。

私は別のルートを提案しますが。入力にクラスform-errorを追加するのではなく、最後にそのクラスの入力を探してエラーがあるかどうかを判断し、エラーがあったことを示すブーリアンフラグを設定しないでください。そうすれば、高価な操作である追加のDOMルックアップはありません。

$("#form1").submit(function() { 
    var isValid = true; 
    for (i = 0; i < required.length; i++) { 
     var e = $("#" + required[i]); 
     if (e.val() == "" || e.val() == emptyerror) { 
      e.addClass("form-error"); 
      e.val(emptyerror); 
      errornotice.fadeIn(750); 
      isValid = false; 
     } else { 
      e.removeClass("form-error") 
     } 
    } 
    if (!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA- Z0-9]{2,4})+$/.test(email.val())) { 
     email.addClass("form-error"); 
     email.val(emailerror); 
    } 
    if (!isValid) { 
     return false; 
    } else { 
     errornotice.hide(); 
     return true; 
    } 
}); 
+0

感謝。これで検証の問題は解決しましたが、フォームが送信されると、フォームと同じページに#message divを表示するのではなく、「送信済み」という単語を含む新しいページが表示されます。 –

+0

私は起こっていることは、ajax呼び出しが行くと思うが、あなたのフォームはまだ正常に提出されます。関数からajaxリクエストでfalseを返す必要があります。 – neilsimp1

+0

これは検証の動作を停止します - $( "#form1")に関連していますかvalidate({最初はデフォルトのjquery検証スクリプトを使ってフォームを設定しましたが、 –

関連する問題