全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

PHP 7.4.3 中 strpos() 检查字符串包含失败的解决方案

在 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(✅ 正确),但存在两个潜在风险:

  1. 类型不一致问题:stristr($result, 1) 中数字 1 会被隐式转为字符串 "1",看似可行,但若 $result 包含类似 "10"、"11" 或 "01",stristr("10", 1) 会返回 "10"(即 true),造成误匹配(例如 PRIVACY_ID=10 也会触发 1 的删除按钮);
  2. $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() 本身失效,而在于数据结构设计不合理 + 类型比较不严谨 + 安全实践缺失。优先采用数组键值映射方案,既高效、安全、可读性强,又彻底规避字符串解析歧义。


# mysql  # php  # session  # ai  # 开发环境  # 字符串解析  # sql  # NULL  # strpos  # 封装  # 字符串  # 循环  # 数据结构  # undefined  # 严格模式  # 这是  # 也会  # 首次  # 所示  # 你当  # 错误报告  # 这会  # 绑定  # 极易  # 跳过 


相关文章: 网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何用PHP工具快速搭建高效网站?  如何在香港免费服务器上快速搭建网站?  建站上市公司网站建设方案与SEO优化服务定制指南  如何访问已购建站主机并解决登录问题?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  建站之星2.7模板:企业网站建设与h5定制设计专题  如何在IIS7中新建站点?详细步骤解析  高防服务器租用首荐平台,企业级优惠套餐快速部署  建站之星微信建站一键生成小程序+多端营销系统  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  建站VPS配置与SEO优化指南:关键词排名提升策略  建站之星安装步骤有哪些常见问题?  建站之星CMS五站合一模板配置与SEO优化指南    建站之星客服服务时间及联系方式如何?  完全自定义免费建站平台:主题模板在线生成一站式服务  Swift中swift中的switch 语句  如何快速搭建高效服务器建站系统?  如何在万网主机上快速搭建网站?  如何快速辨别茅台真假?关键步骤解析  定制建站是什么?如何实现个性化需求?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何快速查询网站的真实建站时间?  网页设计网站制作软件,microsoft office哪个可以创建网页?  公司网站制作价格怎么算,公司办个官网需要多少钱?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  制作网站公司那家好,网络公司是做什么的?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  制作网站的基本流程,设计网站的软件是什么?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  建站主机功能解析:服务器选择与快速搭建指南  ,交易猫的商品怎么发布到网站上去?  建站主机如何选?高性价比方案全解析  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  建站之星免费版是否永久可用?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何使用Golang table-driven基准测试_多组数据测量函数效率  如何确保西部建站助手FTP传输的安全性?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  建站168自助建站系统:快速模板定制与SEO优化指南  如何批量查询域名的建站时间记录?  如何在腾讯云免费申请建站?  建站之星安装提示数据库无法连接如何解决?  图册素材网站设计制作软件,图册的导出方式有几种?  如何用IIS7快速搭建并优化网站站点?  兔展官网 在线制作,怎样制作微信请帖?  如何彻底卸载建站之星软件? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。