Php 在数据库中按姓氏搜索客户

Php 在数据库中按姓氏搜索客户,php,mysql,Php,Mysql,这段代码为我提供了一个客户表,其中包含用户输入到搜索字段中的姓氏。但显然,只有当你输入完整的姓氏时,它才起作用。如果我只输入姓氏的第一个字母,谁能告诉我如何更改代码以获得结果 MySQL解决方案 根据您希望匹配的工作方式,您可以执行以下操作: function search_customer($search) { global $db; $query = 'SELECT * FROM customers WHERE lastName LIKE :search';

这段代码为我提供了一个客户表,其中包含用户输入到搜索字段中的姓氏。但显然,只有当你输入完整的姓氏时,它才起作用。如果我只输入姓氏的第一个字母,谁能告诉我如何更改代码以获得结果

MySQL解决方案 根据您希望匹配的工作方式,您可以执行以下操作:

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的行:search作为子字符串。是一个可变函数,它将所有参数组合成一个字符串

$query = 'SELECT * FROM customers
              WHERE lastName 
              LIKE CONCAT("%", :search, "%" )';
工作原理 为什么百分比有用?MySQL的LIKE是一个模式匹配关键字。LIKE有两个特殊字符“%”和“389;”,分别表示“匹配0个或更多字符的任何组”和“匹配任何单个字符”

例如:

CONCAT("%", "John", "%") = "%John%"
  • “%john%”将与“johnson”、“john”或“baker johnson”匹配
  • “约翰”和“约翰”匹配,但和“约翰”不匹配
如果您只关心匹配姓氏以特定字符串开头的行,则应删除第一个“%”。这将具有更好的性能,并且如果您创建了索引,就能够使用它们

另外,如另一个答案中所述,如果需要,可以在PHP中执行这种连接。如果您想让用户选择要使用的匹配类型(例如“搜索整个字符串”与“从字符串开头搜索”),则这具有更广泛的用途

避开那些通配符! 如果您确实使用这样的构造,请确保转义like的通配符(“%”和“”),除非您希望用户能够自己使用通配符。如果允许他们使用,则应在语句中添加一个限制子句,否则可能会有人输入“%”并返回表中的每一行

如果你想逃避一些事情,你可以使用这个答案中提供的方法:

您可以轻松地将PHP与链接答案结合使用来执行转义。例如:

CONCAT("%", "John", "%") = "%John%"
您还可以更新您的函数,如-

注意:绑定值时,将
%
与搜索字符串连接起来

使用MySQL
CONCAT()
更新查询


以下是有关

的详细信息,如果,
LIKE%:search%
?它应该像@DaveChen saidIt那样工作,我没有试过,但它给我一个错误,上面写着除法zero@SelinaSchuh显示错误和更新的代码。是的,我注意到,感谢它应该是函数搜索\u客户感谢它与CONCAT的合作。CONCAT到底是什么意思?只是对php和一般的编码比较陌生,我从未见过它before@SelinaSchuh,我已经用更多信息更新了我的答案。好吧,我想第一个版本将显示一个包含数据库中所有客户的表,当我在搜索字段中输入一个字母时,它将只显示包含该字母的那些,对吗?MySQL
LIKE
子句使用字符串匹配。下面是关于
LIKE
子句@SelinaSchuh的详细信息
function SearchCustomer($search) { 
   global $db;
   $query = 'SELECT * FROM customers WHERE lastName LIKE :search';

   $statement = $db->prepare($query);
   $statement->bindValue(':search', '%'.$search.'%'); #Concatenate '%' sign with search String 
   $statement->execute(); 
   $results = $statement->fetchAll();
   $statement->closeCursor();
   return $results;
}
SELECT * FROM customers WHERE lastName LIKE CONCAT("%",:search,"%")