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

时间:2017-04-03 04:12:17

标签: php 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。但它显然只有当你输入完整的姓氏时才有效。如果我只输入例如姓氏的第一个字母,那么有人能告诉我如何更改代码以获得结果吗?

2 个答案:

答案 0 :(得分:1)

MySQL解决方案

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

$query = 'SELECT * FROM customers
              WHERE lastName 
              LIKE CONCAT("%", :search, "%" )';

这将返回lastName具有的行:search as substring。 CONCAT()是一个可变函数,它将所有参数组合成一个字符串。

CONCAT("%", "John", "%") = "%John%"

如何运作

为什么百分数有用? MySQL的LIKE是模式匹配关键字。 LIKE有2个特殊字符"%"和" _"用于表示"匹配0个或更多字符的任何组"和#34;匹配任何单个字符"分别。

例如:

  • "%约翰%"会匹配" johnson"," john"或" baker-johnson"
  • " JOH _"会匹配" john",但不是" joh"

如果您只关心匹配姓氏以特定字符串开头的行,则会删除第一个"%"。如果你做的话,这将有更好的性能并能够使用索引。

另外,如另一个答案所述,如果需要,可以在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