使用jQuery时,从PHP获取的AJAX响应有困难

3

我对 AJAX 还比较新手。我正在尝试让一个简单的登录脚本工作。这是使用 jQuery 1.6.4。在以下的 AJAX 中,当用户点击按钮时,它会将电子邮件地址和密码发送到 login.php。

那似乎都很好用。问题出在成功函数上。当电子邮件和密码正确时,它应该返回 true。当它不工作时,它应该返回 false。使用 Firebug,我看到 console.log 可以工作,如果我写 alert(response); 也可以正常工作。但是,即使 response 等于 true,条件语句始终为 false。我已经尝试了 if(response=="true")if(response==="true"),将变量放在函数外面等等一些其他的东西,但都没有成功。是否有人有任何想法如何解决这个问题?

感谢任何帮助或想法, Jason。

AJAX:

$("#firstpage").live('pageinit', function (evt) {
$('#button').click(function(){       
var $form = $('#login'),
$inputs = $form.find("input"),
serializedData = $form.serialize();
$.ajax({
  type: 'POST',
  url: 'php/login.php',
  data: serializedData,
  success: function(response){
    console.log("Response: "+response);
    if(response=="true") 
    {
$('#firstpage #wrong').text("Login script is working");
} else {
$('#firstpage #wrong').text("Your email and password combination did not match.");
}

    },      
  dataType: 'json'
});
});  
});

如果有帮助的话,这是我的login.php脚本。
$email = $_POST['email'];
$password = $_POST['password'];
require_once("DB.php");
$connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!"); 
mysql_select_db($db) or die ("Unable to select database!"); 

$query = "SELECT * FROM member WHERE email='$email' AND password='".md5($_POST['password'])."'";
$result = mysql_query($query) or die ("Error in query: $query. ".mysql_error()); 

$num_rows = mysql_num_rows($result);
if($num_rows>0){
$output = true;
} else {
$output = false;
}
echo json_encode($output);

我不认为答案可以是“true”。也许是true,但不是“true”。请查看浏览器的检查器(按F12键)以查看响应中实际的内容。 - Denys Séguret
我会确保你得到的是一个字符串 "true" 而不是一个布尔值 true。在 PHP 中更改为 $output = "success",在 Javascript 中更改为 response === "success" 或者更具有意图性的内容,这样你就可以缩小问题范围。 - potench
尝试类似于 typeof response == 'boolean' 的语句。 - jwerre
1
@user1502099,你真的需要了解一下SQL注入,切换到mysqli / PDO,并使用比md5更好的密码哈希算法。 - jeroen
@jeroen你会推荐MD5之外的东西吗?我会尝试使用mmysqli和pdo;我以前没有用过它们。 - Jason T. Bedell
@Jason T. Bedell 至少使用带有唯一盐值的sha256,更多信息请参见此处:https://dev59.com/F3E95IYBdhLWcg3wm_Mu - jeroen
2个回答

1
响应是一个对象,因为你设置了 "dataType: 'json'"。jQuery 将尝试将 responseText 转换为 JSON。如果你需要检查服务器返回的数据,请尝试使用。
if (response === true) {

}

或者简单地说

if (response) {

}

或者只需删除数据类型:'json',让jQuery返回字符串。


哇,你们真快。我把它改成了 response === true,然后它就起作用了。听起来 PHP 的解决方案也可以起作用。我没有意识到我混淆了布尔值和字符串值。非常感谢你们。 - Jason T. Bedell
随时!顺便说一句,@jeroen 是正确的,如果你在生产中使用这段代码,应该听从他的建议 :) - SMathew
谢谢。我会看看关于bcrypt的资料。它能在PHP中使用吗? - Jason T. Bedell
应该可以,我没有在php中做过这个,但是http://www.php.net/manual/en/function.crypt.php应该可以工作。只需使用blowFish算法即可。将生成的salt保存在单独的列中,将哈希密码保存在数据库的另一列中。您可以将密码列重命名为hashed_password或其他有意义的名称。 - SMathew
验证身份的方法应该是:1. 从数据库中检索与电子邮件匹配的用户(电子邮件必须是唯一的)。2. 使用盐和用户提供的输入重构密码,并将其与哈希密码相等。这离题了,不是吗? :) - SMathew
显示剩余2条评论

0

不要在使用完全相等符号===时使用引号。使用

if (response === true)

因为你的 PHP 脚本返回的是 true,而不是 "true"
我对 PHP 不是很熟悉,但是尝试一下去掉 true 周围的引号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接