讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 PHP 中安全、准确地按产品 ID 筛选并显示记录

阿磊同学_9500

阿磊同学_9500

发布时间:2026-10-15 09:20:00

|

817人浏览过

|

来源于php中文网

原创

如何在 PHP 中安全、准确地按产品 ID 筛选并显示记录

本文详解如何在 PHP 数据查询中正确添加 product_id 条件(如仅显示 ID=100 的产品),重点解决因 SQL 逻辑运算符优先级导致的条件失效问题,并提供防注入的安全实践方案。

本文详解如何在 php 数据查询中正确添加 product_id 条件(如仅显示 id=100 的产品),重点解决因 sql 逻辑运算符优先级导致的条件失效问题,并提供防注入的安全实践方案。

在动态构建 SQL 查询时,若需同时满足“指定 product_id”和“模糊匹配搜索关键词”(例如:只查 product_id = 100 且姓名或产品名含某关键词的记录),必须严格注意 AND/OR 的逻辑分组。你原始尝试失败的根本原因在于未用括号明确优先级,导致 SQL 实际执行为:

WHERE product_id = "100" AND first_name LIKE "%xxx%" 
   OR last_name LIKE "%xxx%" 
   OR product_name LIKE "%xxx%"

该语句等价于:
✅ (product_id = "100" AND first_name LIKE "%xxx%")
❌ OR last_name LIKE "%xxx%"(无论 product_id 是否为 100,只要 last_name 匹配就返回)
❌ OR product_name LIKE "%xxx%"(同上)

因此结果包含大量无关记录。

✅ 正确写法:用括号包裹完整搜索逻辑

若目标是「限定 product_id = 100,且在该产品范围内再做姓名/产品名的模糊搜索」,应将所有 LIKE 条件用括号合并,并与 product_id 条件用 AND 连接:

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
$product_id = '100';

// ✅ 正确:先限定 product_id,再对字段做 OR 搜索(整体作为子条件)
$sql_query .= " WHERE product_id = ? AND (";
$sql_query .= "    first_name LIKE ? OR ";
$sql_query .= "    last_name LIKE ? OR ";
$sql_query .= "    product_name LIKE ? ";
$sql_query .= ")";

// 后续绑定参数(见下文安全方案)

⚠️ 关键警告:当前代码存在严重 SQL 注入风险!

你使用的字符串拼接方式(如 "'.$search_value.'")极易被恶意输入利用,例如传入 ' OR '1'='1 将导致全表泄露。生产环境必须弃用拼接,改用预处理语句(Prepared Statements)。

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

✅ 推荐安全实现(PDO + 预处理)

$sql_query = "SELECT * FROM my_products ";

$params = [];
$conditions = [];

// 1. 固定 product_id 条件(可选:从 URL 或 POST 获取)
if (!empty($_POST['product_id'])) {
    $product_id = (int)$_POST['product_id']; // 强制整型,更安全
    $conditions[] = "product_id = ?";
    $params[] = $product_id;
}

// 2. 搜索条件(如果提供了搜索值)
if (!empty($_POST['search']['value'])) {
    $search_value = '%' . trim(strip_tags($_POST['search']['value'])) . '%';
    $conditions[] = "(first_name LIKE ? OR last_name LIKE ? OR product_name LIKE ?)";
    $params[] = $search_value;
    $params[] = $search_value;
    $params[] = $search_value;
}

// 构建 WHERE 子句
if (!empty($conditions)) {
    $sql_query .= " WHERE " . implode(' AND ', $conditions);
}

// 3. 排序(同样需校验列名白名单,防止注入)
$order_columns = ['id', 'first_name', 'last_name', 'product_name']; // 白名单
$order_column = in_array($_POST['order'][0]['column'] ?? '', $order_columns) 
    ? $_POST['order'][0]['column'] 
    : 'id';
$order_dir = in_array($_POST['order'][0]['dir'] ?? 'DESC', ['ASC', 'DESC']) 
    ? $_POST['order'][0]['dir'] 
    : 'DESC';
$sql_query .= " ORDER BY {$order_column} {$order_dir}";

// 4. 分页
$start = (int)$_POST['start'];
$length = (int)$_POST['length'];
if ($length != -1) {
    $sql_query .= " LIMIT ?, ?";
    $params[] = $start;
    $params[] = $length;
}

// 执行预处理查询
$pstmt = $db->prepare($sql_query);
$pstmt->execute($params);
$rows_count = $pstmt->rowCount();

// 输出数据
while ($row = $pstmt->fetch(PDO::FETCH_ASSOC)) {
    echo "<tr>";
    echo "<td>" . htmlspecialchars($row['id']) . "</td>";
    echo "<td>" . htmlspecialchars($row['first_name']) . "</td>";
    echo "<td>" . htmlspecialchars($row['last_name']) . "</td>";
    echo "<td>" . htmlspecialchars($row['product_name']) . "</td>";
    echo "</tr>";
}

? 总结要点

  • 逻辑优先级:AND 优先级高于 OR,多条件混合时务必用括号显式分组;
  • 安全第一:永远使用预处理语句 + 参数绑定,杜绝字符串拼接;
  • 输入过滤:对数字型字段(如 product_id)强制类型转换((int)),对字符串使用 trim() + strip_tags() + htmlspecialchars()(输出时);
  • 白名单校验:排序字段、操作类型等动态部分必须通过白名单验证,不可直接拼接用户输入;
  • 调试建议:开发时可用 echo $sql_query; die(); 查看生成的 SQL,再在数据库客户端中手动执行验证逻辑是否符合预期。

遵循以上方法,即可精准、安全地按 product_id 筛选并展示所需产品记录。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

10704

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6261

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2135

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3968

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4674

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3651

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5237

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4102

2023.11.13

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn