我能够触发js文件执行第一次警报,但我无法获得第二次警报,php文件就在那里并且工作返回0但警报('完成后');没有出现。我认为它缺少一些语法。
$(function () {
$("#login_form").submit(function () {
alert('started js');
//get the username and password
var username = $('#username').val();
var password = $('#password').val();
//use ajax to run the check
$.post("../php/checklogin.php", { username: username, password: password },
function (result) {
alert('finished post');
//if the result is not 1
if (result == 0) {
//Alert username and password are wrong
$('#login').html('Credentials wrong');
alert('got 0');
}
});
});
});
这是php
session_start();
include 'anonconnect.php';
// username and password sent from form
$myusername= $_POST['username'];
$mypassword= $_POST['password'];
$sql = $dbh->prepare("SELECT * FROM Users WHERE UserLogin= :login");
$sql->execute(array(':login' => $myusername));
$sql = $sql->fetch();
$admin = $sql['admin'];
$password_hash = $sql['UserPass'];
$salt = $sql['salt'];
/*** close the database connection ***/
$dbh = null;
if(crypt($mypassword, $salt) == $password_hash){
// Register $myusername, $mypassword and redirect to file
$_SESSION['myusername'] = $myusername;
$_SESSION['loggedin'];
$_SESSION['loggedin'] = 1;
if($admin == 1){
$_SESSION['admin'] = 1;
}
header("location:search.php");
}
else {
$_SESSION['loggedin'];
$_SESSION['loggedin'] = 0;
echo 0;
}
答案 0 :(得分:3)
好的,我会抓住这个,看看我们是否可以解决这个问题。首先,让我们稍微清理你的代码 - 干净的代码总是最容易调试:
$(function () {
$("#login_form").on('submit', function(){
console.log('form submitted');
// get the username and password
var login_info = { username: $('#username').val(), password: $('#password').val() }
// use ajax to run the check
$.ajax({
url: '../php/checklogin.php',
type: 'POST',
data: login_info,
success: loginHandler
error: function(xhr, status, err){ console.log(xhr, status, err); }
});
return false;
});
function loginHandler(loggedIn){
if (!loggedIn) {
console.log('login incorrect');
} else {
console.log('logged in');
}
}
});
...好的,我们现在看起来好一点了。让我们快速回顾一下这些变化。
首先,为alert
s交换了console.log
- 更不用讨厌了。如果您使用的是Chrome,请打开控制台进行检查 - command + optn + J
。
其次,我们稍微压缩了登录信息 - 这只是美学并使我们的代码更清洁一点。实际上你应该在需要再次使用时使用变量,在这种情况下你只需要使用一次。
接下来,我们将$.post
函数替换为$.ajax
。这给了我们两件事 - 一个是对请求细节的更精细控制,第二个是错误回调,在这种情况下尤其重要,因为你几乎肯定会收到服务器错误,这是你原来的问题。 Here are the docs for $.ajax
进一步澄清。
我们还将成功处理程序指向一个函数,以最大限度地减少嵌套。您可以在下面看到声明的函数,它将接收服务器返回的数据。
最后我们返回false,以便页面不刷新。
现在,让我们来解决这个问题。使用此代码时,您应该在控制台中看到一些内容。第一个可能是带有500 internal server error
之类的红色消息,第二个应该是ajax函数的错误回调结果。如果您点击网络标签并查看请求和回复的详细信息,您可以在Chrome中获得更多有关此内容的详细信息。
我无法修复您的PHP,因为您没有发布它,但我会假设您要么自己跟进编辑或计算。一旦你解决了服务器问题,你应该回复一个干净的console.log
并回复你的回复,然后你可以继续前进。
或者,这将起作用,因为缺少页面刷新,在这种情况下你可以忽略前两段并声明胜利:)
希望这有帮助!
答案 1 :(得分:1)
$("#login_form").submit(function (e) {
e.preventDefault();
// and so on
答案 2 :(得分:-1)
您需要更改第二行并添加e.preventDefault以防止表单刷新整个页面。
$("#login_form").submit(function (e) {
e.preventDefault();
此外,我会更改AJAX请求以使用GET并更改PHP中的代码以从GET读取变量,这样您就可以通过在浏览器中运行它来轻松测试PHP页面是否正常工作 ?的 checklogin.php用户名= X&安培;密码= Y 强>
答案 3 :(得分:-1)
试试这个:
$("#login_form").submit(function () {
alert('started js');
//get the username and password
var username = $('#username').val();
var password = $('#password').val();
//use ajax to run the check
$.post("../php/checklogin.php", { username: username, password: password }, function (result) {
alert('finished post');
//if the result is not 1
if (result == '0') {
//Alert username and password are wrong
$('#login').html('Credentials wrong');
alert('got 0');
}
}, 'text');
});
也许服务器没有提供正确的数据格式。例如,如果您请求json,并且jQuery无法将结果sting转换为json。然后该函数将不会被执行,然后你将无法获得'alert('得到0');'的事情。