PHP MySQL & AJAX 搜索过滤器时间延迟
Posted
技术标签:
【中文标题】PHP MySQL & AJAX 搜索过滤器时间延迟【英文标题】:PHP MySQL & AJAX search filter time delay 【发布时间】:2012-06-07 18:38:24 【问题描述】:这是我第一次在 php 和 javascripts 上工作......需要你的帮助来解决一些问题。
我的网站在标题处有一个搜索框,当提交搜索词时,它会转到包含过滤菜单和搜索结果的 search.php。过滤器菜单基于几个选择列表。只要单击过滤器菜单中的任何选项,它就会更新搜索结果。
为此,我使用 javascript 从另一个 php 文件“SearchResult.php”调用数据来更新 ID 为 #Result 的 div。
问题: 它在本地主机上工作得很好,但是当在线时,它会导致更新搜索结果的延迟。
帮助: 有什么方法可以显示某种加载让观众理解,或者有什么方法可以让它更快。
这是我的代码:
Java 脚本函数
function get()
$('#Search_Results').hide();
$.post('SearchResults.php', Search: form.Search.value, cat: form.category.value, brand: form.brand.value ,
function(output)
$('#Search_Results').html(output).show();
)
搜索过滤器表单
enter code hereif(!empty($_REQUEST['Search']))
$SearchTerm = $_REQUEST['Search'];
else
$SearchTerm = '';
// Search term submited
echo '<input name="Search" type="hidden" value="'.$SearchTerm.'" />';
$sql = mysql_query ("SELECT * FROM categories");
echo '<h4>Filter Categories</h4><select name="cat" onChange="get();" size="15">';
echo '<option value="" class="Select_Options">All Categories</option>';
while ($row = mysql_fetch_array($sql))
echo '<option class="Select_Options" value="' . $row["CategoryID"] . '">' . $row["CategoryName"] . '</option>';
echo '</select>';
//Few more such filters
搜索结果页面
if(!empty($_REQUEST['Search']))
$SearchTerm = $_REQUEST['Search'];
else
echo 'Please enter search keyword(s)';
exit();
if(!empty($_REQUEST['cat']))
$cat = $_REQUEST['cat'];
$SearchQuery .= " AND categories.CategoryID = '$cat'";
if(!empty($_REQUEST['brand']))
$brand = $_REQUEST['brand'];
$SearchQuery .= " AND brands.BrandID = '$brand'";
$sql = "SELECT DISTINCT products.ProductID, ProductKeywords, products.SectionID, products.ProductThumb, products.ProductPrice, products.CategoryID, products.SubCategoryID, products.BrandID, brands.BrandLogo, ProductTitle AS title FROM products
INNER JOIN brands ON products.BrandID = brands.BrandID
INNER JOIN sections ON products.SectionID = sections.SectionID
INNER JOIN categories ON products.CategoryID = categories.CategoryID
INNER JOIN subcategory ON products.SubCategoryID = subcategory.SubCatID $ColorJoin
WHERE MATCH (ProductKeywords) AGAINST ('$SearchTerm*' in boolean mode)$SearchQuery";
$query = mysql_query($sql);
echo '<div id="Product_Search_Container"><ul>';
while ($row = mysql_fetch_array($query))
$ProductID = $row["ProductID"];
$sql2 = mysql_query ("SELECT COUNT(ProColorID) AS ProductCount FROM productcolors WHERE ProductID = '$ProductID'");
while ($row5 = mysql_fetch_array($sql2))
$BrandID = $row["BrandID"];
$sql3 = mysql_query ("SELECT * FROM brands WHERE BrandID = '$BrandID'");
while ($row6 = mysql_fetch_array($sql3))
$ProductThumb = $row["ProductThumb"];
if ($ProductThumb == NULL) $ProductThumb = "No_Image.jpg";
echo '<li><img src="images/Products/Thumbs/' . $ProductThumb . '" />
<div class="zoomer"><span class="zoom';
if ($ProductThumb != "No_Image.jpg")
echo ' cursonstyle" style="position: relative; overflow: hidden;"><img src="images/Products/Thumbs/zoom/' . $ProductThumb . '" title"] . '" />
'; else echo '">';
echo '</span><span class="Pro_Title">' . $row["title"] . '</span>
<span class="BrandLogo"><img src="images/Brands/' . $row6["BrandLogo"] . '" /></span>
<span class="ProColors">' . $row5["ProductCount"] . ' Colors</span>
<span class="ProPrice">$' . $row["ProductPrice"] . '</span>
<a href="?Product=' . $row["ProductID"] . '" class="viewdetails"> </a></a></li>';
echo '</ul></div>';
【问题讨论】:
您的代码容易受到 SQL 注入的攻击。您确实应该使用准备好的语句,将变量作为参数传递到其中为 SQL 评估。如果您不知道我在说什么或如何解决它,请阅读 Bobby Tables 的故事。 另外,请停止使用古老的 MySQL 扩展编写新代码:它已不再维护,社区已开始 deprecation process。相反,您应该使用改进的MySQLi 扩展或PDO 抽象层。 尝试缩小问题范围。远程数据库上的查询本身是否很慢?尝试使用例如直接运行它PHPMyadmin(如果已安装)? 感谢 Eggyal,你说得对……我确实需要保护参数,现在就开始学习 MySQLi。本地主机上的查询速度很快,但在线测试大约需要 5-10 秒:( 【参考方案1】:您可以在启动发布请求时显示加载消息并将其隐藏在回调中。
function get()
$('#Search_Results').hide();
$('#loading').show().html('Please wait while loading..'); // <-- show message on function call
$.post('SearchResults.php', Search: form.Search.value, cat: form.category.value, brand: form.brand.value ,
function(output)
$('#loading').hide(); // <-- hide in callback function
$('#Search_Results').html(output).show();
)
您还应该处理 ajax 请求中的错误并查看准备好的语句,或者至少对所有用户输入使用 mysql_real_escape_string()。
【讨论】:
感谢 F***,这个想法很好,但不幸的是结果是一样的..... Loading Div 的出现时间几乎相同:( 我以为你想添加加载消息。也许我在这里弄错了:Is there any way to show loading of some kind to let the viewer understand
。很难说为什么它很慢,正如 cmets 中已经提到的那样,远程数据库可能很慢,或者您只是在这种情况下才面临这个问题?您是否尝试过像@eggyal 所说的那样直接运行查询?
带有“请等待加载”消息的 div(来自 jquery 代码)真的需要 5-10 秒才能出现?
是的,不幸的是,在线测试确实需要 5-10 秒:( ...我不知道为什么 ....也许函数的执行是导致延迟的原因?
如果加载消息也有此延迟,则您的错误可能在您的 javascript 代码中。这真的很奇怪..您可以发布更多的js代码或提供一个现场示例(由于您的安全问题,没有mysql查询)以上是关于PHP MySQL & AJAX 搜索过滤器时间延迟的主要内容,如果未能解决你的问题,请参考以下文章
PHP、AJAX、MySQL 的复选框过滤以及 AND/OR 之间的切换
使用 jquery ajax mysql 和 php 按复选框过滤数据