Prüfen von Variable

newwarrior

Erfahrenes Mitglied
Hi,

ich habe ein kleines Forum.
In der DB gibt es hinter jeden Topic eine Spalte (read_user_id) wo die ID's der User gespeichert werden, die das Thema bereits gelesen haben.
Jetzt will ich bei der Foren ansicht prüfen, ob es Themen gibt die der User noch nicht gelsen hat und dieses dann durch ein ICON kenntlich machen.
Ich habe jetzt eine kleine Funktion geschrieben, die erst mal prüft, ob der User bereits das Thema gelesen hat:

PHP:
function check_user_read_board ($user_id, $board_id, $db)
{
    $ba = false; // erstmal false setzten (bei false hat er das Thema noch nicht gelesen)

    $sel_to = 'SELECT read_user_id FROM board_topics WHERE board_id = "'.$board_id.'"';
    $result_sel = mysql_query($sel_to) OR die(mysql_error());

    while($data = mysql_fetch_assoc($result_sel))
    {

        $id = explode("-", $data['read_user_id']); // die ID's werden so gespeichert ID-ID-ID
        for($i = 0; $i < count($id); $i++)
        {
            if($id[$i] == $user_id) $ba = true;
        }        

    }
    
    if(!empty($result_sel))
    {
        $ba = true;            
    }    
    
    return $ba;
}
Mein Problem ist jetzt, dass alle als gelesen makiert sind (also true) obwohl das nicht der Fall ist.
Ich kann mir das leider auch nicht erklären, warum das der Fall ist.

So checke ich es und rufe die Funktion auf:

PHP:
if(check_user_read_board($_SESSION['userid'], $data_board['board_id'], $db) === false) echo '<img src="../../img/mainpage/folder_page.png" alt="new" />&nbsp;';
else echo '<img src="../../img/mainpage/folder.png" alt="nothing new" />&nbsp;';
Danke für die Hilfe
 
Wenn ich das richtig sehe, wird bei einer erfolgreichen Abfrage der Wert immer auf true gesetzt und zwar hier
PHP:
if(!empty($result_sel))
    {
        $ba = true;            
    }

Es würde aber eher so Sinn machen, wobei das vor die While-Schleife gehört mit einem return

PHP:
if(empty($result_sel))
    {
        return false;            
    }
 
Habe es jetzt angepasst:

PHP:
function check_user_read_board ($user_id, $board_id, $db)
{
	$ba = false;

	$sel_to = 'SELECT read_user_id FROM board_topics WHERE board_id = "'.$board_id.'"';
	$result_sel = mysql_query($sel_to) OR die(mysql_error());

	if(empty($result_sel))
		{
			return $ba; 
			unset ($ba);			
		} 	
	
	while($data = mysql_fetch_assoc($result_sel))
	{

		$id = explode("-", $data['read_user_id']);
		for($i = 0; $i < count($id); $i++)
		{
			if($id[$i] == $user_id) $ba = true;
			return $ba;
			unset ($ba);
		}		

	}

}

Trotzdem geht es immer noch nicht.
Jetzt wird new bei einigen angezeigt, wo der User bereits alle Themen gelesen hat und die Werte auch richtig in der DB stehen
 
Deine for-Schleife wird jetzt ja nur noch einmal durchlaufen, weil du direkt ein return drin hast.

PHP:
function check_user_read_board ($user_id, $board_id, $db)
{
    $sel_to = 'SELECT read_user_id FROM board_topics WHERE board_id = "'.$board_id.'"';
    $result_sel = mysql_query($sel_to) OR die(mysql_error());

    if(empty($result_sel))
            return false;

    $ba = false;
    
    //keine while-Schleife nötig, weil die Abfrage sowieso nie mehr als eine Zeile liefern kann (board_id eindeutig)
    $data = mysql_fetch_row($result_sel);

    $id = explode("-", $data['read_user_id']);
    for($i = 0; $i < count($id) && !$ba; $i++)
    {
        $ba = ($id[$i] == $user_id);
    }        

    return $ba;

}
 
Also wenn ich es ohne schleife mache, bekomme ich erstmal eine Fehlermeldung.
Baue ich die schleife wieder ein, dann ist es wieder vertauscht, so das in den Foren wo gar keine Beiträge sind, diese als neu gekennzeichnet sind und wo neue Beiträge drinne sind als gelesen makiert ist!
 
