Php while循环中偶尔会出现奇怪的重复回声

Php while循环中偶尔会出现奇怪的重复回声,php,mysql,loops,while-loop,duplicates,Php,Mysql,Loops,While Loop,Duplicates,这个问题让我的脸都裂了 我有以下代码: <?php while ($com_row = mysql_fetch_array($result_getcom)) { ?> <tr> <td> <a href="?id=<?= $com_row['id'] ?>"><?= $com_row['name'] ?></a> <?

这个问题让我的脸都裂了

我有以下代码:

<?php while ($com_row = mysql_fetch_array($result_getcom)) { ?>
    <tr>
        <td>
                <a href="?id=<?= $com_row['id'] ?>"><?= $com_row['name'] ?></a> 
                <?php if ($com_row['com_flag_flagged'] == 0 && $com_row['com_flag_ownerid'] == $_SESSION['sess_id']) { 
                    echo "<span class='label label-default'>Nytt!</span> "; 
                } ?>
                <?= $com_row['com_comment'] ?>
                <?php if ($com_row['com_auth_id'] == $_SESSION['sess_id'] || $com_row['com_stat_ownerid'] == $_SESSION['sess_id']) { ?>
                <br /><a href="?id=<?= $_GET['id'] ?>&delcom=<?= $com_row['com_id'] ?>"><small><font color="#b94a48">Radera</font></small></a>
            <?php } ?>
        </td>
    </tr>
<?php } ?>
对于每一条评论,我都会在while中添加以下内容:

while ($flags_row = mysql_fetch_assoc($result_getflags)) { if ($flags_row['com_flag_flagged'] == 0 && $flags_row['com_flag_ownerid'] == $_SESSION['sess_id']) { echo "<span class='label label-default'>Nytt!</span> "; } }
while($flags_row=mysql_fetch_assoc($result_getflags)){if($flags_row['com_flag_flag_flag']==0&&$flags_row['com_flag_ownerid']=$_SESSION['sess_id']){echo“Nytt!”}

这似乎把它修好了!你明白我想做什么吗?如果是这样,你认为这是最终的解决方案吗?哦,当然,谢谢你的帮助,克里斯。您是黄金。

对于初学者,这里必须提醒您,mysql*函数现在已被弃用,您应该转向PDO或mysqli

接下来,mysql_fetch_array()可以返回数字索引数组或关联数组,具体取决于您如何使用它。您的使用表明您可能希望改用mysql\u fetch\u assoc()

最后,当出现重复的注释时,它只是注释主体还是出现的整个代码结构

更新:SQL问题

当我们查看提取所有注释(和关联表数据)的查询时,我们有以下查询/行:

$sql_getcom = "SELECT * FROM status_comments INNER JOIN users ON id=com_auth_id INNER JOIN com_flags ON com_flag_cid=com_id WHERE com_stat_id='{$su_row['su_id']}' ORDER BY com_date ASC";
status_comments是包含每个注释的表。我们对users表进行内部连接,它根据status_comments.com_auth_id提取注释作者信息。接下来,我们对com_flags表进行内部连接。我不完全清楚在这种情况下我们使用这些标志是为了什么,但这并不重要。在注释67中看到2个条目的原因是内部联接返回2行,因为com_标志表中有2个条目(com_标志.com_标志id 49和50)。您的代码在此假定为1:1关系,并且不考虑有2个标志的事实

您有两种方法可以解决此问题:

  • 您可以在跟踪当前注释的循环之前设置一个变量,如果当前注释出现两次,您将跳过第二次。不利的一面是,这会使你在评论中使用第二个标志无效,并且会产生不一致,因为有时49可能是第一个,有时50可能是第一个
  • 您可以放弃第二个标志,并保证标志和注释之间存在1:1的关系,并且不需要更改代码
  • 下面是第一个解决方案的一些代码。您必须设置正确的变量名,并将其与现有代码合并

    $current_comment = 0;
    while($row = mysql_fetch_assoc($results))
    {
        if($current_comment != $row['comment_id']) // This is a new comment
        {
            $current_comment = $row['comment_id']; // Set our new one to the current
            echo "Print out some stuff, like our comment";
        }
        // else - not needed - but this means we are processing the same comment as last time so we skip it
    }
    

    注意!我只是使用mysql,因为我已经习惯了,这个项目是本地的,不是公共的。不过我会考虑改用mysqli,谢谢!在回答fetch_assoc的问题时:我为什么要用它来代替呢?有什么区别?我会给你一个截图:在底部,评论出现两次。奇怪的是,第二次没有“New”标签……您引用行中数据的方式,$com_row['field_name']是关联方式。数字索引应为$com_行[0]。mysql_fetch_array()可以同时执行这两项操作,但您必须告诉它您希望以何种方式返回数据。由于您已经在使用关联方式,因此使用该方法是有意义的。至于复本,你能看一下页面的来源并发布吗?我明白了!谢谢你帮我澄清。在引用行名称时,我将开始使用mysql\u fetch\u assoc。当然可以。我将在我的第一篇文章中发布该表的源代码,以供查看!当然,如果您需要其他类型的信息,请告诉我,我会为您获取。根据上述代码,我看不出复制的任何原因。您可以尝试将class=“comment\u id”部分添加到周围的标记中,以确保这些标记不重复。您是否更新了总体注释选择并删除了该连接条件?如果是这样的话,我想你可以走了!对现在的选择是:
    $sql\u getcom=“SELECT*FROM status\u comments\u internal JOIN users ON id=com\u auth\u id,其中com\u stat\u id=“{$su\u row['su\u id']}”ORDER BY com\u date ASC”
    我已经添加了标志支持,甚至现在已经对通知进行了相应的编程,所以我已经完成了整个功能。解脱!!再一次,@ChrisRasco我不得不说非常感谢你。如果没有你的帮助,我很可能无法做到这一点。谢谢!:)
    $sql_getflags = "SELECT * FROM com_flags WHERE com_flag_cid='{$com_row['com_id']}' AND com_flag_ownerid='{$_SESSION['sess_id']}'";
    $result_getflags = mysql_query($sql_getflags);
    
    while ($flags_row = mysql_fetch_assoc($result_getflags)) { if ($flags_row['com_flag_flagged'] == 0 && $flags_row['com_flag_ownerid'] == $_SESSION['sess_id']) { echo "<span class='label label-default'>Nytt!</span> "; } }
    
    $sql_getcom = "SELECT * FROM status_comments INNER JOIN users ON id=com_auth_id INNER JOIN com_flags ON com_flag_cid=com_id WHERE com_stat_id='{$su_row['su_id']}' ORDER BY com_date ASC";
    
    $current_comment = 0;
    while($row = mysql_fetch_assoc($results))
    {
        if($current_comment != $row['comment_id']) // This is a new comment
        {
            $current_comment = $row['comment_id']; // Set our new one to the current
            echo "Print out some stuff, like our comment";
        }
        // else - not needed - but this means we are processing the same comment as last time so we skip it
    }