【发布时间】:2014-11-03 20:45:02
【问题描述】:
我尝试使用 LIKE 查询在我的小工具中实现搜索。
现在我有了这个新要求,我必须像 Android 搜索一样进行此搜索..
查询:
$stmt = $conn->prepare("SELECT ROOM, GUEST_NAME, GUEST_FIRST_NAME, CONFIRMATION_NO, DEPARTURE, PWD FROM RESERVATION_GENERAL_2 WHERE LOWER(GUEST_FIRST_NAME) LIKE ? OR LOWER(GUEST_NAME) LIKE ?");
$stmt->execute(array('%'.strtolower($searchFilter).'%','%'.strtolower($searchFilter).'%' ));
假设我在数据库中有一个字符串Syed Haider Hassan
如果我使用给定的查询在数据库表中搜索san,它将找到我上面的字符串。
因此,如果我在字符串内部或任何地方放置任何匹配的内容,它将得到这个字符串,
但我想要的是,当我在数据库中搜索 Hai 或 Has 或 Sy 它应该得到我这个字符串,但如果我搜索 san 甚至 assan,查询不应该显示我这个字符串。
意味着如果我搜索它必须使用startwith 进行搜索,而不是从中间搜索。
我认为如果我从开头删除% 可能是可能的,但问题是查询只会在 Syed 上看到 startwith,我希望它对每个单词都应用 startwith,因为单词用空格分隔。搜索SyedHaiderHassan不同..
我知道我上面试图解释的内容很混乱,主要是因为我的英语不好。 但简单来说,如果你有 Android 手机,我有 Galaxy S4,在你的通讯录中搜索任何名字。如果你从单词的中间搜索它不会搜索,但如果你从单词的开头搜索它会搜索,但事实并非如此。如果您的联系人姓名是由空格分隔的两个单词的组合 然后它还会检查第二个单词的第一个字母。
我希望我很清楚,但我不知道如何实现该查询。如果有人可以将我的查询更新为这个新的搜索条件,我将非常高兴。
========================================
更新
好的,我按照其中一个答案中的建议使用 try catch 尝试了匹配,但出现此错误。
这是我尝试过的代码。
$search_words = "+" . str_replace (" ", "* +", $searchFilter )."*";
try {
$stmt = $conn->prepare("SELECT ROOM, GUEST_NAME, GUEST_FIRST_NAME, CONFIRMATION_NO, DEPARTURE, PWD FROM RESERVATION_GENERAL_2 WHERE MATCH (GUEST_FIRST_NAME, GUEST_NAME) against (:SEARCH in boolean mode)");
$stmt->bindValue(':SEARCH', $search_words, PDO::PARAM_STR);
$stmt->execute();
}
catch(PDOException $e){
echo 'ERROR: ' . $e->getMessage();
}
有什么办法解决吗?
====================================
更新 2
好的,我只是把事实放在这里。 这是我的表结构。
如果我使用 like 和通配符 %%,它会从名字中间开始搜索。
让我们看看截图中突出显示的名称,突出显示的名称是Lukasz Henryk。
如果我使用 %enry% 之类的通配符进行搜索,它会找到我这一行。
但我不希望这样,我希望搜索应该以名称开头的单词。
例如,如果我搜索Luk 或Hen 或He 甚至H,它应该会找到我这一行。表示起始字母很重要,如果起始字母不匹配,请不要给我行。
我也尝试了类似Henr% 这样的通配符查询,但它不起作用,因为它只适用于Luk%,它将整个列视为单个字符串。
有没有办法告诉查询在空格后搜索起始字母?
请有人帮助我。
【问题讨论】:
标签: php android sql search pdo