Dann würde ich mal den if- und den else-Zweig umdrehen (oder das ===false streichen, weil es dein Ergebnis genau umdreht). Wenn das Forum keine Beiträge hat, springt er ja direkt vor der Schleife mit return false raus. Im false-Fall gibst du aber "New" aus.
PHP:
if(check_user_read_board($_SESSION['userid'], $data_board['board_id'], $db))
    echo '<img src="http://www.tutorials.de/img/mainpage/folder_page.png" alt="new" />&nbsp;';
else
    echo '<img src="http://www.tutorials.de/img/mainpage/folder.png" alt="nothing new" />&nbsp;';

Und wenn du uns die Fehlermeldung nennst, können wir sie auch beheben.

Edit: Oder eben genau umgekehrt. Geh mit einem return true; raus. Je nach dem, was deine Funktion aussagen soll (User hat gelesen oder hat nicht gelesen)
 
Zuletzt bearbeitet:
Also so sieht es jetzt aus:

PHP:
function check_user_read_board ($user_id, $board_id, $db)
{
    $sel_to = 'SELECT read_user_id FROM board_topics WHERE board_id = "'.$board_id.'"';
    $result_sel = mysql_query($sel_to) OR die(mysql_error());

    if(empty($result_sel))
            return false;

    $ba = false;
    
    while($data = mysql_fetch_assoc($result_sel))
    {

        $id = explode("-", $data['read_user_id']);
        for($i = 0; $i < count($id) && !$ba; $i++)
        {
            $ba = ($id[$i] == $user_id);
        }           

    }      

    return $ba;

}

Und so:

PHP:
if(check_user_read_board($_SESSION['userid'], $data_board['board_id'], $db))
 echo '<img src="../../img/mainpage/folder_page.png" alt="new" />&nbsp;';
 else
 echo '<img src="../../img/mainpage/folder.png" alt="nothing new" />&nbsp;';

Jetzt ist es so, dass bei den Foren wo es keine Themen gibt, auch der richtig Ordner erscheint.
Jedoch in den Foren, wo es bereits Beiträge gibt und diese alle gelesen wurden wird es trotzdem als new an gezeigt...
 
Gut, jetzt noch einmal tauschen, dann müsste es gehen :-D

Deine Funktion sagt doch folgendes aus
true = nutzer hat das Forum gelesen
false = nutzer hat das Forum noch nicht gelesen (es gibt ungelesenes)

In einem leeren Forum hat er natürlich schon alles gelesen (gibt ja nichts), also muss es doch return true; heißen.

PHP:
function check_user_read_board ($user_id, $board_id, $db)
{
    $sel_to = 'SELECT read_user_id FROM board_topics WHERE board_id = "'.$board_id.'"';
    $result_sel = mysql_query($sel_to) OR die(mysql_error());

    if(empty($result_sel))
            return true;//leeres Forum, also hat der Nutzer "alles gelesen"

    $ba = false;
    
    while($data = mysql_fetch_assoc($result_sel))
    {

        $id = explode("-", $data['read_user_id']);
        for($i = 0; $i < count($id) && !$ba; $i++)
        {
            $ba = ($id[$i] == $user_id);
        }           

    }      

    return $ba;

}

Und die Abfrage bei der Ausgabe muss umgedreht werden.
PHP:
if(check_user_read_board($_SESSION['userid'], $data_board['board_id'], $db))
    echo '<img src="../../img/mainpage/folder.png" alt="nothing new" />&nbsp;'; //true -> alles gelesen -> nicht neues
else
    echo '<img src="../../img/mainpage/folder_page.png" alt="new" />&nbsp;';//false -> ungelesenes vorhanden
 
Wenn ich es jetzt so mache, wird es in den Foren wo gar keine Beiträge sind wieder falsch angezeigt.

Ich weiß auch warum nur lösen kann ich es nicht.
Also ich prüfe ob die ID vorhanden ist, wenn nicht dann hat er es noch nicht gelesen.
Da in den leeren Foren die ID nicht vorhanden sein kann, wird es als noch nicht gelesen angezeigt.
Also müssten wir die Funktion so erweiteren, das leere Foren besonderes berücksichtigt werden!
 
Habe jetzt festgestellt, dass das Script, nicht mal in diesen Part hier:

PHP:
    if(empty($result_sel))
            return true;//leeres Forum, also hat der Nutzer "alles gelesen"

Keine Ahnung warum nicht.
Wenn ich nur $result_sel ausgeben lasse, dann steht dort immer nur Ressource ID.
Aber er geht einfach nicht in das emtpy rein.
 
Zurück