php - while 循环中偶尔出现奇怪的重复 echo

标签 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 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 } ?>

它会打印出对“状态更新”的评论,就像您在 Facebook 或其他地方看到的那样。

现在,有时取决于我所写的帐户,这很好,但是,当我发表评论时,似乎使用特定帐户,该评论只是连续显示两次。我检查了数据库,没有重复的条目。但不知何故,在某些情况下,评论会连续显示两次。

http://i.imgur.com/ud27j6v.png 在底部,评论出现两次。奇怪的是,第二次没有"new"标签......

请帮助我!这是为什么?

提前致谢! /J

页面源代码:

<table class="table table-striped">
    <tbody>
     <tr>
        <td><a href="?id=1">Gabbe</a> Heja          <br /><a href="?id=4&delcom=62"><small><font color="#b94a48">Radera</font></small></a></td>
     </tr>
     <tr>
        <td><a href="?id=1">Gabbe</a> ee            <br /><a href="?id=4&delcom=63"><small><font color="#b94a48">Radera</font></small></a></td>
     </tr>
     <tr>
        <td><a href="?id=1">Gabbe</a> aa            <br /><a href="?id=4&delcom=64"><small><font color="#b94a48">Radera</font></small></a></td>
     </tr>
     <tr>
        <td><a href="?id=4">Iwar</a> <span class='label label-default'>Nytt!</span> Sant</td>
     </tr>
     <tr>
        <td><a href="?id=4">Iwar</a> <span class='label label-default'>Nytt!</span> lol</td>
     </tr>
     <tr>
        <td><a href="?id=2">Annelie</a> <span class='label label-default'>Nytt!</span> Gött :)</td>
     </tr>
     <tr>
        <td><a href="?id=2">Annelie</a> Gött :)</td>
     </tr>
     <tr>
        <td>
        <form action="profile.php?id=4" name="com_form" method="post" class="form-inline" role="form">
        <input type="hidden" name="su_id" value="10" />
        <input type="hidden" name="su_authorid" value="4" />
        <div class="form-group">
        <label class="sr-only" for="com_input">Kommentar</label>
        <input type="text" name="com_input" size="45" class="form-control" id="com_input" placeholder="Skriv en kommentar...">
        </div>
        <button type="submit" name="com_submit" data-loading-text="Skickar..." class="btn btn-default">Skicka!</button>
        </form>
        </td>
     </tr>
    </tbody>
</table>

以下是同一页面上的更多 PHP 代码:

while ($su_row = mysql_fetch_assoc($result_getsu)) {
$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";
$result_getcom = mysql_query($sql_getcom); ?>
<div class="panel panel-default">
  <div class="panel-heading">
    <h3 class="panel-title"><table width="100%"><tr><td><?php echo "{$su_row['name']} säger: <small>({$su_row['su_date']})</small></td>"; if ($_SESSION['sess_id'] == $_GET['id']) : echo "<td align=\"right\"><a href='?del={$su_row['su_id']}'><button type='button' class='close' aria-hidden='true'>&times;</button></a>
</td></tr></table></h3>"; else : echo "</tr></table></h3>"; endif; ?>
  </div>
  <div class="panel-body">
    <p><?php echo $su_row['su_message']; ?></p>
    <div class="panel panel-default">
    <!-- Table -->
    <table class="table table-striped">
        <tbody>
<?php while ($com_row = mysql_fetch_assoc($result_getcom)) { ?>
         <tr>
            <td class="<?= $com_row['com_id'] ?>"><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 } ?>
         <tr>
            <td>
            <form action="<?php echo basename($_SERVER['PHP_SELF']); ?>?id=<?php echo $_GET['id']; ?>" name="com_form" method="post" class="form-inline" role="form">
            <input type="hidden" name="su_id" value="<?= $su_row['su_id'] ?>" />
            <input type="hidden" name="su_authorid" value="<?= $su_row['su_auth_id'] ?>" />
            <div class="form-group">
            <label class="sr-only" for="com_input">Kommentar</label>
            <input type="text" name="com_input" size="45" class="form-control" id="com_input" placeholder="Skriv en kommentar...">
            </div>
            <button type="submit" name="com_submit" data-loading-text="Skickar..." class="btn btn-default">Skicka!</button>
            </form>
            </td>
         </tr>
        </tbody>
    </table>
    </div>
  </div>
</div>
<?php
}
?>

为克里斯编辑: 谢谢您,但这些解决方案都无法实现我想要做的事情。我将尽可能简单地解释 com_flags。

com_flags:http://i.imgur.com/i62g8kW.png

Com_flag_id只是该特定标志的唯一ID,com_flag_cid指的是该标志所在的评论的ID(com_id)。 com_flag_ownerid 指的是“拥有”该标志的用户 ID,最后,如果评论未读或未见,com_flag_flag 为 0,稍后我将在相关用户看到该评论后立即将其更改为 1。

