Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
优化PHP/MySQL模糊搜索:处理多词查询与安全最佳实践_创想鸟

优化PHP/MySQL模糊搜索:处理多词查询与安全最佳实践

优化PHP/MySQL模糊搜索:处理多词查询与安全最佳实践

本文旨在解决php/mysql模糊搜索中包含空格的多词查询问题,并强调sql注入防护的重要性。我们将探讨如何利用php的`explode`函数将搜索短语拆分为多个关键词,并结合mysql的`like`子句构建更灵活的查询逻辑。核心内容将聚焦于使用php的`mysqli`预处理语句实现安全的、支持多词搜索的功能,确保数据交互的可靠性与安全性。

在开发基于PHP和MySQL的应用程序时,实现一个高效且安全的搜索功能是常见的需求。然而,当用户输入的搜索关键词包含空格(即多词查询)时,传统的CONCAT_WS结合单个LIKE子句的方法往往无法产生预期结果。例如,搜索“test 2”可能无法找到“test”在某一列,“2”在另一列的记录,而搜索“test2”或“2test”却能成功。此外,直接将用户输入拼接到SQL查询字符串中会引入严重的安全漏洞——SQL注入。本教程将详细介绍如何解决这些问题,构建一个既能处理多词查询又具备SQL注入防护能力的搜索功能。

1. 理解传统模糊搜索的局限性

原始代码中使用的CONCAT_WS函数将多个列的内容连接成一个字符串,然后使用LIKE ‘%”.$valueToSearch.”%’进行模糊匹配。

SELECT * FROM `master` WHERE CONCAT_WS(`id`, `office`, `firstName`, ...) LIKE '%".$valueToSearch."%'

这种方法的问题在于:

空格处理不当: 当$valueToSearch为“test 2”时,它会尝试在连接后的字符串中查找“test 2”这个完整的短语。如果“test”和“2”分别位于不同的列,或者它们之间没有空格(在CONCAT_WS连接后),则无法匹配。例如,CONCAT_WS(‘test’, ‘2’)的结果是test2,而不是test 2。SQL注入风险: 最严重的问题是,$valueToSearch直接通过字符串拼接的方式嵌入到SQL查询中。恶意用户可以构造特殊的输入,从而改变查询的意图,导致数据泄露、篡改甚至删除。

2. 解决多词查询:利用PHP explode 和 SQL LIKE

为了正确处理包含空格的多词查询,我们需要将用户输入的搜索短语拆分成独立的关键词,然后为每个关键词构建单独的LIKE条件。

立即学习“PHP免费学习笔记(深入)”;

核心思路:

使用PHP的explode()函数将用户输入的搜索字符串按空格分割成一个关键词数组。遍历关键词数组,为每个关键词在目标列中生成LIKE ‘%关键词%’的条件。将这些条件组合起来,通常使用AND逻辑(表示所有关键词都必须匹配)或OR逻辑(表示任意关键词匹配即可)。对于本场景,通常希望所有关键词都能在某个列中找到,所以AND逻辑更符合预期。

示例:构建动态 WHERE 子句

假设搜索词是“John Doe”,我们希望在firstName和lastName列中查找。

explode(‘ ‘, “John Doe”) 会得到 [‘John’, ‘Doe’]。生成的SQL条件可能类似于:WHERE (firstName LIKE ‘%John%’ OR lastName LIKE ‘%John%’) AND (firstName LIKE ‘%Doe%’ OR lastName LIKE ‘%Doe%’)

3. 实施SQL注入防护:使用预处理语句(Prepared Statements)

在构建动态SQL查询时,防止SQL注入是至关重要的。PHP的mysqli扩展提供了预处理语句(Prepared Statements)功能,可以有效隔离SQL代码和用户输入的数据。

预处理语句的工作原理:

准备(Prepare): 将带有占位符(?)的SQL模板发送到数据库服务器。绑定参数(Bind Parameters): 将用户输入的数据绑定到占位符上,数据库服务器会将其视为纯数据,而不是可执行的SQL代码。执行(Execute): 执行预处理好的语句。

通过这种方式,即使$valueToSearch包含恶意SQL代码,数据库也会将其作为普通字符串进行匹配,而不是执行它。

4. 完整的安全多词搜索实现

