2012-12-10 57 views
0

我不太確定如何說出這個,所以如果你需要更多的澄清,我可以盡我所能解釋。停止從重複帖子循環

下面是代碼

$file = "shout.txt"; 
$filed = file_get_contents($file); 
preg_match_all('|<div class=\'date\'>(?P<date>.*?)&nbsp;.*<a.*>(?P<user>.*)</a>|i', $filed, $matches); 

$shoutlines = file($shout_file); 

$aTemp = array(); 
foreach($matches['user'] as $user) { 
    $aTemp[] = "'" . mysql_real_escape_string($user) . "'"; 
} 
$user = implode(",", $aTemp); 

$getlevel = $db->query("SELECT * FROM accounts WHERE username IN (".$user.")"); 
$isadmin = $db->query("SELECT * FROM accounts WHERE username = '".$_SESSION['username']."'"); 
$admin = $isadmin->fetch_assoc(); 
while($status = $getlevel->fetch_assoc()){ 
    //output the html 
    for($i = 0; $i < (1000); $i++) 
    { 
     if(isset($shoutlines[$i])) 
     { 
      if ($admin['admin'] == 1 && $status['sblevel'] != Admin && $status['sblevel'] != Banned){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a><a href='javascript: ban({$status['id']});' class='ban' onclick=\"return confirm('Are you sure you want to ban this user?');\">o</a>"; 
      } 
      if ($admin['admin'] == 1 && $status['sblevel'] != Admin && $status['sblevel'] == Banned){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a><a href='?index=shout&unban&user=".$shout['username']."' class='ban' onclick=\"return confirm('Are you sure you want to unban this user?');\">&oslash;</a>"; 
      } 
      if ($admin['admin'] == 1 && $status['sblevel'] == Admin){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a>"; 
      } 
      if ($admin['sblevel'] == Moderator && $status['sblevel'] != Admin && $status['sblevel'] != Moderator){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a><a href='?index=shout&ban&user=".$shout['username']."' class='ban' onclick=\"return confirm('Are you sure you want to ban this user?');\">o</a>"; 
      } 
      if ($status['sblevel'] == Moderator && $status['sblevel'] != Admin){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a>"; 
      } 
      $shoutline = preg_replace('/<\/div>\n/', ' ', $shoutlines[$i], 1); 
      echo showSmileys($shoutline) . $delete . "</div>"; 
     } 
    } 
} 

的問題是,它複製所有帖子爲於每用戶的..我假定這是因爲它是在一個while循環,但我不知道如何去做這件事,因爲我需要檢查用戶是否是admin/mod,並且他們是否在帖子旁邊放置了刪除/禁止按鈕以允許他們刪除。就目前而言,它會在所有帖子旁邊放置一個刪除按鈕,然後使用旁邊的刪除和禁止按鈕複製它們。

+1

只是一個側面的問題:你爲什麼使用文本文件而不是使用mysql(你得到的用戶與MySQL)?如果文件增長,您的內存使用量將增加,對於您的加載時間也是如此。 –

+1

for循環在做什麼? – Lenin

+0

爲什麼所有這些'if'語句都不是'else if's? – justderb

回答

1

這是最簡單的修改以避免重複消息。你必須提供一個函數author(),它從shout_file中取出一行並返回作者ID。

while($status = $getlevel->fetch_assoc()){ 
    //output the html 
    for($i = 0; $i < (1000); $i++) 
    { 
     if(isset($shoutlines[$i])) 
     { 
      if (author($shoutlines[$i]) != $status['id']) { 
       continue; 
      } 
      if ($admin['admin'] == 1 && $status['sblevel'] != Admin && $status['sblevel'] != Banned){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a><a href='javascript: ban({$status['id']});' class='ban' onclick=\"return confirm('Are you sure you want to ban this user?');\">o</a>"; 
      } 
      if ($admin['admin'] == 1 && $status['sblevel'] != Admin && $status['sblevel'] == Banned){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a><a href='?index=shout&unban&user=".$shout['username']."' class='ban' onclick=\"return confirm('Are you sure you want to unban this user?');\">&oslash;</a>"; 
      } 
      if ($admin['admin'] == 1 && $status['sblevel'] == Admin){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a>"; 
      } 
      if ($admin['sblevel'] == Moderator && $status['sblevel'] != Admin && $status['sblevel'] != Moderator){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a><a href='?index=shout&ban&user=".$shout['username']."' class='ban' onclick=\"return confirm('Are you sure you want to ban this user?');\">o</a>"; 
      } 
      if ($status['sblevel'] == Moderator && $status['sblevel'] != Admin){ 
       $delete = "<a href='javascript: delete_shoutline({$i});' title='Delete' class='delete' onclick=\"return confirm('Are you sure you want to delete this message?');\">x</a>"; 
      } 
      $shoutline = preg_replace('/<\/div>\n/', ' ', $shoutlines[$i], 1); 
      echo showSmileys($shoutline) . $delete . "</div>"; 
      unset($shoutlines[$i]); 
     } 
    } 
} 

這可能不是最好的方法,因爲它會重複每個來自作者的消息的「禁止該用戶」。將ban/unban選項放在每個用戶的開始處一次,然後在每行上「刪除」會更好。