首页 > 解决方案 > 从某些手机获取登录和注册问题

问题描述

我已经使用 ajax 和 php 创建了登录和注册页面。一些用户给我发了一封电子邮件“我们无法注册”。但我看到他们已经从数据库中注册了。注册后不会重定向用户。这个问题有时说他们在电脑上看到过,但在手机上看到过多次。

我想知道我是否遗漏了一个错误,你会检查我吗?

阿贾克斯代码:

<script type="text/javascript">
    $(document).ready(function(){   
        var form = $('#registerform');
        var submit = $('#register');
        var firstname = $('#register_username'); 
        var fullnamereg = $("#reg_fullname"); 
        var regemail = $('#reg_email'); 
        var regpassword = $('#reg_password');   
        var validated = true;

        form.on('submit', function(e) {
            // prevent default action
            e.preventDefault(); 
            jQuery.ajax({
                type: "POST",
                url: URL+"register.php",
                data: form.serialize(),
                beforeSend: function(){},
                success:function(data){ 
                    if($.trim(data) === 'ok'){
                        setTimeout(function() {
                            $('.login_form').html("Registered!");   
                            setTimeout(function() {
                                window.location.href = siteurl;
                            }, 1000); 
                        }, 1000);
                    }
                },
                error: function(data){
                    $('#form_error').html('Error, intenta de nuevo.');      
                },              
            })  
        });  
    });
</script>

和PHP代码在这里:

if(isset($_POST["reusername"]) && isset($_POST["fullname"]) && isset($_POST["password"]) && isset($_POST["regemail"])){
    $firstname = mysqli_real_escape_string($db, $_POST["reusername"]);
    $fullname = mysqli_real_escape_string($db, ucfirst(strtolower($_POST["fullname"])));
    $password = mysqli_real_escape_string($db, sha1(md5(trim($_POST["password"]))));
    $thisEmail = mysqli_real_escape_string($db, $_POST['regemail']); 
    $registerTime = time();
    $ip=$_SERVER['REMOTE_ADDR']; // user ip
    $saveUser = mysqli_query($db,"INSERT INTO `users` 
            (email,username,fullname ,password,registered,ip) 
            VALUES
            ('$thisEmail','$firstname','$fullname','$password','$registerTime','$ip')") or die(mysqli_error($db));  
    if($saveUser){
        $getUserID = mysqli_query($db,"SELECT user_id,username FROM users WHERE email = '$thisEmail' AND username = '$firstname'") or die(mysqli_error($db));
        $row=mysqli_fetch_array($getUserID,MYSQLI_ASSOC);
        $uid=$row['user_id']; // Get User ID
        $dbunm = $row['username'];  // Get User Username
        $_SESSION['user_id'] = $uid; // Session User ID 
        $hash = sha1($dbunm).$registerTime;  

        if($hash){
            setcookie($cookiename,$hash,time()+31556926 ,'/'); 
            mysqli_query($db, "INSERT INTO `session` (userid, auth) VALUES ('$uid', '$hash')"); 
            echo 'ok';  
        }
    }
}

标签: phpajax

解决方案


如果插入失败是因为用户已经存在,那么 PHP 代码将返回 200 成功状态但它不会 echo ok。因此,您的 Javascript 代码将落入成功块,但随后跳过 if 语句。因此,如果用户尝试重新注册,他们将不会收到错误消息和重定向。您可以让 PHP 代码发出明确的错误状态:

if($saveUser){
    ...
} else {
    http_response_code(500);
    exit;
}

然后,如果注册失败,AJAX 调用将落入错误块中。


推荐阅读