2016-05-27 13 views
0

私は本当にシンプルなものを見逃しているように感じるので、私は頑固なものを乗り越えて、もう時間を無駄にするのではなく、実際にここで質問します。私のjavascriptを破った場合は

私は個人的なブログを作成し始めました(個人的な挑戦とそれの学習経験のために)、私は電子メールの検証のためのコードを書いています。標準は、トークン&電子メールGET変数と電子メールを送信します。 (hooray)は正しく動作しますが、バックエンドに電子メールの検証を追加することに決めたときに導入された問題が1つあります。 ajaxの呼び出しは成功し、正しい文字列を返します。しかし、いったん私は別のif文をjavascriptに追加して、無効な電子メールのエラーメッセージが表示される(または強制される)ことを処理するようにすると、かっこがないように見えます。私の警告の成功/失敗はfalseに設定され、ユーザに表示される文字列も私が意図したとおりではありません。ここに私のコードと説明するスクリーンショットがあります: * if..elseをスイッチに変更して、何かを変更するかどうかを確認しました。

//JAVASCRIPT 
    $("form").submit(function(event) { 
    if(request) request.abort; 

    var message = ""; 
    var success = false; 
    var formMessageBox = document.getElementById("form-message"); 

    var form = $(this); 
    var inputs = form.find("input"); 
    var data = inputs.serialize(); 

    inputs.prop("disabled", true); 

    request = $.ajax({ 
     url: "php/form.php", 
     type: "post", 
     data: data 
    }); 

    request.done(function(data) { 

     var submission = data; 

     switch (submission) { 
      case "success": 
       message = "You're good to go! You'll be receiving an email shortly from <strong>my_email</strong>, just to make sure everything's in the green"; 
       $("form").innerHTML = ""; 
       success = true; 
       break; 

      case "fail": 

       message = "Seems this email is already in my database; you may have submitted twice, or somebody might have hijacked your email--don't worry, it's more than likely the former."; 
       success = false; 
       break; 

      default: 

       message = submission; 
       success = false; 
       break; 

     } 
    }); 

    request.always(function() { 

     inputs.prop("disabled", false); 

     if(success) { 
      formMessageBox.classList.add("alert-success"); 
      if (formMessageBox.classList.contains("alert-danger")) formMessageBox.classList.remove("alert-danger"); 

     } 
     else { 
      formMessageBox.classList.add("alert-danger"); 
      if (formMessageBox.classList.contains("alert-success")) formMessageBox.classList.remove("alert-success"); 
     } 

     formMessageBox.innerHTML = message; 

    }); 

    event.preventDefault(); 

}) 

//PHP 

<?php 

if(!$_POST["email"]) { 
    echo "Please enter an email address"; 
    exit(0); 
} 

if($_POST["email"] AND !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) { 
    echo "Please enter a valid email address"; 
    exit(0); 
} 


$dbconn = mysqli_connect("localhost","username", "password", "db"); 
if (mysqli_connect_error()) die("There seems to be something wrong. Sorry, try again later"); 

require_once('CryptoLib.php'); 
$token = CryptoLib::randomString(16); 

$name = isset($_POST['name']) ? $_POST['name'] : "user"; 
$email = $_POST['email']; 

$emailTo="$email"; 
$subject="Web Devs' Corner Verification"; 
$body="http://www.allen-mcintoshii.com/webdevscorner/php/verify.php?conf-token=".$token."&email=".$email; 
$headers="From: my_email"; 

$query = "INSERT INTO `users` (`name`, `email`, `conf_token`) VALUES ('$name', '$email', '$token')"; 
$result = mysqli_query($dbconn, $query); 
if ($result AND mail($emailTo, $subject, $body, $headers)) echo "success"; 
else echo "fail"; ?>  

My 'successful error'

