function search_customer($search) {
global $db;
$query = 'SELECT * FROM customers WHERE lastName LIKE :search';
$statement = $db->prepare($query);
$statement->bindValue(':search', $search);
$statement->execute();
$results = $statement->fetchAll();
$statement->closeCursor();
return $results;
}
此代码为我提供了一个客户表,其中包含用户放入搜索字段的lastName。但它显然只有当你输入完整的姓氏时才有效。如果我只输入例如姓氏的第一个字母,那么有人能告诉我如何更改代码以获得结果吗?
答案 0 :(得分:1)
根据您希望匹配的工作方式,您可以执行以下操作:
$query = 'SELECT * FROM customers
WHERE lastName
LIKE CONCAT("%", :search, "%" )';
这将返回lastName具有的行:search as substring。 CONCAT()是一个可变函数,它将所有参数组合成一个字符串。
CONCAT("%", "John", "%") = "%John%"
为什么百分数有用? MySQL的LIKE是模式匹配关键字。 LIKE有2个特殊字符"%"和" _"用于表示"匹配0个或更多字符的任何组"和#34;匹配任何单个字符"分别。
例如:
如果您只关心匹配姓氏以特定字符串开头的行,则会删除第一个"%"。如果你做的话,这将有更好的性能并能够使用索引。
另外,如另一个答案所述,如果需要,可以在PHP中执行此连接。如果你想让你的用户选择要使用的匹配类型(例如"搜索整个字符串" vs."从字符串的开头搜索"),这具有更多功能的好处。 / p>
如果你确实使用这样的结构,请务必逃避LIKE的通配符("%"和#34; _"),除非你希望你的用户成为能够自己使用通配符。如果你让他们使用它们你应该在你的陈述中添加一个LIMIT条款,否则你就冒着某人进入"%"并返回表格中的每一行。
如果你想逃避事情你可以使用这个答案中提供的方法: https://stackoverflow.com/a/5020292
您可以轻松使用PHP的str_replace()结合链接的答案来执行转义。例如:
function search_customer($search) {
global $db;
$query = 'SELECT * FROM customers
WHERE lastName
LIKE CONCAT("%", :search, "%" ) ESCAPE "|"';
$escapedSearch = str_replace($search, ["%","_"], ["|%","|_"]);
$statement = $db->prepare($query);
$statement->bindValue(':search', $escapedSearch);
$statement->execute();
$results = $statement->fetchAll();
$statement->closeCursor();
return $results;
}
答案 1 :(得分:1)



你也可以更新你的功能,如 -


function SearchCustomer($ search){
全球$ db;
 $ query ='SELECT * FROM customers WHERE lastName LIKE:search';

 $ statement = $ db-> prepare($ query);
 $ statement-> bindValue(':search','%'。$ search。'%'); #Concatenate'%'用搜索字符串
 $陈述式>执行(); 
 $ results = $ statement-> fetchAll();
 $陈述式> closeCursor();
返回$ results;
}



 注意:连接%
使用搜索字符串进行签名,绑定值
OR





使用MySQL

CONCAT()
更新您的查询
SELECT * FROM customers WHERE lastName LIKE CONCAT(“%”,:search,“%”)



 以下是 MySQL CONCAT