chrome / safari中的简单AJAX查询提供了不那么简单的调试情况

时间:2010-01-21 16:28:52

标签: jquery ajax

我有一个非常简单的jQuery / ajax脚本,用于会员驱动的网站。该脚本只是检查用户是否输入了信息,对我的数据库进行了验证,对于失败的登录尝试返回1,如果用户名/密码匹配则返回0。

当我运行它时,该功能完美无效,无需从ajax调用它。

Firefox:一切正常。
Chrome / Safari:该查询会锁定所有内容。当我输入有效信息时,甚至没有任何请求记录(在开发人员工具chrome / safari供应中)。输入无效信息后,请求将消失,并返回3.

我对此感到非常困惑。

这是一个“沙盒”问题吗?据我所知,Firefox和Chrome / safari处理XHR的方式不同......虽然不要问我怎么做。

我正在运行MAMP的基本安装。这可能是我开发人员环境中的问题吗? (我将在今天下午晚些时候在实时服务器上测试它)

这是我的AJAX调用和它正在调用的php脚本。

AJAX:

$.ajax({
  //I've also tried..
  //url: '_modules/php/session.php',
 url: 'http://localhost/current/100TradeJack/httpdocs/_modules/php/session.php',
 type: 'POST',
 cache: false,
 timeout: 5000,
 data: "method=login&"+$('#loginTop').serialize(),
 error: function(XMLHttpRequest, ajaxOptions, thrownError)
 {
  alert("ERORR!!");
 },
 success: function(response){
  alert(response);
  if(response == '0'){ 
   alert("log user in");
   window.location.replace("http://localhost/current/100TradeJack/httpdocs/trading.php");
  } else if(response == '1') {
   alert("invalid username/password");
  } else {
   alert("ERRROOR!");
  }

 }
});

session.php文件:

if($_POST['method'] == 'login'){
    $validated = login($_POST['email'], $_POST['password']);
    echo $validated;
}


function login($email, $password){
$connection = mysql_connect("localhost","root","root") or die(mysql_error());
mysql_select_db("sandbox_members", $connection) or die(mysql_error());


if($email){
 $email = mysql_real_escape_string($email);
} else {
 return 1;
}

if($password){
 $password = mysql_real_escape_string($password);
} else {
 return 1;
}


$query = "SELECT * FROM users WHERE username='". $email . "' AND password='". $password ."'";

$result = mysql_query($query);

if($row = mysql_fetch_array($result)){
 return 0; 
} else {
 return 3;
}

//if it gets to here the username/password combo was incorrect or was not found in the db
return 1;
mysql_close($connection);
}

3 个答案:

答案 0 :(得分:2)

PHP代码中存在一个小问题:

在你的查询数据库之后,你会返回一些代表状态的数字,但是在脚本的末尾你关闭了与数据库的连接... mysql_close($ conn)将永远不会发生在结束语句之前使用那些各种返回的函数范围。也许你遇到的那些打嗝是因为未建立的数据库连接。

JS 代码看起来很好

我修改了ajax调用以获取静态html,我编辑了各种场景(使用0,1,......)并且它完美运行(Opera,Chrome,FF)..

同时尝试window.alert($('#loginTop').serialize())检查发布的数据,或者使用表单和JS(没有所有其他逻辑)创建一个简单的html文档,并将其指向您的脚本。

同时检查console.log()的脚本,因为这可能会破坏除FF以外的其他浏览器中的javascript

答案 1 :(得分:1)

这不应该是沙盒问题。你是如何解雇这个ajax请求的?您确定开发控制台没有提供错误输出(确保您不排除错误)。

我没有PHP / web开发环境,但您可以尝试一些调试内容:

  • 尝试将网址设置为域相对网址:'/ current / 100TradeJack/httpdocs/_modules/php/session.php'
  • 将登录验证URL指向一个0或1的静态页面,以测试它是否有效。
  • 通过在此ajax调用之前发出警报,找出chrome和safari“静默”的位置。
    • 事件被解雇了吗?
    • 您的函数(包含此ajax请求)是否被调用?
    • 您的初始化代码是否被调用?
  • 执行一个简单的ajax请求,该请求获取登录验证结果(或静态验证结果)并提醒响应。尝试onclick或页面加载完毕。
  • 如果您有很多JS代码,请简化问题。开始削减代码(首先备份),看看它是否仍然有效。
  • 责备IE (哎呀)。如果你仍然难倒,你可以将斜线代码提交给webkit作为bug。您还可以检查它是否是确认的错误。

答案 2 :(得分:0)

而不是

 return 1;

使用

echo "1";

你在ajax中调用了这个函数,它希望在页面中找到响应写入的内容


同样检查你的mysql结果可能是查询中有一个错误,为什么它的路由到

else { return 3 };