首先,我要说的是,我在本网站和 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
。
答案 0 :(得分:0)
如果要通过ajax调用返回数据,则必须打印数据。
例如,
$var['error']="Could not process request";
echo json_encode($var);
答案 1 :(得分:0)
问题是解决的。名为Scott Sawyer的人称header("Location: /")
会导致$.ajax()
方法返回整个当前页面。重定向似乎现在正在起作用。感谢大家的投入。