PHP模糊查询

本文详细介绍了SQL匹配模式与正则表达式的使用方法,包括使用LIKE、NOTLIKE、%、_等通配符进行匹配,以及在MySQL中实现匹配模式的技巧。同时,还展示了如何通过SQL匹配模式和正则表达式查询特定格式的用户名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式查询
1. SQL匹配模式
2. 正则表达式匹配模式(一般不推荐使用)

SQL匹配模式

1.使用sql匹配模式,不能使用操作符=或!=,而是使用操作符LIKE或NOT LIKE;
2.使用sql匹配模式,MYSQL提供了2种通配符。
%表示任意数量的任意字符(其中包括0个)
_表示任意单个字符
3.使用sql匹配模式,如果匹配格式中不包含以上2种通配符中的任意一个,其查询的效果等同于=或!=
4.使用sql匹配模式,匹配时,不区分大小写

#查询用户名以某个字符开头的用户
#查询用户名以字符'l'开头的用户: l%
SELECT * FROM user WHERE username LIKE 'l%';
#查询用户名以某个字符结尾的用户
#查询用户名以字符'e'结尾的用户:e%
SELECT * FROM user WHERE username LIKE 'e%';
#查询用户名包含某个字符的用户
#查询用户名包含字符'o'的用户:%o%
SELECT * FROM user WHERE username LIKE '%o%';
#查询包含三个字符的用户
SELECT * FROM user WHERE username LIKE '___';
#查询用户名第二个字符为o的用户:_o%
SELECT * FROM user WHERE username LIKE '_o%';

正则表达式匹配模式

通配符(正则表达式)
.匹配任意的单个字符
*匹配0个或多个在它前面的字符
x*表示匹配任何数量的x字符
    [..]匹配中括号中的任意字符
    [abc]匹配字符ab或c
    [a-z]匹配任意字母
    [0-9]匹配任意数字
    [0-9]*匹配任意数量的任何数字
    [a-z]*匹配任何数量的字母

^表示以某个字符或字符串开始
    ^a 表示以字母a开头
$表示以某个字符或字符串结尾
    s$表示以字母s结尾
使用正则表达式匹配模式使用的操作符是:
REGEXP 或 NOT REGEXP(RLIKE 或 NOT RLIKE)
注意:正则表达式匹配模式,其正则表达式出现在匹配字段的任意位置,
其模式就算匹配了,不必在两侧放一个通配符来使得其匹配;

如果仅用通配符 . 来匹配,假设N个,那么其匹配模式表示,大于等于N个;
怎么理解上面这句话呢?
就是说 
...   匹配大于等于3个字符的数据
....  匹配大于等于4个字符的数据
#查询用户名以字符 l开头的用户:^l;
#正则表达式写法
SELECT * FROM user WHERE username REGEXP '^l';
#sql匹配模式写法:
SELECT * FROM user WHERE username LIKE 'l%';
#查询用户名正好是三个字符的用户:^...$;
#sql匹配模式写法:
SELECT * FROM user WHERE username LIKE '___';
#正则表达式写法
SELECT * FROM user WHERE username REGEXP '^...$';
### PHP 中实现模糊查询的方法 在 PHP 开发中,模糊查询是一种常见的需求,通常用于搜索引擎、数据筛选等功能。以下是基于 SQL 查询语句 `LIKE` 的方式来实现模糊查询的具体方法。 #### 使用 LIKE 运算符 SQL 提供了 `LIKE` 关键字来进行模式匹配操作,这可以用来执行简单的模糊查询。通过 `%` 和 `_` 两个通配符,可以在字符串中进行部分匹配[^1]。其中: - `%` 表示零个或多个字符。 - `_` 表示单个字符。 下面是一个基本的 PHP 模糊查询示例: ```php <?php // 假设用户输入的关键字为 $keyword $keyword = $_GET['search']; // 防止 SQL 注入攻击,使用 PDO 或 MySQLi 准备好的语句 $stmt = $pdo->prepare("SELECT * FROM table_name WHERE column_name LIKE :pattern"); $pattern = '%' . htmlspecialchars($keyword) . '%'; // 添加 % 符号以支持前后匹配 $stmt->bindParam(':pattern', $pattern); $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "<p>" . htmlspecialchars($row['title']) . "</p>"; } ?> ``` 上述代码展示了如何接收用户的搜索关键字并将其嵌入到 SQL 查询中的过程。为了提高安全性,推荐使用参数化查询或者准备好的语句 (Prepared Statements)[^2] 来防止潜在的安全风险如 SQL 注入。 #### 多条件模糊查询 如果需要同时满足多个关键词,则可以通过组合多个 `LIKE` 子句完成多字段或多值的复杂查询。例如: ```sql WHERE field1 LIKE '%value%' OR field2 LIKE '%value%' AND field3 LIKE '%another_value%' ``` 对于更复杂的场景,比如处理数组形式传来的多个标签 ID 列表时,也可以采用如下逻辑构建动态 SQL 字符串[^4]: ```php <?php $searchTerms = ['term1', 'term2']; $queryParts = []; $params = []; foreach ($searchTerms as $key => $term) { $queryParts[] = "(column_name LIKE :param_$key)"; $params[":param_$key"] = "%" . htmlspecialchars($term) . "%"; } $sql = "SELECT * FROM table_name WHERE " . implode(' AND ', $queryParts); $stmt = $pdo->prepare($sql); foreach ($params as $placeholder => $value) { $stmt->bindValue($placeholder, $value); } $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> ``` 此脚本会生成一条带有若干子句连接而成的新查询命令,并绑定相应的变量值给占位符位置从而避免注入漏洞的发生。 #### 结合实际应用案例分析 在一个典型的员工管理系统里,可能希望允许管理员按姓名拼音首字母或其他属性快速定位特定记录条目。此时就可以运用前面提到的技术手段轻松达成目标[^3] 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值