如何在PHP中用foreach与if/else判断SQL表中是否存在指定值
解决方法:判断605是否存在于product_id字段中
先说说你原代码的几个小问题:
- 只有找到605的时候才会输出
Yes.,但没找到的话完全没输出,达不到你要的"存在输出Yes,不存在输出No"的要求 - 当
product_id是0时,if($row['product_id'])会把它当成布尔值false直接跳过,虽然这个场景里0不等于605不影响结果,但逻辑不够严谨 - 如果有多条记录包含605,会重复输出
Yes.,而我们只需要一次最终判断
下面是修改后的代码,完美实现你的需求:
$query = "SELECT * FROM products"; $result = mysqli_query($db, $query); // 先初始化一个标记,默认没找到605 $found605 = false; while($row = mysqli_fetch_array($result)) { $productIds = $row['product_id']; // 处理空值,但保留0的情况(因为0是合法的字段值) if(empty($productIds) && $productIds !== '0') { continue; } // 把逗号分隔的字符串拆成数组 $data = preg_split('/,/', $productIds); if(is_array($data)) { foreach($data as $value) { // 用严格比较,避免类型转换坑(比如数据库存的是字符串'605',和数字605匹配) if((string)$value === '605') { $found605 = true; // 找到就直接跳出所有循环,不用再浪费时间遍历剩下的数据 break 2; } } } } // 所有数据遍历完后,统一输出结果 echo $found605 ? 'Yes' : 'No';
几个关键的优化点:
- 用
$found605这个全局变量记录是否找到目标值,最后统一输出,保证无论结果如何都有明确输出 - 专门处理了
product_id为0的情况,不会被错误跳过 - 严格比较类型,避免因为数据库字段是字符串类型导致的匹配失败
- 找到目标后直接跳出两层循环,提升代码运行效率
另外提个小建议:这种用逗号分隔存多个ID的数据库设计其实不太规范,违反了数据库第一范式,后续如果有机会,建议改成关联表(比如新建一个product_relations表,每行存一条主表id和对应的单个product_id),这样查询会更高效,维护也更方便。
内容的提问来源于stack exchange,提问作者mohsen
相关产品推荐
相关产品推荐

