首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >array_unique不删除重复值

问array_unique不删除重复值
EN

Stack Overflow用户
提问于 2017-11-19 14:02:11
回答 1查看 362关注 0票数 1

对不起,如果这是一个重复,我已经尝试搜索,但似乎找不到答案。我可能只是把代码放在了错误的地方。

我已经统计了从各种复选框中输入的重复值,这些复选框是通过$_GET发送的。使用这些重复项,如果超过(无论设置的数量),那么它将通过mysql查询运行。一切都很顺利。

问题是我需要删除从mysql查询中返回的重复项。这是我的代码:

代码语言:javascript
复制
if ($countGearSelected >= 2) {      
        $gearSets = array_keys(array_filter(array_count_values($_GET['gearPiece']), function($v) {
            return $v > 1;
        }));

        foreach ($gearSets as $gearSetKey => $gearSetValue) {

            $result = mysqli_query($con,"SELECT twoPieceBonus FROM sets WHERE setName='".$gearSetValue."';");
            while($row = mysqli_fetch_array($result)){

                $twoPieceBonus .= urldecode($row['twoPieceBonus']).'</br></br>';

            }
            $twoPieceBonus = implode(',',array_unique(explode(',', $twoPieceBonus)));
            $twoSelected = substr($twoPieceBonus, 0, -10);

        }


    }else{
        $twoSelected = '';
    }

正如您所看到的,我已经在SE上的其他帖子上尝试过array_unique选项,但它似乎不起作用。我想我可能用错了?

在mysql查询中,使用DISTINCT不起作用,因为被查询的几个“集合”具有相同的结果(如果这有意义的话?)

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-19 15:44:34

首先:您的代码容易受到SQL注入的攻击:使用准备好的陈述来避免这种情况。

其次,在循环的每一次迭代中执行查询常常是个坏主意。在这种情况下是可以避免的。与where子句中的相等比较不同,您可以使用in操作符并一次对所有齿轮组进行比较。

这也将解决获得不同价值的问题。只执行一个查询,现在可以使用distinct。

下面是代码的样子。我无法测试这一点,但我希望错误(如果有的话)可以很容易地修复:

代码语言:javascript
复制
$twoSelected = '';
if ($countGearSelected >= 2) {      
    $gearSets = array_keys(array_filter(
        array_count_values($_GET['gearPiece']), function($v) {
            return $v > 1;
        }
    ));

    // Create comma separated list of question marks
    $placeHolders = implode(",", array_fill(0, count($gearSets), "?"));
    // Prepare SQL statement with it
    $stmt = mysqli_prepare($con, 
            "SELECT DISTINCT twoPieceBonus 
             FROM sets 
             WHERE setName IN ($placeHolders);");

    // All gearSet values are strings:
    $types = str_repeat("s", count($gearSets));
    // Turn the gearSets into references
    $gearSetRefs = [];
    foreach ($gearSets as $i => $_) {
         $gearSetRefs[] = &$gearSets[$i];
    }
    // Bind arguments
    mysqli_stmt_bind_param($stmt, $types, ...$gearSetRefs); // the splat operator
    // Now we are all set to (safely) execute the query 
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    // Let the result of the URL decoding still be an array
    $twoPieceBonus = [];
    while ($row = mysqli_fetch_array($result)) {
        $twoPieceBonus[] = urldecode($row['twoPieceBonus']);
    }
    mysqli_stmt_close ($stmt);
    // ... and then use implode to insert those HTML breaks
    $twoSelected = implode("</br></br>", $twoPieceBonus);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47377718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档