php mysql按首字母搜索

php mysql按首字母搜索,php,mysql,search,Php,Mysql,Search,我在mysql数据库中有一个成员目录。我希望用户能够通过名字或姓氏的首字母进行搜索。我目前的代码允许按首字母搜索,但会显示任何包含字母的名称,不管它是否是第一个字母。如何将其设置为仅当威瑟名称的第一个字母与所选字母匹配时返回 $sql="SELECT ID, FirstName, LastName FROM stafftest WHERE FirstName LIKE '%" . $letter . "%' OR LastName LIKE '%" . $letter ."%'"; 我所做的就

我在mysql数据库中有一个成员目录。我希望用户能够通过名字或姓氏的首字母进行搜索。我目前的代码允许按首字母搜索,但会显示任何包含字母的名称,不管它是否是第一个字母。如何将其设置为仅当威瑟名称的第一个字母与所选字母匹配时返回

$sql="SELECT ID, FirstName, LastName FROM stafftest WHERE FirstName LIKE '%" . $letter . "%' OR LastName LIKE '%" . $letter ."%'";
我所做的就是删除第一个%符号。百分号告诉类似mysql的语句匹配任何字符。因此,实际上,您告诉它:‘匹配任何字符(包括起始字符和结束字符),然后找到字母L,然后匹配任何字符。’。最后将此更改为仅使用1%将解决您的问题

此外,如果可以,最好使用准备好的语句。PDO在这方面很方便

我所做的就是删除第一个%符号。百分号告诉类似mysql的语句匹配任何字符。因此,实际上,您告诉它:‘匹配任何字符(包括起始字符和结束字符),然后找到字母L,然后匹配任何字符。’。最后将此更改为仅使用1%将解决您的问题


此外,如果可以,最好使用准备好的语句。PDO很方便。

这将搜索谁的名字或姓氏
$letter
开头

"SELECT ID, FirstName, LastName FROM stafftest 
 WHERE FirstName REGEXP '^".$letter."' OR 
       LastName REGEXP '^".$letter."'";


快乐2帮助:)

这将搜索以
$letter

"SELECT ID, FirstName, LastName FROM stafftest 
 WHERE FirstName REGEXP '^".$letter."' OR 
       LastName REGEXP '^".$letter."'";


快乐2帮助:)

正如其他人所提到的,只需对字符串的结尾进行通配符即可。为了避免潜在的SQL注入,请在绑定变量中使用它

/* $db_connection is assumed to be a mysqli connection resource */

$query = $db_connection->prepare('SELECT ID, 
                                         FirstName, 
                                         LastName 
                                  FROM   stafftest 
                                  WHERE  FirstName LIKE ? 
                                  OR     LastName LIKE ?');
$search = $letter . '%';
$query->bind_param('s', $search);
$query->execute();

注意:您需要构造一个带有通配符字符串的PHP变量,并将其绑定,而不是将通配符放在查询中的占位符周围。

正如其他人所提到的,您只需对字符串的末尾进行通配符即可。为了避免潜在的SQL注入,请在绑定变量中使用它

/* $db_connection is assumed to be a mysqli connection resource */

$query = $db_connection->prepare('SELECT ID, 
                                         FirstName, 
                                         LastName 
                                  FROM   stafftest 
                                  WHERE  FirstName LIKE ? 
                                  OR     LastName LIKE ?');
$search = $letter . '%';
$query->bind_param('s', $search);
$query->execute();

注意:您需要构造一个带有通配符字符串的PHP变量,并将其绑定,而不是将通配符放在查询中的占位符周围。

FirstName LIKE'.$letter.%'
FirstName LIKE'.$letter.%'
我收到一个错误,原因是:意外;在线或姓氏上。我还注意到selectid之前有一个打开的括号,但没有关闭它。你的答案有点让我摸不着头脑,所以我试着把它分解一下,但是当试图上传带有此代码的文件时,浏览器拒绝了语法。我遗漏了什么?啊,遗漏了最后一个括号。修正了。您是否尝试完全省略
部分?(只是稍微简化一下)好了,现在页面加载正确,但尝试按任何字母搜索都会返回此错误:搜索联系人:您可以按名字或姓氏a | B | C | D | E | F | G | H | I | K | L | M | N | O | P | Q | R | S | T | U | V | W | X |准备一个致命错误函数在第120行/home/troop97/public_html/oabtest.php中的非对象上:$query=$db_connection->prepare('SELECT ID,FirstName,LastName FROM stafftest WHERE FirstName LIKE?或LastName LIKE?');您是否使用或?您需要使用后者才能准备语句(即,您需要使用
$db\u connection=new mysqli($host,$user,$password,$db)创建数据库连接;
)我收到一个错误:意外;在第行或姓氏上。我还注意到在选择ID之前有一个左括号,但没有关闭它。您的答案有点让我费解,所以我尝试将其分解一下,但在尝试上载带有此代码的文件时,浏览器拒绝了语法。我缺少什么?啊,缺少一个右括号.解决了这个问题。您是否尝试过完全省略
部分?(只是为了简化一下)好的,现在页面加载正确,但尝试按任何字母搜索都会返回以下错误:搜索联系人:您可以按名字或姓氏A | B | C | D | E | F | G | H | I | K | L | M | N | O | P | Q | R | S | T | U | V | W | X |准备一个致命错误函数()在第120行/home/troop97/public_html/oabtest.php中的非对象上:$query=$db_connection->prepare('SELECT ID,FirstName,LastName FROM stafftest WHERE FirstName LIKE?或LastName LIKE?');您是否使用或?您需要使用后者才能准备语句(即,您需要通过使用
$db\u connection=new mysqli($host,$user,$password,$db);
)来创建数据库连接。如果索引可用,这是否会阻止使用索引?我的想法是,您必须运行一些函数(在本例中,正则表达式解析)在每个值上,从而使索引无效。如果索引可用,这难道不会阻止使用索引吗?我的想法是,您必须在每个值上运行一些函数(在本例中,正则表达式解析),从而使索引无效。没有问题;)如果你有机会,考虑将你现在使用的任何数据库类/函数抽象出来,并建立一个包装类。当然,你可以尝试PDO和MySQL之类的东西,甚至可以滚动你自己准备好的报表帮助器。如果你有机会,考虑把你现在使用的任何数据库类/函数抽象出来,并建立一个包装类。当然,你可以尝试PDO和MyQuLi之类的东西,甚至滚动你的。