如何实现:当IN查询的ID中有不存在项时终止程序运行?
多ID校验:存在缺失ID时程序未终止的修复方案
需求
当查询的多个ID里有任意一个不在数据库中,程序必须终止运行。
当前问题
数据库里有ID 244,但没有ID 255,执行现有代码后,程序因为查到了存在的244就继续运行,没按要求终止,不符合预期。
当前代码
$sql_result = mysql_query("SELECT `id` FROM `bokningar_bokat` WHERE `id` IN ('255','244')") or die(mysql_error()); $sql_row = mysql_fetch_assoc($sql_result); if(!empty($sql_row['id'])) { echo "Id exists - " . $sql_row['id'] . " <BR/>"; } else { echo "Id no longer exists - " . $sql_row['id'] . " <BR/>"; die; }
修复方法
原代码的核心问题是只取了查询结果的第一行,只要有一个ID存在就判定通过,完全没检查其他ID是否存在。要实现需求,得校验所有目标ID是否都在数据库里,具体修改如下:
// 先把要检查的ID放进数组 $target_ids = ['255', '244']; // 转义ID防止SQL注入(注意:mysql_real_escape_string属于已废弃的mysql扩展,新项目建议用PDO/MySQLi) $escaped_ids = array_map('mysql_real_escape_string', $target_ids); $id_str = implode("','", $escaped_ids); // 查询数据库中存在的目标ID $sql_result = mysql_query("SELECT `id` FROM `bokningar_bokat` WHERE `id` IN ('$id_str')") or die(mysql_error()); // 把查到的ID收集起来 $found_ids = []; while ($row = mysql_fetch_assoc($sql_result)) { $found_ids[] = $row['id']; } // 对比原始ID和查到的ID,找出缺失的 $missing_ids = array_diff($target_ids, $found_ids); if (!empty($missing_ids)) { echo "不存在的ID:" . implode(', ', $missing_ids) . "<BR/>"; die; } else { echo "所有ID都存在<BR/>"; // 这里写后续的业务逻辑 }
重点说明
- 用
array_diff可以快速找出原始ID数组里不在查询结果里的元素,精准定位缺失ID - 必须遍历所有查询结果收集存在的ID,不能只取第一行结果做判断
- 额外提醒:
mysql_*系列函数已经被PHP官方废弃,实际开发中建议换成PDO或者MySQLi扩展,安全性和兼容性更好
内容的提问来源于stack exchange,提问作者Wille Amin
相关产品推荐
相关产品推荐