下面是结合了多词查询处理和SQL注入防护的PHP/MySQLi代码示例:

<?php/** * 安全地执行SQL查询,支持多词模糊搜索和SQL注入防护。 * * @param string $valueToSearch 用户输入的搜索字符串。 * @return mysqli_result|false 查询结果集或失败时返回false。 */function filterTableSecure($valueToSearch) {    // 数据库连接参数,请替换为您的实际凭据    $db_host = "localhost";    $db_user = "your_db_user";     // 请替换为您的数据库用户名    $db_pass = "your_db_password"; // 请替换为您的数据库密码    $db_name = "your_db_name";     // 请替换为您的数据库名称    $connect = mysqli_connect($db_host, $db_user, $db_pass, $db_name);    if (!$connect) {        die("数据库连接失败: " . mysqli_connect_error());    }    // 定义需要搜索的列    $columnsToSearch = [        'id', 'office', 'firstName', 'lastName', 'type', 'status',        'deadline', 'contactPref', 'email', 'phoneNumber', 'taxPro'    ];    // 分割搜索词,并过滤掉空字符串    $searchWords = array_filter(explode(' ', $valueToSearch));    $globalConditions = []; // 存储每个搜索词的条件组 (e.g., (col1 LIKE ? OR col2 LIKE ?))    $paramTypes = '';       // 存储参数类型字符串 (e.g., 'sss')    $params = [];           // 存储绑定参数的数组 (e.g., ['%word1%', '%word1%', '%word2%'])    if (!empty($searchWords)) {        foreach ($searchWords as $word) {            $wordConditions = []; // 存储当前搜索词在所有列中的 OR 条件            foreach ($columnsToSearch as $column) {                $wordConditions[] = "`" . $column . "` LIKE ?"; // 使用占位符                $paramTypes .= 's'; // 绑定字符串类型参数                $params[] = '%' . $word . '%'; // 模糊匹配参数            }            // 将当前搜索词的所有列条件用 OR 组合,并用括号括起来            $globalConditions[] = '(' . implode(' OR ', $wordConditions) . ')';        }    }    // 构建基础查询语句    $query = "SELECT * FROM `master`";    if (!empty($globalConditions)) {        // 如果有搜索词,则将所有搜索词的条件组用 AND 组合起来        $query .= " WHERE " . implode(' AND ', $globalConditions);    }    // 准备预处理语句    $stmt = mysqli_prepare($connect, $query);    if (!$stmt) {        die("预处理语句准备失败: " . mysqli_error($connect));    }    // 动态绑定参数    if (!empty($params)) {        // mysqli_stmt_bind_param 需要参数以引用方式传递,因此需要特殊处理        // 创建一个包含参数类型字符串和所有参数的数组        $bind_names[] = $paramTypes;        for ($i = 0; $i             PHP HTML TABLE DATA SEARCH                    table,tr,th,td            {                border: 1px solid black;                border-collapse: collapse; /* 使边框合并,美观 */                padding: 8px;            }            th {                background-color: #f2f2f2;            }                                     



0): while($row = mysqli_fetch_array($search_result, MYSQLI_

以上就是优化PHP/MySQL模糊搜索:处理多词查询与安全最佳实践的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1335493.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
webstorm怎么用php_WebStorm开发工具PHP环境配置与使用方法
上一篇 2025年12月12日 21:17:37
Laravel MPDF:从多个 Blade 视图生成多页 PDF 文档教程
下一篇 2025年12月12日 21:17:57

相关推荐

  • VSCode搭建RISC-V开发环境(结合FPGA,嵌入式开发指南)

    首先安装RISC-V GCC工具链并配置环境变量,接着在VSCode中安装C/C++和RISC-V GDB扩展,然后配置launch.json实现调试,结合OpenOCD支持FPGA JTAG调试,使用Makefile管理编译,选择稳定工具链版本,通过命令行测试GDB连接排查问题,利用ILA和仿真工…

    2026年9月22日
    200
  • 瑞达写作官方网站登录端 瑞达写作App官方使用入口

    瑞达写作官方登录入口为https://ipapers.net,该平台支持论文初稿快速生成、多学科适配、智能修改及问卷报告自动化,集成国标引文与权威数据源,提供图表、代码等多元内容生成服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 瑞达…

    2026年9月22日
    000
  • VSCode设置SSH远程开发(安全连接,跨平台开发指南)

    vscode的ssh远程开发功能通过ssh协议实现本地编辑器与远程服务器的安全连接,让用户能在本地直接操作远程代码,享受与本地一致的开发体验。首先需安装“remote – ssh”扩展并配置~/.ssh/config文件,定义host、hostname、user、port和identit…

    2026年9月22日
    000
  • Symfony 测试中设置请求内容:模拟 API 用户注册

    在 Symfony 单元测试中模拟 API 请求,特别是针对用户注册场景,重点讲解如何设置包含特定 Header(如 x-auth-token)以及 Form-Data 格式的请求体,并提供示例代码和注意事项,帮助开发者编写更可靠的 API 测试。 在 Symfony 中进行单元测试时,经常需要模拟…

    2026年9月22日
    000
  • Apache POI生成带水印DOCX文件时的XML内容错误解析与应对

    本文深入探讨了使用Apache POI生成带有水印的DOCX文件时,可能遇到的“XML声明只能出现在输入开头”错误。该错误通常指向DOCX内部XML文件(如header4.xml)的格式问题,导致文件在Microsoft Word中无法打开。文章分析了错误原因,并提供了包括升级POI版本、手动检查D…

    2026年9月22日
    000
  • AdobePremierePro的AI混合工具怎么用?简化视频编辑的实用方法

    Adobe Premiere Pro的AI混合工具通过变形剪辑、重混音、自动重构图和颜色匹配等功能,显著提升剪辑效率。变形剪辑智能平滑跳剪,使转场更自然;重混音自动调整音乐长度,适配视频节奏;自动重构图利用AI跟踪主体,快速适配多平台比例;颜色匹配则快速统一多素材色彩基调。这些AI功能虽非万能,但在…

    2026年9月22日
    100
  • 爱应用pc版官方网址入口 爱应用pc版平台访问官网直达链接

    爱应用PC版官方网址是https://www.aiyingyong.com,该平台提供Win10应用推荐、游戏中心及软件下载服务,设有每日精品、分类合集、专题评测等功能板块,并支持用户互动交流与资源更新。 爱应用pc版官方网址入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来爱应用pc版…

    2026年9月22日
    000
  • MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位

    MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位

    mysql性能瓶颈定位与分析需从慢查询日志、执行计划、实时监控等多维度入手。1. 开启慢查询日志,设置slow_query_log=1、指定日志路径及阈值long_query_time,通过mysqldumpslow分析日志找出最慢sql;2. 使用explain命令查看sql执行计划,重点关注ty…

    2026年9月22日 • 用户投稿
    300
  • if sql语句_SQL IF语句介绍和概述

    if sql语句_SQL IF语句介绍和概述if sql语句_SQL IF语句介绍和概述if sql语句_SQL IF语句介绍和概述if sql语句_SQL IF语句介绍和概述

    大家好,又见面了,我是你们的朋友全栈君。 本文将深入探讨SQL Server中实用的SQL IF语句功能。 介绍 (Introduction) 在现实生活中,我们根据条件做出决定。例如,以下情况: 如果我今年获得绩效奖金,我将选择国际度假,否则我将选择国内度假。如果天气变好,我会计划骑自行车旅行,否…

    2026年9月22日 • 用户投稿
    000
  • 配置PHP多线程的性能监控_通过监控优化php多线程怎么实现的效率

    PHP虽不支持传统多线程,但可通过pthreads扩展在CLI模式下实现;合理设置线程数、使用线程池、集成性能监控工具并优化任务分配可显著提升执行效率。 PHP 本身并不支持传统意义上的多线程,因为它默认运行在 Web 服务器(如 Apache 或 Nginx)的 CGI/FPM 模式下,每个请求是…

    2026年9月22日
    300
  • VSCode连接Modelsim仿真工具(调试技巧分享,波形分析指南)

    首先确保Modelsim路径加入系统PATH,安装VSCode的HDL扩展,配置tasks.json定义编译、仿真任务,并编写Tcl脚本自动化add wave、run等操作,通过问题匹配器解析错误,利用Tcl实现参数化仿真与自动化测试,结合Makefile或脚本提升大型项目管理效率。 将VSCode…

    2026年9月22日
    400
  • Invideo的AI混合工具怎么用?快速生成专业视频的实用教程

    Invideo的AI混合工具通过智能生成视频初稿并允许创作者精细调整,显著降低制作门槛、提升效率,其优势在于快速生成、易用性强、激发创意,用户可通过优化输入、替换素材、注入个性声音和保持风格统一来最大化潜力,同时需应对素材模式化、理解偏差等挑战。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索,…

    2026年9月22日
    500
  • Java并发编程中Runnable接口使用方法

    Runnable接口用于定义线程任务,通过实现run()方法封装执行逻辑,不返回结果且不能抛出受检异常;可直接传给Thread实例启动线程,也可用Lambda表达式简化代码;推荐结合ExecutorService线程池使用,提升资源利用率;需注意无返回值、异常处理在内部完成、共享变量线程安全等问题。…

    2026年9月22日
    100
  • MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?

    MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?

    存储过程在 mysql 中用于封装业务逻辑,提升复用性并减少网络传输。它是一组预定义的 sql 语句集合,通过参数调用实现功能,如查询订单及计算消费总额。其优点包括提高执行效率、统一数据操作逻辑、增强安全性和便于维护。例如,输入客户 id 即可返回订单信息与总消费金额。优化方式有:1. 使用 out…

    2026年9月22日 • 用户投稿
    200
  • ChatExcel进行数据分类_ChatExcel数据自动分类与标签管理

    答案:通过内置规则、AI智能打标、多维度交叉分类及手动修正四步实现ChatExcel自动分类与标签管理。首先设定字段匹配规则自动归类数据;其次启用智能打标功能分析文本生成语义标签;再通过组合多个属性构建交叉分类矩阵实现精细化管理;最后支持人工干预修正异常项并同步更新数据库,提升分类准确性与管理效率。…

    2026年9月22日
    000
  • VSCode配置C++项目环境 新手必看VSCode搭建C++教程

    答案:在VSCode中配置C++环境需安装MinGW-w64编译器并将其路径加入系统环境变量,安装VSCode的C/C++扩展以支持代码补全和调试,通过tasks.json配置编译任务,指定g++路径及编译参数,再通过launch.json配置调试任务,设置gdb调试器路径和程序输出路径,确保头文件…

    2026年9月22日
    200
  • 如何使用DeepSpeed训练AI大模型?大规模模型训练的优化技巧

    DeepSpeed通过ZeRO等技术突破显存限制,实现大模型高效训练。它采用ZeRO-1/2/3分级优化,分别对优化器状态、梯度和参数进行分区,显著降低单卡显存占用;结合混合精度、梯度累积和CPU/NVMe卸载进一步节省资源。同时集成流水线并行与张量并行,支持多维并行策略协同,使万亿参数模型训练在普…

    2026年9月22日
    100
  • Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围

    Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围

    在sublime中实现数据权限控制模块的核心在于根据用户角色动态拼接sql语句,具体步骤如下:1. 建立角色表、用户表和权限规则表,明确角色与数据的对应关系;2. 用户登录后获取其角色id,并查询该角色可访问的数据范围;3. 根据权限动态构建sql查询条件,限制访问范围;4. 使用python等语言…

    2026年9月22日 • 用户投稿
    200
  • PHP 表单验证:确保 HTML select 下拉菜单已正确选择非默认选项

    本文将详细介绍如何在 PHP 后端对 HTML select 下拉菜单进行有效验证,确保用户选择了非默认选项。我们将探讨常见的验证误区,并提供一个简洁高效的解决方案,通过检查 $_POST 数据来判断用户是否已做出有效选择,从而避免表单提交无效数据,提升用户体验和数据准确性。 在构建 web 表单时…

    2026年9月22日
    200
  • win10无法弹出U盘怎么办_win10U盘无法弹出解决方法

    若U盘无法安全移除,首先关闭相关程序,检查任务管理器结束占用进程,清空剪贴板,重启Windows资源管理器,使用handle.exe命令行工具查找并终止占用进程,最后可修改U盘策略为快速删除模式以避免后续问题。 如果您尝试从Windows 10系统中安全移除U盘,但系统提示“设备正在使用”或无法完成…

    2026年9月22日
    100

发表回复

登录后才能评论
关注微信
ID Office First Name Last Name Type Status Deadline Contact Preference Email Phone Number Tax Pro