我有两个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秒)
所以每次按键都会产生第二次浪费
我真的好奇为什么?
答案 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函数并存储返回的值,您可以检查是否有一个挂起。然后,您可以使用相同的值停止前一个。