【发布时间】:2013-04-14 09:45:27
【问题描述】:
我在使用 AJAX 和 PHP 创建多字段实时搜索引擎时遇到问题。
到目前为止,不需要搜索多个字段,所以我有一个简单的查询,只适用于一个字段。
由于使用onkeyup 函数进行实时搜索,我发现了一些问题。我需要解释的第一个问题:
表格的结构很简单:zipcode | city
比如有人输入12345;当然,这将是邮政编码。但是如果有人输入12345 hometown,那么第一个关键字是邮政编码,第二个是城市怎么办?
关键字将使用preg_split('/[\s]+/', $search_term) 进行拆分,因此我收到一个数组,其中包含将要搜索的单个关键字。在上述情况下,它将是:key[0] => 12345 和 key[1] => hometown。
我使用的查询是这样的:
$where = "";
$search_term = preg_split('/[\s]+/', $search_term); //splits the whole string into single keywords
$total_search_terms = count($search_term); //counts the array-keys from $search_term
foreach ($search_term as $key=>$single_term) {
$where .= "`zipcode` LIKE '$single_term%' OR `city` LIKE '$single_term%' ";
if ($key != ($total_search_terms - 1)){ //adds AND to the query in case in case of a non empty array-key
$where .= " AND ";
}
}
$query = $db->query("SELECT COUNT(*) FROM table WHERE $where");
...
好的,到目前为止一切顺利。现在的问题是关键字可以一次又一次地匹配每个字段。
再举个例子:
如果从上面输入12345 hometown,则意味着key[0] => 12345可以匹配字段zipcode或city。此条件与key[1] => hometown 相同,即使这也可以匹配字段zipcode 或city。所以,即使输入其他方式:hometown 12345 也一样。
这是我遇到的第一个问题。
我正在寻找一种逻辑来构建查询。所以如果输入12345 hometown,我想要这样的东西:
当key[0] => 12345 匹配字段zipcode 时,不要检查key[1] => hometown 是否匹配zipcode 或city,因为key[0] 已经匹配zipcode,所以key[1] 需要匹配是很合乎逻辑的是city。
更新
好的,说我的第二个问题,我想让你看看david strachan的答案
他提到当城市包含多个字符串时会引起问题。假设搜索字符串类似于:
12345 New York
关键是:
key[0] => 12345, key[1] => New, key[2] => York
好的,现在的问题是我可以检查其中一个键是否包含整数,如果字符串长度正好为 5,我知道它将是邮政编码。
key[0] => 12345 //if ( stringlen(key[0|) === 5) === true && is_int(key[0]) === true) {zipcode}
到目前为止一切都很好,但真正的问题是城市字符串背后的逻辑。我的第一个想法是我可以说所有不包含整数的键都必须是城市,这样我就可以将它们转换为一个键。
key[1] => New, key[2] => York //if ( !is_int(key[1|) === true && !is_int(key[2|) === true) {$create_one_key = array_fill_keys(key[1], key[1]+key[2]);}
好的,但是如果我以后想添加街道名称怎么办?我不知道如何区分和测试街道名称,甚至城市名称。
【问题讨论】:
-
when key[0] => 12345 matches field zipcode dont check key[1] => hometown if that matches in zipcode OR city because key[0] matches already in zipcode so it's quiet logical that key[1] needs to be city.你为什么要这么做?我猜是出于优化目的? -
您好。浏览您的问题,我注意到它们都是用小写字母写的。你的英文好像不错,能麻烦你用首字母大写吗?有时人们会花时间解决您的问题以使其更具可读性,这样您就可以节省一些时间!
-
@halfer。好的,谢谢这个提示。我会记住这一点,以备将来之用。谢谢。
-
@Ejay 我想要这样,因为我遇到了第二个问题。我将更新我的问题以提供有关此的更多信息。谢谢
-
我猜你已经把城市名称和街道名称复杂化了。让用户输入逗号分隔的地址将解决很多您的问题,例如,邮政编码、城市、街道名称。或者如果你可以使用多个输入框更好
标签: php html mysql arrays logic