繁体   English   中英

Ajax和MySQL需要时间

[英]Ajax and MySQL take along time

我有两个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秒)
因此,每次按键都会产生超过第二次浪费。
我真的好奇为什么?

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

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

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

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

首先,看起来您正在本地计算机上进行开发,因此查询占用超过1秒意味着如果要解析少量数据则会出现其他问题。

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

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

在这里阅读它们: http//php.net/manual/en/book.pdo.php

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

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

这是因为你正在使用keyup功能,我会推荐2个更好的选择:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM