用if else

时间:2016-05-27 05:28:33

标签: javascript php

我觉得我错过了一些非常简单的事情,所以我决定克服自己的固执,实际上在这里问一个问题而不是浪费时间。

我不久前开始从零开始制作我的个人博客(针对个人挑战和学习经历),我目前正在撰写电子邮件验证代码;标准发送电子邮件与令牌&电子邮件GET变量。它工作正常(万岁),但当我决定在后端添加电子邮件验证时引入了一个问题。 ajax调用仍然成功并返回正确的字符串;然而,一旦我在我的javascript中添加了一个else if语句来处理显示无效电子邮件的错误消息(它被强制通过),它似乎就好像没有大括号 - 我的成功布尔值决定了我的警报成功/失败设置为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'

说实话,它不是那么重要,但它绝对不是我想要发生的事情,那么为什么不把这个小小的怪癖作为学习的机会呢?提前感谢所有决定帮助我的人。

1 个答案:

答案 0 :(得分: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在最后返回一个JSON对象。通过将成功消息置于最顶层并在代码移动时推送任何错误消息,可以更容易地检查返回数据的长度是否仅为1或更大。如果它是1,则没有错误,一切都很顺利;否则,for循环遍历从第二个消息开始的所有返回消息,有效地打印出所有发生的错误。我希望这可以帮助任何发现自己处于类似绑定状态的人