正直に言うと、それはすべてが重要ではないのですが、それは間違いなく私が起こることを意図したものではないので、なぜ何かを学ぶ機会として、この小さな癖を使わないのでしょうか?私を助けてくれることを決めた皆様に、ありがとうございます。

+0

ロギングステートメントを追加して、コールバックのどれが最初に実行されたかを確認してください。 – deceze

+0

Juh、それについて考えていない、ありがとう私は間違いなく今それを試してみる –

+0

@deceze私は2回だけを確認するために - 私は期待どおりに完了コールバックが最初に発生します。 –

答えて

0

もう少し小さなプロジェクトでも同様のことをしようとしていましたが、実際には私自身の解決策を見つけました。誰もが同じような苦境に遭遇した場合に備えて、ここに残しておきます。

//PHP 
<?php 

session_start(); 

$errors = array(); 
$errors[] = "You have been successfully signed up! Welcome to your diary!"; 
$min_chars = 8; 
$email = $_POST['email']; 
$password = $_POST['password']; 

if (!$email) { 
    $errors[] = "Please enter an email address."; 
} 

if ($email AND !filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    $errors[] = "Please enter a valid email address"; 
} 

if (!$password) { 
    $errors[] = "Please enter a password."; 
} 
else { 
    if (strlen($password) < $min_chars) $errors[] = "Your password must be at least $min_chars characters"; 
    if (!preg_match('`[A-Z]`', $password)) $errors[] = "Your password is required to have at least on capital letter"; 
} 

if (!$errors[1]) { 
    $dbconn = mysqli_connect(args) //just hiding what needs to be hidden here; 
    if (mysqli_connect_error()) die("There seems to be something wrong. Sorry, try again later"); 

    $query = "SELECT * FROM users WHERE `email` ='".mysqli_real_escape_string($dbconn, $email)."'"; 
    $results = mysqli_num_rows(mysqli_query($dbconn, $query)); 

    if ($results != 0) $errors[] = "We're sorry, that email is already in our database, did you mean to log in?"; 
    else { 
     $query = "INSERT INTO `users` (`email`, `password`) VALUES ('".mysqli_real_escape_string($dbconn, $email)."', '".password."')"; 

     $result = mysqli_query($dbconn, $query); 
     $_SESSION['id'] = mysqli_insert_id($dbconn); 
    } 
} 

if ($errors[1]) session_destroy(); 
echo json_encode($errors); 
?> 

//Javascript 
$(document).ready(function() { 

var msgBox = $("#message-box"); 

$("#signup").submit(function(e) { 

    e.preventDefault(); 
    var formData = $(this).serialize(); 

    $.post("signup.php", formData, function(data) { 

     var success = data.length == 1 ? true : null, 
      numErrors = data.length, 
      errors = ""; 

     if (success != null) { 
      msgBox.addClass("alert-success"); 
      msgBox.removeClass("alert-danger"); 
      msgBox.html(data[0]); 
     } 

     else { 
      msgBox.addClass("alert-danger"); 
      msgBox.removeClass("alert-success");     
      var i; 
      for (i = 1; i < numErrors; i++) { 
       errors = errors + "<li>" + data[i] + "</li>"; 
      } 

      msgBox.html("<ul>" + errors + "</ul>"); 
     } 
    }, "json") 
}) 

$("#login").submit(function(e) { 
    $.post() 
}) 

}) 

の代わりに/不合格合格した場合に異なる文字列を返すようにしようと、私はどんな終わりPHPリターン1 JSONオブジェクトをさせないことにしました。成功メッセージを一番上に置き、コードが動くにつれてエラーメッセージを押すことで、戻りデータの長さが1以上であるかどうかをチェックする方が簡単になります。 1の場合、エラーはなく、すべてうまくいった。そうでなければ、forループは返されたすべてのメッセージを2番目のものから繰り返して、発生したすべてのエラーを効果的に出力します。私はこれが似たような縛りを見つけた人に役立つことを願っています。

関連する問題