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
相关产品推荐
相关产品推荐

