0

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

主要 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
当我尝试这个查询时在 phpmyadmin 中有一行时加载需要 6 秒
(总共 1 , 查询耗时 0.0004 秒)
,所以每次按键都会浪费超过一秒。
我真的很想知道为什么?

4

5 回答 5

2

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

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

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

于 2013-09-11T00:41:14.743 回答
0

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

于 2013-09-11T00:35:04.100 回答
0

首先,看起来你是在本地机器上开发的,所以查询超过 1 秒意味着如果要解析的数据量很小,则有其他问题。

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

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

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

此外,您需要转换为 PDO。您正在使用的 mysql_ 操作已被弃用,并且在不久的将来将不存在。

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

于 2013-09-11T00:39:58.827 回答
0

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

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

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

我更喜欢第二种,因为它会在你专注之后发送 Ajax 请求。

于 2013-09-11T00:46:27.560 回答
0

花费的 1 秒还涉及 http 和 php 开销。所以这是对的。

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

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

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

于 2013-09-11T00:59:47.213 回答