这个问题让我撕裂了我的脸......
我有这段代码:
<?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 在底部,评论出现两次。奇怪的是第二次没有“新”标签......
请帮帮我!这是为什么?
提前致谢! / 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'>×</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指的是该标志所放置的注释(com_id)的id。 com_flag_ownerid指的是“拥有”该标志的用户ID,最后,如果评论未读或未看到,则com_flag_flagged为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=");
}
}
}
最终编辑(希望如此):
我做了一个新的SELECT:
$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> "; } }
这似乎解决了它!你明白我想做什么吗?如果是这样,您认为这是最终的解决方案吗?哦,当然,非常感谢你的帮助,克里斯。你很高兴。
答案 0 :(得分:0)
对于初学者来说,这里强制提醒一下,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行,因为com_flags表中有2个条目(com_flags.com_flag_id 49和50)。您的代码在此处采用1:1关系,并不考虑有2个标记的事实。
你有两种方法可以解决这个问题:
这是第一个解决方案的一些代码。您必须设置正确的变量名称并将其与现有代码合并。
$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
}