现在,这些标志用于跟踪特定用户的新评论。如果有人对另一个用户状态更新发表评论,该状态更新的作者将在 com_flags 中收到一个标志,其中包含有关该评论的信息。如果该用户再次对自己的状态更新发表评论,其他人将收到一个标志,让他知道他已经评论过的状态更新有一条评论,你明白吗?因此,如果有 10 个不同的人都对一个状态更新发表评论,那么当另一位用户评论该状态更新时,他们都会收到标记。

我想我已经正确添加标志了,代码如下:

if (isset($_POST['com_submit'])) {
    $_POST = db_escape($_POST);

    if (empty($_POST['com_input'])) {
        $sus = "<br /><div class=\"alert alert-danger\"><i class=\"fa fa-exclamation-triangle\"></i> Fältet var tomt.</div>";
    } else {
    $_POST['com_input'] = htmlspecialchars($_POST['com_input']);
    $sql_com = "INSERT INTO status_comments(com_stat_id,com_stat_ownerid,com_auth_id,com_comment) VALUES('{$_POST['su_id']}', '{$_POST['su_authorid']}', '{$_SESSION['sess_id']}', '{$_POST['com_input']}')";
    $result_com = mysql_query($sql_com);
    $res = mysql_query('SELECT LAST_INSERT_ID()');
    $lastrow = mysql_fetch_array($res);
    $lastInsertId = $lastrow[0];

    $sql_commentors = "SELECT DISTINCT com_auth_id FROM status_comments WHERE com_stat_id='{$_POST['su_id']}' AND (com_auth_id!='{$_SESSION['sess_id']}' AND com_auth_id!='{$_POST['su_authorid']}')";
    $result_commentors = mysql_query($sql_commentors);
    $num_commentors = mysql_num_rows($result_commentors);

    if ($_POST['su_authorid'] != $_SESSION['sess_id']) {
    $sql_comflags = "INSERT INTO com_flags(com_flag_cid,com_flag_ownerid) VALUES('{$lastInsertId}', '{$_POST['su_authorid']}')";
    $result_comflags = mysql_query($sql_comflags);
    if ($num_commentors > 0) {
    while ($listcoms = mysql_fetch_array($result_commentors)) {
        $sql_comflags2 = "INSERT INTO com_flags(com_flag_cid,com_flag_ownerid) VALUES('{$lastInsertId}', '{$listcoms['com_auth_id']}')";
        $result_comflags2 = mysql_query($sql_comflags2);
    }
    }
    header("Location: ?id={$_GET['id']}&coms=");
    } else {
    if ($num_commentors > 0) {
    while ($listcoms = mysql_fetch_array($result_commentors)) {
        $sql_comflags = "INSERT INTO com_flags(com_flag_cid,com_flag_ownerid) VALUES('{$lastInsertId}', '{$listcoms['com_auth_id']}')";
        $result_comflags = mysql_query($sql_comflags);
    }
    }
    header("Location: ?id={$_GET['id']}&coms=");
    }
    }
}

最终编辑(希望如此):

我做了一个新的选择:

$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 内:

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> "; } }

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

最佳答案

对于初学者来说,这里有一个强制性的提醒:mysql* 函数现已弃用,您应该转向 PDO 或 mysqli。

接下来,mysql_fetch_array() 可以返回数字索引数组或关联数组,具体取决于您如何使用它。您的使用表明您可能想使用 mysql_fetch_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_flags 表中有 2 个条目(com_flags.com_flag_id 49 和 50)。您的代码此处假设存在 1:1 关系,并且没有考虑到有 2 个标志的事实。

有两种方法可以解决这个问题:

  1. 您可以在循环之前设置一个变量来跟踪当前评论,如果当前评论出现两次,您将跳过第二个。缺点是,这会使您对该评论中的第二个标志的任何使用都无效,并且会产生不一致,因为有时 49 可能是第一个,有时 50 可能是第一个。
  2. 您可以放弃第二个标志并保证标志和注释之间存在 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
}

关于php - while 循环中偶尔出现奇怪的重复 echo ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20367342/

相关文章:

loops - 奇怪的嵌套循环的时间复杂度

javascript - 最佳实践 : Javascript for loop

mysql - 为什么在更改行格式时我的表大小没有减小?

php - 将 PHP 字符串作为 SQL 命令传递并保留换行符

php - 如何在 __construct() 中创建 PDO 连接?

java - 在开关盒上放一个环。当用户选择选项 5 时退出菜单

php - 使用 Guzzle 将文件发布到 Web 服务

php - yum 更新依赖错误

php - PHP脚本套接字保持连接状态

php - 乔姆拉 2.5。不显示注册表单验证消息