You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中SQL IN与NOT IN运算符失效及页面停滞问题求助

解决条件语句中数据库查询参数不匹配导致的页面卡顿问题

我看到你遇到的问题了——核心是参数数组的构建方式错误,导致数据库查询的占位符数量和传入的参数数量不匹配,进而引发查询失败甚至页面卡顿。让我帮你梳理问题并修正代码:

问题根源分析

你原来的代码中,错误地将$edrIds数组用implode(',', $edrIds)拼接成单个字符串作为参数,但$b生成的是多个?占位符(比如有3个ID就生成3个?)。这就造成了占位符数量和参数数量完全不匹配,数据库无法正确解析查询,最终导致页面停止运行,同时也没法正确传入country_id和category_id这些必要参数。

修正后的代码

$emailContent = $emailDataResource->getEmailResourceIDs($date, $country_id, $category_id);
$edrIds = $emailContent; // 直接赋值,无需额外foreach循环(假设getEmailResourceIDs返回数组)

// 构建占位符,同时处理空数组避免SQL语法错误
$placeholders = !empty($edrIds) ? implode(', ', array_fill(0, count($edrIds), '?')) : '0';
$db = DB::getInstance();

// 获取资源
if(count($countryId) == 1) {
    $query = " SELECT edr.id AS data_id, r.id, r.title, r.friendly_url, edr.position 
               FROM `twinkl_email_data_resource` edr 
               JOIN `twinkl_resource` r ON r.id = edr.resource_id 
               WHERE edr.`date` = ? 
                 AND edr.`country_id` = ? 
                 AND edr.`category_id` = ? 
                 AND edr.id NOT IN ($placeholders)";
    // 合并基础参数与ID数组,每个ID对应独立占位符
    $params = array_merge([$date, $country_id, $category_id], $edrIds);
    $result = $db->query($query, $params);
} else if (count($countryId) > 1) {
    $query = " SELECT edr.id AS data_id, r.id, r.title, r.friendly_url, edr.position 
               FROM `twinkl_email_data_resource` edr 
               JOIN `twinkl_resource` r ON r.id = edr.resource_id 
               WHERE edr.id IN ($placeholders)";
    $params = $edrIds; // 直接传入ID数组,每个ID对应一个占位符
    $result = $db->query($query, $params);
}

关键修改点说明

  1. 简化ID数组构建:去掉了多余的foreach循环,直接将getEmailResourceIDs的返回值赋值给$edrIds(前提是该方法返回数组类型)。
  2. 处理空数组边界情况:当$edrIds为空时,将占位符设为0,避免出现NOT IN ()这种非法SQL语法(会直接导致数据库报错)。
  3. 修正参数数组结构:使用array_merge将基础参数(date、country_id、category_id)与$edrIds数组合并,确保每个?占位符都对应一个独立的参数,彻底解决数量不匹配的问题。
  4. 多国家分支优化:直接将$edrIds作为参数数组传入,保证每个ID对应一个占位符,查询逻辑更严谨。

这样修改后,数据库查询能正确解析所有参数,页面卡顿的问题会得到解决,同时也能正常传入country_id和category_id来筛选数据。

内容的提问来源于stack exchange,提问作者anon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:23:00