使用PHP和MySQL创建动态搜索查询

6

我正在尝试根据用户输入创建动态搜索查询。

要求:

  • 用户可以填写零个、一些或所有字段。
  • 查询在表格中寻找符合所有要求的记录。

我已经做了调研,发现有多种方法可以实现这个目标。但是它们中没有一个能够工作,而且如果它们能够工作,它们也远非实用。

尝试:

目前我正在创建以下查询:

SELECT * 
FROM assignments 
WHERE (id = $id OR id = '') 
  AND (field1 = $field1 OR field1 = '')

这个查询是有效的,但只有在填写了所有字段后才有效。

我从一个stackoverflow文章中得到了这个答案,但我现在找不到了。文章中说:

如果用户填写了输入字段,它将检查第一个规则"id=$input",如果用户没有指定任何输入,它将检查"id='' ",当它检查它时,它将返回所有内容。因为它会转义空搜索规则。

但正如你可能已经知道的,这并不起作用。

你认为我应该如何处理这个问题?


1
为什么不根据您的要求使用PHP创建动态查询呢?例如,在搜索之前,使用包含所有过滤元素的数组来构建查询? - derdida
你是在使用PDO还是mysqli?你应该准备好你的语句,这样就可以正确地处理它们了... - Cheruvian
1
请参考以下链接:http://stackoverflow.com/questions/18940229/mysql-search-from-multiple-user-supplied-where-clause-fix-and-better-algorithm/18940304#18940304 和 http://stackoverflow.com/questions/21691675/combination-of-field-search-using-php-mysql/21691822#21691822。 - Barmar
3个回答

13
尝试获取所有的帖子变量并循环遍历它们,以查看它们是否有效,然后构建您的查询。
<?php
$id = $_POST[id];
$field1 = $_POST[field1];
$field2 = $_POST[field2];
$field3 = $_POST[field3];

$whereArr = array();
if($id != "") $whereArr[] = "id = {$id}";
if($field1 != "") $whereArr[] = "field1 = {$field1}";
if($field2 != "") $whereArr[] = "field2 = {$field2}";
if($field3 != "") $whereArr[] = "field3 = {$field3}";

$whereStr = implode(" AND ", $whereArr);

$query = "Select * from assignments WHERE {$whereStr}";

类似这样的东西应该能满足您的需求


谢谢。所有的回答都很有帮助,但是你的解决了问题。 - andy

2
你应该从类似于你的字符串开始,直到WHERE语句,然后在用户想要搜索的所有字段中循环,并将它们添加到一个数组中,然后使用PHP函数“implode”将这些字段用AND语句作为“粘合剂”粘合在一起。现在将粘合好的字符串添加到起始查询中,完成!我会给出示例,但目前在手机上!

0

根据响应动态构建查询绝对是必须的。但另一个不错的功能是使用MySQL REGEXP查询,允许用户基于部分响应查找结果。例如,如果他们想在《壮志凌云》数据库中查找“独行侠”,则查询REGEXP = 'mav' | 'rick'将返回结果。这使您的搜索更接近用户习惯的搜索引擎功能。

这里是一个简化的REGEXP示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接