PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anzahl zurzeit aktive Benutzer mit SQL


Erich
19.02.2006, 20:50
Hallo.

Ich möchte "ausserhalb" von vB über SQL folgende Informationen abfragen:

Anzahl zurzeit aktive, registrierte Benutzer
Anzahl zurzeit aktive Gäste
und am Besten die Usernamen der aktiveb Benutzer

Kann mir jemand das SQL-Statement nennen? Oder einen Codeschnipsel?

Danke
Erich

StGaensler
19.02.2006, 22:05
SELECT COUNT( userid ) AS members FROM session WHERE userid > 0;
SELECT COUNT( userid ) AS guests FROM session WHERE userid = 0;
SELECT user.username AS username FROM session LEFT JOIN user ON user.userid = session.userid;

Das wären die drei Querys, die du haben willst. Bei mir funktionieren sie - ich hoffe, bei dir auch. Wenn du ein Tabellenpräfix verwendest, musst du dieses noch vor die Tabellennamen setzen.

Viele Grüße,
Stefan

Erich
23.02.2006, 20:00
Bei mir stimmt es nicht. In der Tabelle session werden User doppelt und dreifach aufgelistet. Muss man noch ein GROUP BY machen?

Erich

Mystics
23.02.2006, 21:18
SELECT COUNT(userid) AS members FROM session WHERE userid > 0 AND lastactivity >= (UNIX_TIMESTAMP() - 900);

SELECT COUNT(userid) AS guests FROM session WHERE userid = 0 AND lastactivity >= (UNIX_TIMESTAMP() - 900);

900 = dein Cookie-Timeout (Standard: 900 Sekunden)

Erich
23.02.2006, 22:15
Jetzt sieht es zwar etwas besser aus aber ich komme nicht auf die selben Werte wie im Forum. Manschmal sind es doppelt so viel. Noch eine Idee?

Ich hab zwar nichts geändert aber wo stellt man den Cookie-Timeout ein?

Erich

bunny
23.02.2006, 22:25
@Mystics: Was ist mit dem Mitgliedern die nicht angezeigt werden wollen. :)

@Erich: Du nimmst ein Feld. Die ID des Benutzer ist Position im Feld. Nun fügst du alle Benutzer in das Feld ein. Z.B.


feld[1] = 'Chef';
feld[2] = 'Hans';
feld[1] = 'Chef';


Danach durchläufst du das Feld und gibt die Benutzer aus.

mfg Benjamin

Mystics
23.02.2006, 22:41
Jetzt sieht es zwar etwas besser aus aber ich komme nicht auf die selben Werte wie im Forum. Manschmal sind es doppelt so viel. Noch eine Idee?Bei uns stimmt das genau überein.

Füge bei den registrierten Benutzern noch ein GROUP BY userid hinzu.Ich hab zwar nichts geändert aber wo stellt man den Cookie-Timeout ein?Administrator-Kontrollzentrum -> vBulletin-Einstellungen -> Cookies und HTTP-Header -> Cookie-Timeout@Mystics: Was ist mit dem Mitgliedern die nicht angezeigt werden wollen.Die Zahlen bei "Zurzeit aktive Benutzer" enthalten auch immer die unsichtbaren Benutzer.

bunny
23.02.2006, 22:50
Die Zahlen bei "Zurzeit aktive Benutzer" enthalten auch immer die unsichtbaren Benutzer. Sry, hatte überlesen, dass du die Benutzer nicht ausgeben willst. Ist ja auch schon spät :D

Erich
24.02.2006, 10:08
Cookie-Timeout ist bei mir auch 900

Ich bekommen folgende Ergebnisse:

SQL-Befehl:
SELECT COUNT( userid ) AS members FROM session WHERE userid >0 AND lastactivity >= ( UNIX_TIMESTAMP( ) -900 )

members
25

SQL-Befehl:
SELECT COUNT( userid ) AS members FROM session WHERE userid >0 AND lastactivity >= ( UNIX_TIMESTAMP( ) -900 ) GROUP BY userid

members
1
1
1
10
10
1
1


7 wäre die richtige Anzahl. Jetzt könnte man mit reccount (muss mal nachsehen wie es genau heißt) auf die richtige Anzahl kommen.

Komisch dass es bei Mystics stimmt.

@bunny
Das ist eine Möglichkeit für die Ausgabe der Namen. Es war nicht umsonst ;)

Erich

Mystics
24.02.2006, 18:28
Probiere mal:

SELECT COUNT(DISTINCT userid) AS members FROM session WHERE userid > 0 AND lastactivity >= (UNIX_TIMESTAMP( ) - 900);

Erich
26.02.2006, 12:00
Meine vorerst endgültigen SQL-Statements:

