You need to enable JavaScript to run this app. PHP:如何检查多维数组中是否存在同时匹配user_id与poll_id的条目
优惠活动
大模型
产品
解决方案
定价
更多

PHP:如何检查多维数组中是否存在同时匹配user_id与poll_id的条目

基于现有多维数组的匹配方法

你之前用两个独立array_search的判断逻辑存在本质问题:两个搜索是分开校验的,只要数组里存在某条记录包含目标user_id、另一条不相关记录包含目标poll_id,就会误判为已存在,根本无法保证两个值属于同一条投票记录。

如果基于已经拉取的全量数组做判断,可以通过逐行循环同时匹配两个字段实现校验:

// 替换为实际待校验的用户ID、投票ID
$targetUserID = 2;
$targetPollID = 16;
$hasVoted = false;

foreach ($array as $voteRecord) {
    // 强制转成整数做严格比较,避免字符串类型导致的匹配误差
    if (
        (int)$voteRecord['user_id'] === $targetUserID
        && (int)$voteRecord['poll_id'] === $targetPollID
    ) {
        $hasVoted = true;
        break; // 匹配到对应记录后直接终止循环,减少不必要的遍历
    }
}
性能更优的落地实现方案

把polls_results表的所有数据都查出来存在PHP数组里,是性能很低的实现:当投票量增长到几万、几十万条时,每次校验都要全量读表、把所有数据加载到内存,会造成不必要的资源浪费。
正确的实现是直接在数据库层面做定向匹配,只查询需要的单条校验记录,根本不需要构建全量数组,具体分为两步:

  • 写带参数过滤的SQL查询,同时匹配user_id和poll_id两个条件
    // 替换为实际待校验的用户ID、投票ID
    $targetUserID = 2;
    $targetPollID = 16;
    
    // 用预编译语句避免SQL注入
    $stmt = $db->prepare("SELECT result_id FROM polls_results WHERE user_id = ? AND poll_id = ? LIMIT 1");
    $stmt->bind_param("ii", $targetUserID, $targetPollID);
    $stmt->execute();
    $checkResult = $stmt->get_result();
    
    // 只要存在匹配的记录,就说明用户已经对该投票投过票
    $hasVoted = $checkResult->num_rows > 0;
    
  • 给表加上联合唯一约束,从数据库层面根治重复投票问题
    仅靠PHP代码做校验,在并发提交场景下可能出现漏判(比如两个请求同时通过校验、同时写入重复投票数据)。给user_id和poll_id创建联合唯一索引后,就算代码层逻辑出现疏漏,数据库也会直接拒绝同一用户对同一投票的重复写入,从根源上保证数据一致性。执行以下SQL即可创建约束:
    ALTER TABLE polls_results ADD UNIQUE INDEX idx_unique_user_poll (user_id, poll_id);
    

内容的提问来源于stack exchange,提问作者gerrit van Vliet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 00:36:04