jQuery AJAX方法返回当前页面

时间:2014-03-31 18:10:52

标签: php jquery ajax validation

首先,我要说的是,我在本网站 jQuery文档中查看了其他类似的问题。到目前为止,我还没有找到解决我问题的方法。

我正在尝试使用电子邮件地址和密码设置登录表单。我有一个只适用于PHP的解决方案,但是我也试图添加AJAX功能。

我正在使用的代码现在返回正在进行AJAX调用的整个页面。仅仅为了一些额外的信息,我使用的是jQuery 1.10.2和PHP 5.4.12。这也是我第一次设置一个站点,使用PHP脚本根据发送给它的数据来决定使用哪些其他脚本,所以请耐心等待。

这是我的表格:

<form id="employee_login" name="employee_login" action="portal.php" method="post">
    <input type="text" name="email" placeholder="Email address">
    <input type="password" name="password" placeholder="Password">
    <button id="login" type="submit" name="submit">Submit</button>
</form>
<div id="error_box">
    <?php if(isset($GLOBALS['loginError']) && $GLOBALS['loginError'] != '') { ?>
        <p class="error"><?php echo $GLOBALS['loginError']; ?></p>
    <?php } ?>
</div>

这是我的AJAX功能:

function ajaxValidate(email, pass, error) {
    if($(email).val() == '' || $(pass).val() == '') {
        $(error).html('<p class="error">You must enter your email address and password!</p>');
    }
    else {
        $.ajax({
            type: 'POST',
            url: '/php-modules/ajax_filter.php',
            dataType: 'text',
            data: { emailAddr: $(email).val(), password: $(pass).val()},
            success: function(text, textStatus, jqXHR)
            {
                console.log(Date() + ': ' + text);
                try{
                    if( IsType(text, 'json') ) {
                        var ajaxData = $.parseJSON(text);
                        if(ajaxData['error'] != null && ajaxData['error'] != 'undefined')
                            $(error).html('<p class="error">' + ajaxData['error'] + '</p>');
                        else if(ajaxData['is_email'] != 1)
                            $(error).html('<p class="error">You must enter a <strong>VALID</strong> email address.</p>');
                        else if(ajaxData['is_email'] == 1)
                            document.location = jqXHR.getResponseHeader('Location');
                        else
                            $(error).html('<p class="error">You must enter your email address and password!</p>');
                    }
                    else if( IsType(text, 'html') ) $(error).html( $.parseHTML(text) );
                    else if( IsType(text, 'xml') ) alert('Data is XML.');
                }
                catch(e) {
                    $(error).html('<p class="error">' + e.description + '</p>');
                    console.debug(e);
                }
            },
            error: function(jqXHR, textStatus, errorThrown)
            {
                $(error).html('<p class="error">' + jqXHR.status + ' ' + errorThrown + ' ' + jqXHR.responseText + '</p>');
            }
        });
    }
}

我发送AJAX调用的脚本目前只设置了1个请求。我打算稍后再添加。我不确定我是否设置了太多支票,但我想要安全,因为我对这样的事情不是很熟悉。而我今天添加的“未识别的错误”是我认为可能造成问题的“返回错误”的替代品。这是代码:

<?php
// a filter for all AJAX requests

// for email checking
if( isset($_POST['emailAddr']) ) {
    require_once('login.php');
    if(isset($GLOBALS['loginError']) && $GLOBALS['loginError'] != '') {
        echo '{"error":"' . $GLOBALS['loginError'] . '"}';
    } else echo '{"error":"Unidentified error"}';
}
// if $_POST isn't set, isn't an array, or has a length less than 1, return an error
else if(!isset($_POST) || !is_array($_POST) || count($_POST) < 1) {
    echo '{"error":"No data sent"}';
}
// if the previous check fails, invalid or insuficient data was sent
else {
    echo '{"error":"Could not process request"}';
}
?>

最后一部分是我的登录检查脚本。我省略了实际的查询和表字段,因为这些部分在使用我的PHP解决方案时工作正常。

<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {

// halt execution if the login fields are empty
if((!isset($_POST['emailAddr']) || $_POST['emailAddr'] == "") && (!isset($_POST['password']) || $_POST['password'] == "")) {
    $GLOBALS['loginError'] =  'You must enter your email and password!';
}
else {// check for valid email
    require_once('is_email.php');
    if( !is_email($_POST['emailAddr']) ) $GLOBALS['loginError'] = 'You must enter a valid email address!';
    else if($_POST['emailAddr'] != "" && $_POST['password'] != "") {
        try{
            // PDO setup
            include('pdo.php');
            $con = createPDO();

            // PDO statement preparation and execution
            $query = $con->prepare("[query code];");
            $email = $_POST['emailAddr'];
            $password = $_POST['password'];

            // returned PDO query data
            if($query->execute( array($email) ) ) {
                while($row = $query->fetch(PDO::FETCH_ASSOC)) {
                    if(strtolower($email) == strtolower($row['email']) && $password == $row['password']) {
                        // set session data
                        $_SESSION['user_id'] = $row['[id field]'];
                        $_SESSION['name'] = ucfirst($row['[name field]']);
                        $_SESSION['email'] = $row['[email field]'];
                        session_regenerate_id();
                        header("location: /");
                    }
                    else $GLOBALS['loginError'] = 'ID or password incorrect!';
                }
            }
            } catch(Exception $e) { 
                $GLOBALS['loginError'] = $e->getMessage();
            }
        }
        else $GLOBALS['loginError'] = 'You must enter your email and password!';
    }
}
?>

我删除了不必要的函数和return false;行,添加了console.log();方法,将ajax email:选项中的data:值名称更改为{{1 (在我的PHP代码中)如果它与我的emailAddr:变量之间存在名称冲突,并且在PHP生成HTML错误消息的情况下将我的代码更改为解析HTML。我的括号,大括号和括号似乎匹配正常(我使用Sublime Text的括号/大括号/括号突出显示检查),脚本的表单检查部分工作正常。

我老实说不知所措......

另外,感谢所有阅读这篇冗长帖子的人。

问题更新

我刚刚意识到解析email中的代码是正常的。由于try不起作用,它正在跳过if语句来解析HTML而且它正在运行。

代码更改

我用 Morganster 替换了一些$.parseJSON语句return

2 个答案:

答案 0 :(得分:0)

如果要通过ajax调用返回数据,则必须打印数据。

例如,

$var['error']="Could not process request";

echo json_encode($var);

答案 1 :(得分:0)

问题是解决的。名为Scott Sawyer的人称header("Location: /")会导致$.ajax()方法返回整个当前页面。重定向似乎现在正在起作用。感谢大家的投入。