PHP中如何使用SELECT IN查询数组列数据并统计符合条件行数
修正后的代码实现
核心问题分析
- 原
$userID是二维数组,无法直接通过$userID['id']获取所有id值,需先提取一维id数组。 - 直接拼接SQL存在注入风险,且
SELECT *统计行数效率低下。
方案1:基础修正(适用于id可控场景)
<?php $connn = dbconnect(); // 从二维数组中提取所有id,得到一维数组[1,2,3] $userIds = array_column($userID, 'id'); // 转义id防止SQL注入(数字类型可省略,但推荐保留) $escapedIds = array_map(fn($id) => mysqli_real_escape_string($connn, $id), $userIds); // 用COUNT(*)直接统计行数,比SELECT *更高效 $sql = "SELECT COUNT(*) AS lead_count FROM tblleads WHERE assigned IN (" . implode(',', $escapedIds) . ")"; $result = $connn->query($sql); $row = $result->fetch_assoc(); $num_rows = $row['lead_count']; ?> <h1>Lead Count : <?php echo $num_rows; ?> </h1>
方案2:安全预处理(推荐,适用于所有场景)
预处理语句可彻底避免SQL注入,是更规范的写法:
<?php $connn = dbconnect(); // 提取一维id数组 $userIds = array_column($userID, 'id'); // 生成与id数量匹配的占位符? $placeholders = implode(',', array_fill(0, count($userIds), '?')); // 构造带占位符的SQL $sql = "SELECT COUNT(*) AS lead_count FROM tblleads WHERE assigned IN ($placeholders)"; // 初始化预处理语句 $stmt = $connn->prepare($sql); // 绑定参数:i代表整数类型,重复对应id数量的i,用展开运算符传入所有id $stmt->bind_param(str_repeat('i', count($userIds)), ...$userIds); $stmt->execute(); // 获取统计结果 $result = $stmt->get_result(); $row = $result->fetch_assoc(); $num_rows = $row['lead_count']; ?> <h1>Lead Count : <?php echo $num_rows; ?> </h1>
内容的提问来源于stack exchange,提问作者Hashan Madhusanka
相关产品推荐
相关产品推荐

