PHP & MySQL - 进行可过滤搜索(提供示例)

Posted

技术标签:

【中文标题】PHP & MySQL - 进行可过滤搜索(提供示例)【英文标题】:PHP & MySQL - Making a Filterable Search (example provided) 【发布时间】:2011-07-14 06:18:42 【问题描述】:

我正在建立一个使用 phpmysql 来复制(或非常相似)this site 的练习站点。截至目前,我的可搜索字段包括:租金(最小-最大)、租赁类型(任何、公寓、房屋)、卧室数量(任何、1+、2+、3+、4+)

到目前为止,我在整理代码方面没有遇到任何问题,我只是担心扩展问题并想知道什么是最佳实践。此外,任何关于如何复制我链接的网站上的“侧边栏过滤器搜索”的建议(eBay 也有非常相似的东西)都会很棒。

这是我遇到的岔路口:我是单独处理 MySQL 查询中的每个字段过滤器,还是调用表中的所有项目,然后在 PHP 中过滤它们?

    $sql = "SELECT * FROM properties ";

$properties = Property::find_by_sql($sql);
$matched_properties = array();
foreach($properties as $property):
    if ($min_rent <= $property->rent && $property->rent <= $max_rent) 
        $matched_properties[] = $property;
    
endforeach;

上面的代码从 MySQL 中的“properties”表中提取所有内容,并创建一个 Property classes(基本 CRUD 类)数组。

抱歉,如果我听起来很混乱,但我的主要问题是 如何复制过滤后的搜索,例如 this site 或 eBay.com 上的搜索?我走在正确的道路上吗?

谢谢

【问题讨论】:

看起来你想建立自己的搜索引擎,但我建议你从已经存在的东西开始,比如 zend lucene framework.zend.com/manual/en/zend.search.lucene.html 实际上是你被击中的地方。你完成了正常的搜索吗 【参考方案1】:

一般而言,您必须从数据库中提取并在 PHP 中处理的数据越少越好。您必须编写的代码更少,产生的错误更少,通过软件堆栈传输的数据更少,等等。您可能需要阅读如何编写更复杂的 SQL 查询。以下将是您提供的代码 sn-p 的更有效版本:

$sql = "SELECT * FROM properties WHERE rent >= $min_rent AND rent <= $max_rent";
$matched_properties = Property::find_by_sql($sql);

不过,为了安全起见,您需要确保 $min_rent$max_rent 被验证为实数。 (提示:通过is_numeric() 传递输入,如果此函数返回false,则抛出错误。)否则黑客可以执行所谓的Code Injection,输入SQL 查询字符串的其他sn-ps 代替“min_rent” " 或 "max_rent" 让你的查询做很多不受欢迎的事情。

至于实现像爱荷华大学那样的过滤机制,只需在侧边栏中添加链接或表单,单击时刷新页面即可。您可以通过多种方式做到这一点。最酷的方法可能是使用 AJAX 自动更新主内容窗口。爱荷华大学网站似乎没有这样做,因为当我单击侧边栏中的各种过滤器链接时,整个页面都会刷新,而不仅仅是主要内容区域。

jQuery 是一个非常有用的 javascript 库,可以帮助您以最少的代码编写 AJAX。看看这个。基本上,您需要构建过滤器侧边栏,以便单击的每个链接都会对您的服务器进行 AJAX 查询,该查询会根据用户选择的过滤器提取更新的数据集。当 AJAX 调用返回结果时,您可以使用 JavaScript 和/或 jQuery 方法根据需要将数据注入您的页面。

祝你好运!

【讨论】:

以上是关于PHP & MySQL - 进行可过滤搜索(提供示例)的主要内容,如果未能解决你的问题,请参考以下文章

*** opensearch 过滤器搜索

MySQL--用通配符进行过滤(LIKE操作符)

mysql必知必会--用通配符进行过滤

PHP MySQL搜索/类别过滤器

MySQL基础之MySQL必知必会用通配符进行过滤

在 PHP/MYSQL 中计算过滤器记录 [重复]