PHP 7.4.3 中 strpos() 检查字符串包含失败的解决方案
技术百科
霞舞
发布时间:2025-12-26
浏览: 次 在 php 7.4.3 环境中使用 `strpos()` 判断子串存在时,因未正确处理返回值(如 `0` 被误判为 `false`)导致逻辑失效,需严格使用 `!== false` 进行比较。
在 PHP 开发中,strpos() 是兼容 PHP 5.0+ 的经典函数,常用于替代 PHP 8.0+ 新增的 str_contains()。但一个极易被忽视的关键点是:strpos() 在目标子串位于字符串开头时返回 0,而 0 == false 为 true(弱比较)——这会导致本应匹配成功的判断被错误跳过。
你的代码中:
echo (stristr($result, 1) !== false) ? '...delete...' : '...update...';
虽已使用 !== false(✅ 正确),但存在两个潜在风险:
- 类型不一致问题:stristr($result, 1) 中数字 1 会被隐式转为字符串 "1",看似可行,但若 $result 包含类似 "10"、"11" 或 "01",stristr("10", 1) 会返回 "10"(即 true),造成误匹配(例如 PRIVACY_ID=10 也会触发 1 的删除按钮);
- $result 初始化缺失:循环前未声明 $result = '';,在 PHP 7.4 严格模式或未启用 error_reporting(E_ALL) 时可能产生 Notice: Undefined variable,且首次拼接行为不可控(尤其当无记录时 $result 为 null,stristr(null, 1) 返回 false,逻辑仍成立但隐患大)。
✅ 正确做法如下:
① 显式初始化并构建可安全匹配的结构
$result = []; // 使用数组存储 ID,避免字符串歧义
$stmt = $mysql->prepare("SELECT PRIVACY_ID FROM privacy_user WHERE USER_ID = ? AND VALID_TILL IS NULL");
$stmt->execute([$_SESSION['USER_ID']]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$result[] = (int)$row['PRIVACY_ID'];
}
// 转为索引数组便于快速查找(O(1))
$consentedIds = array_flip($result); // 如 [1=>0, 3=>1, 5=>2]② 安全检查(推荐)
③ 若坚持用字符串 + strpos(),必须确保精确匹配
// 将 ID 用分隔符包裹(如逗号),避免 1 匹配到 10/11
$result = ',' . implode(',', $result) . ',';
// 检查是否包含 ",1,"(注意前后逗号)
if (strpos($result, ',1,') !== false) { /* 已同意 */ }⚠️ 额外重要提醒:
-
SQL 注入风险:你当前代码中直接拼接 $_SESSION[
'USER_ID'] 到 SQL 查询("WHERE USER_ID = '" . $_SESSION['USER_ID'] . "'"),这是严重安全隐患!务必改用预处理语句绑定参数(如上例所示); - 错误报告:在开发环境启用 error_reporting(E_ALL); ini_set('display_errors', 1);,可及时发现未定义变量等低级错误;
-
PHP 版本适配:若长期需支持 PHP 7.x,建议封装兼容函数:
function str_contains_safe(string $haystack, string $needle): bool { return strpos($haystack, $needle) !== false; }
综上,问题根源不在 strpos() 本身失效,而在于数据结构设计不合理 + 类型比较不严谨 + 安全实践缺失。优先采用数组键值映射方案,既高效、安全、可读性强,又彻底规避字符串解析歧义。
# ai
# 这是
# 也会
# 首次
# 绑定
# 跳过
# 这会
# 所示
# 你当
# 数据结构
# 循环
# 字符串
# NULL
# 封装
# session
# php
# mysql
# sql
# 开发环境
# undefined
# strpos
# 严格模式
# 错误报告
# 极易
# 字符串解析
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么设置任务栏图标大小_Windows1
- Mac的“预览”如何合并多个PDF_Mac文件处理
- Python网络异常模拟_测试说明【指导】
- Win11应用商店下载慢怎么办 Win11更改DN
- 短链接怎么用php还原_从基础原理到代码实现教学【
- MAC怎么一键隐藏桌面所有图标_MAC极简模式切换
- Win11任务栏怎么放到顶部_Win11修改任务栏
- Win11怎么连接投影仪_Win11多显示器投屏设
- c++如何实现一个高性能的环形队列(Ring Bu
- Win11怎么关闭搜索历史 Win11清除搜索框最
- Windows10蓝屏SYSTEM_SERVICE
- php485在php5.6下能用吗_php485旧
- Windows10系统怎么查看防火墙状态_Win1
- Win10电脑C盘红了怎么清理_Windows10
- php转mp4怎么设置帧率_调整php生成mp4视
- Win11怎么设置任务栏透明_Windows11使
- Win11如何设置开机自动联网 Win11宽带连接
- c++如何判断文件是否存在_c++ filesys
- 如何在JavaScript中动态拼接PHP的bas
- Win11怎么设置任务栏大小_Windows11注
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- Win11怎么更改管理员名字 Win11修改账户名
- VSC怎样在Linux运行PHP_Ubuntu系统
- 如何使用Golang实现容器健康检查_监控和自动重
- Mac如何修复应用程序权限问题_Mac磁盘工具修复
- 如何使用Golang包导出规则_控制函数和变量可见
- Python性能剖析高级教程_cProfileLi
- Win11怎么开启游戏模式_Windows11优化
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- php增删改查需要哪些扩展_开启mysqli或pd
- Win10怎样清理C盘阿里旺旺缓存_Win10清理
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Win11怎样安装微信开发者工具_Win11安装开
- Windows家庭版如何开启组策略(gpedit.
- Win11怎么关闭小组件_Win11禁用任务栏天气
- Python函数接口文档化_自动化说明【指导】
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- Mac怎么查看活动监视器_理解Mac进程和资源占用
- c++ try_emplace用法_c++ map
- Windows如何使用注册表查找和删除项?(reg
- PHP的Workerman对架构扩展有啥帮助_应用
- 如何在Golang中实现RPC异步返回_Golan
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- 如何解决Windows时间不准的问题?(自动同步设
- Go 语言标准库为何不提供泛型切片的 Contai
- mac怎么分屏_MAC双屏显示与分屏操作技巧【指南
- 如何在Golang中配置代码格式化工具_使用gof
- Win11怎么设置系统还原_Windows11系统
- Windows任务计划服务异常原因_任务调度失败的
- C++如何使用Qt创建第一个GUI窗口?(入门教程

'USER_ID'] 到 SQL 查询("WHERE USER_ID = '" . $_SESSION['USER_ID'] . "'"),这是严重安全隐患!务必改用预处理语句绑定参数(如上例所示);
QQ客服