'Wer ist online'-Script mit PHP/MySQL

Linaloya

Grünschnabel
Hallihallo.

Ich versuche zur Zeit ein "Wer ist gerade online"-Script zu schreiben. Allerdings bekomm ich nie ein Ergebnis. Hier erstmal der Code:

PHP:
function whoisonline($anzahl)
         {

         	$sql = "SELECT
                 		name_anzeige
                         FROM
                         	profil_daten
                         WHERE
                         	DATE_SUB(CURDATE(),INTERVAL 5 MINUTE) <= zuletzt_aktiv;
                        ";

                 $result = mysql_query($sql) OR die(mysql_error());


                 $arr = array();
    		for($i=0;$i<$anzahl;$i++)
    		{
      			$arr[$i] = mysql_fetch_array($result);
    		}

    		return($arr);
         }


Und zwar:
Zuerst lese ich alle Namen der Benutzer (name_anzeige) aus der Tabelle aus, wo 'zuletzt_aktiv' (ein datetime) größer ist als das intervall der letzten 5 minuten.

und dann speicher ich jeden namen in $arr.

wenn ich das nun versuche auszugeben, bekomm ich immer nur ein 'Array' als echo. allerdings weiß ich auch nicht ganz exakt wie die ausgabe jetzt auszusehen hat.

Vielleicht kann mir ja wer helfen?

Dankeschön. Linaloya
 
Zuletzt bearbeitet:
Wo wird denn $anzahl definiert?

Ich empfehle dir statt
PHP:
<?php
    		for($i=0;$i<$anzahl;$i++)
    		{
      			$arr[$i] = mysql_fetch_array($result);
    		}
Folgendes zu verwenden:
PHP:
<?php
    		while ($arr[] = mysql_fetch_assoc($result))
                    ;
// oder
    		while ($fetch = mysql_fetch_assoc($result)) {
                    $arr[] = $fetch;
                }

mysql_fetch_array erzeugt unnötiges Overhead ;)
 
Erstell dir lieber eine Tabelle, wo du speicherst, wer online ist, mit SessionID etc. und über die du auch die Leute dann ausloggst, sollten Sie zu lange inaktiv sein.
 
Wenn du nur die Namen haben willst kannst du implode() verwenden und sie mit komma sperieren. Wenn sie noch anklickbar sein sollen auf ihre ID Profile müsstest du dein script noch ein wenig umbauen.
 
hm, schonmal danke für die Tipps.

$anzahl wurde von mir so übergeben, einfach mit whoisonline(4) damit ich bestimmen konnte, wie viele der Online-Seier anzeigen lassen konnte.

ich hab jetzt mal etwas anderes versucht, und zwar einfach ein weiteres Feld in meiner Tabelle eingefügt. Das heißt jetzt 'online' und soll durch eine Abfrage auf jeder Seite aktualisiert werden. Das heißt alle User, die vor weniger als 5 Minuten ihre letzte Aktivität gemacht haben, sollen ein 'true'' dort gesetzt bekommen. Alle anderen ein 'false'

Allerdings klappt das auch nicht so wie ich wollte =/

Hier mal mein Code:

PHP:
          $online = "UPDATE
                 		login
    			  SET
                          	online = 1
    			  WHERE
                         	(SELECT id FROM profil_daten WHERE DATE_SUB(CURDATE(), INTERVAL 5 MINUTE) <= zuletzt_aktiv )  = login.id
                          ";

     		mysql_query($online);

                 $online = "UPDATE
                 		login
    			  SET
                          	online = 0
                           WHERE
                         	(SELECT id FROM profil_daten WHERE DATE_SUB(CURDATE(), INTERVAL 5 MINUTE) >= zuletzt_aktiv )  = login.id
                          ";

     		mysql_query($online);


Dazu muss gesagt werden, dass das 'online' in der Tabelle 'login' steht, und das 'zuletzt_aktiv' in 'profil_daten'
 
Zuletzt bearbeitet:
Das Subselect sollte ein "LIMIT 1" haben, sonst hast Du ein Subselect, dass 70.000 User selektiert ...klar, dass die dann alle onine sind, da es eine Mehrfachauswahl ist ;)
 
aber findet er denn dann trotzdem alle?


hab das gemacht, aber trotzdem ist mein User mit der id 1 IMMER online. und andere nie =/
 
Zuletzt bearbeitet:
Hm, hast du in beiden subselects das Limit auf 1 gesetzt ? ...anders kann ich mir dieses verhalten nicht erklären. Du kannst auch mal schauen, was das subselect zurück gibt, wenn du es einzeln aufrufst - vielleicht kommt da ja ein fehler zum vorschein
 
ja habe ich. und in den Subselects bekomme ich beim ersten den User mit id=1, egal ob er nun in den letzten 5 mins aktiv war oder nicht. hab auch schon manuel das zuletzt_aktiv auf vor 20 Minuten gestellt, Ergebnis war wieder ID=1

beim zweiten Subselect kommt immer id= 3 raus. das ist jemand, der noch nie aktiv war (also zuletzt_aktiv = 00.00.0000 00:00:00) aber ich denke dieses Problem wird sich wohl lösen, wenn das erste geklärt ist =/
 
was beschreibt denn das feld "zuletzt_aktiv" ? wenn es datetime ist wäre NOW() besser:

SQL:
...WHERE DATE_SUB(NOW(), INTERVAL 5 MINUTE) >= zuletzt_aktiv
 
Zurück