Ajax和MySQL需要时间

时间:2013-09-11 00:32:23

标签: php javascript jquery mysql ajax

我有两个PHP页面和一个JavaScript页面 数据库有一行和两列

主要的PHP代码

<html>
<head>
<title>Hello!</title>
<script type="text/javascript" src="script/jquery-2.0.3.min.js"></script>
<script type="text/javascript" src="script/agent.js"></script>
<link rel="stylesheet" href="css/sheet.css" media="screen"/>
</head>
<body>
<table>
<tr>
<td>agent no. :</td>
<td>
<input type="text" class='agent' name="agent"/>
</td>
<td id='agentname'>agent name</td>
</tr>
</table>
</body>
</html>

和agent.php代码

<?php
$c=mysql_connect("localhost","root","") or die (mysql_error());
$d=mysql_select_db("davidmag_ac") or die(mysql_error());
if(isset($_GET['agent']) and $_GET['agent']<>""){
$agent=$_GET['agent'];
$result= mysql_query("
select agentname 
from agent 
where agentid=$agent
") or die(mysql_error());
$n=mysql_fetch_assoc($result);
echo $n['agentname'] ;
}
?>

和agent.js代码

$(document).ready(function(){
$(".agent").keyup(function(){
agent=$(".agent").val();
xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","agent.php?agent="+agent,false);
xmlhttp.send();
document.getElementById("agentname").innerHTML=xmlhttp.responseText;
});
});

问题是每次按键时加载代理名称需要超过一秒(1.3或1.2)所以如果我写12345,当有一行时加载需要6秒 而在phpmyadmin当我尝试这个查询时取 (共1次,查询耗时0.0004秒)
所以每次按键都会产生第二次浪费 我真的好奇为什么?

5 个答案:

答案 0 :(得分:2)

忽略明显的SQL注入漏洞,尝试使用mysql_pconnect(),这将保持连接打开:

http://php.net/manual/en/function.mysql-pconnect.php

请注意,mysql_ *函数已弃用。您应该考虑切换到MySQLi或PDO。

答案 1 :(得分:0)

我不是php专家,但我想在每个keyup上建立一个与数据库的新连接会减慢速度。

答案 2 :(得分:0)

首先,它看起来像是在本地计算机上进行开发,因此查询占用1秒以上意味着如果要解析少量数据则会出现其他错误。

您可以通过了解SQL索引并确保数据库得到优化来提供帮助。

其次,您可以转换为PDO和Prepared Statements。它们更安全,如果数据库引擎使用持久连接,它们可以更快一些。

在此处阅读:http://php.net/manual/en/book.pdo.php

此外,您需要转换为PDO。您正在使用的mysql_操作已被弃用,并且很快就会存在。

最后,将onKeyUp事件更改为onBlur。您每次按键都会触发查询。输入3个字符,发送您的AJAX请求3次,并在不到一秒的时间内查询数据库3次。

答案 3 :(得分:0)

这是因为您使用的是keyup功能,我建议使用2个更好的选项:

第一个是$.widget("ui.onDelayedKeyup", {

第二个是$('.agent').focusout(function() {

我更喜欢第二个,因为它会在您关注之后发送Ajax请求。

答案 4 :(得分:0)

超过1秒也涉及http和php开销。这是正确的。

我建议不要在每次按键时直接调用ajax页面,而是在呼叫前半秒钟设置超时。

如果在半秒内,还有另一个触发ajax的请求,则跳过当前的请求并让新请求通过。

在javascript中使用settimeout函数并存储返回的值,您可以检查是否有一个挂起。然后,您可以使用相同的值停止前一个。