User registriert
SELECT COUNT( userid ) AS members FROM " . $TABLE_PREFIX . "user WHERE userid > 0

User online registriert
$SQL = "SELECT COUNT(DISTINCT userid ) AS members FROM " . $TABLE_PREFIX . "session WHERE userid > 0 AND lastactivity >= (UNIX_TIMESTAMP() - 900)";


User online Gast
$SQL = "SELECT COUNT( userid ) AS members FROM " . $TABLE_PREFIX . "session WHERE userid = 0 AND lastactivity >= (UNIX_TIMESTAMP() - 900)";

User online registriert list
$SQL = "SELECT DISTINCT user.username AS username FROM " . $TABLE_PREFIX . "session as session," . $TABLE_PREFIX . "user as user where user.userid = session.userid AND session.lastactivity >= (UNIX_TIMESTAMP() - 900)";

Danke
Erich

velimir
28.02.2006, 23:15
Hallo erstmal,

ich bin ein sehr ungeübeter Zeitgenosse und würde bitten, falls jemand Zeit und Lust hat, mir zu helfen diesen Code Idiotensicher aufzuschreiben wie er in eine Html Seite eingebunden wird.
Falls das garnicht möglich ist dann den Code für eine PHP Seite.
Ich hoffe ich hab mich verständlich ausgedrückt. :o

Danke im Vorraus :)

srahmel
21.04.2007, 02:09
$TABLE_PREFIX="DeinPrefix";
$database = "DeineDB";
$db = mysql_connect("Deinhost", "Deinuser", "Deinpasswort");
@mysql_select_db($database, $db) or die ("Nicht gefunden");

$sql_select="SELECT COUNT( userid ) AS members FROM ".$TABLE_PREFIX."user WHERE userid > 0";
$result = mysql_query($sql_select);
if ($result)
{
$return=mysql_fetch_row($result);
$benutzer_gesamt=$return[0];
} else { die ("ERROR " . mysql_errno($db) . " " . mysql_error($db)); }
$SQL = "SELECT COUNT( userid ) AS members FROM " . $TABLE_PREFIX . "session WHERE userid = 0 AND lastactivity >= (UNIX_TIMESTAMP() - 900)";

$benutzer_online=0;
//Gäste online
$sql_select="SELECT COUNT( userid ) AS members FROM " . $TABLE_PREFIX . "session WHERE userid = 0 AND lastactivity >= (UNIX_TIMESTAMP() - 900)";
$result = mysql_query($sql_select);
if ($result)
{
$return=mysql_fetch_row($result);
$benutzer_online=$benutzer_online+$return[0];
} else { die ("ERROR " . mysql_errno($db) . " " . mysql_error($db)); }


//Registrierte Benutzer online
$sql_select="SELECT COUNT(DISTINCT userid ) AS members FROM " . $TABLE_PREFIX . "session WHERE userid > 0 AND lastactivity >= (UNIX_TIMESTAMP() - 900)";
$result = mysql_query($sql_select);
if ($result)
{
$return=mysql_fetch_row($result);
$benutzer_registriert=$return[0];
$benutzer_online=$benutzer_online+$benutzer_registriert;
} else { die ("ERROR " . mysql_errno($db) . " " . mysql_error($db)); }

//Registrierte Benutzer darstellen
$sql_select = "
SELECT DISTINCT username
FROM ".$TABLE_PREFIX."user
LEFT JOIN ".$TABLE_PREFIX."session ON ".$TABLE_PREFIX."user.userid = ".$TABLE_PREFIX."session.userid
WHERE ".$TABLE_PREFIX."session.lastactivity >= (UNIX_TIMESTAMP() - 900)";
$result = mysql_query($sql_select);
if ($result)
{
while($return=mysql_fetch_row($result))
{
$benutzer[]=$return[0];
}
} else { die ("ERROR " . mysql_errno($db) . " " . mysql_error($db)); }

//print_r($benutzer);
if (count($benutzer)!=0) { $user=implode(",",$benutzer); }
else $user="niemand";

echo "<b>Benutzer online (davon reg.)</b>: ".number_format($benutzer_online,0,',','.')." (".number_format($benutzer_registriert,0,',','.').") <b>Benutzer registriert</b>: ".number_format($benutzer_gesamt,0,',','.')."<br />";
echo "<b>Aktuell im Forum</b> ".$user;

hcmagix
21.04.2007, 02:23
Post 12 28.02.2006, 23:15
Post 13 Heute, 02:09

Hatte schon einen Schreck bekommen :)

srahmel
21.04.2007, 12:49
Wieso denn einen Schreck? Weil so lange keiner geantwortet hat?