Webmaster Forum von Webmaster-Resource.de
»
Sonstiges
»
Scripte
(Moderator:
» тнє $υι¢ι∂є « ™
)
[PHP | MYSQL] Usere Online
Username:
1 Stunde
1 Tag
1 Woche
1 Monat
Immer
Password:
Übersicht
Hilfe
Suche
Quick Search
Advanced Search
Einloggen
Registrieren
« vorheriges
nächstes »
Seiten: [
1
]
Topic Tools
Topic Tools
Drucken
30. Oktober 2006, 20:59:50
#0
krafdi
krafdi
Show krafdi's last posts.
Show general stats for krafdi.
Newbie
Beiträge: 13
[PHP | MYSQL] Usere Online
Suche ein PHP script welches mir anzeigt wie viele usere gerade online sind.
Gruß
Krafdi
«
Letzte Änderung: 20. April 2007, 12:53:45 von EpiX
»
Fehlender Plan wird durch Wahnsinn ersetzt!!
30. Oktober 2006, 21:19:52
#1
Daniel
Daniel
Visit Daniel's website.
Show Daniel's last posts.
Show general stats for Daniel.
Webseiten-Junkie
Beiträge: 296
Usere Online
TIP: zähle die Dateien im SESSION-Ordner, event. noch den letzten Zugriff auf die Datei feststellen und Du weißt wieviele User ON sind.
(Bedingung: alles läuft über Session's und Du hast einen separaten SESSION-Ordner falls Du norm. WebSpace hast).
Daniel
30. Oktober 2006, 23:19:27
#2
vind
vind
Show vind's last posts.
Show general stats for vind.
PHP Scripter
Beiträge: 200
/b/-tard
Usere Online
Wo ist dieser Ordner denn Lokal (in meinem fall apache) zu finden?
31. Oktober 2006, 04:25:43
#3
Daniel
Daniel
Visit Daniel's website.
Show Daniel's last posts.
Show general stats for Daniel.
Webseiten-Junkie
Beiträge: 296
Usere Online
Zitat von: vind
Wo ist dieser Ordner denn Lokal (in meinem fall apache) zu finden?
Moin!
Code:
<?php
session_save_path
&
#40;'d:/wohin_ich_will/');
sesson_start
&
#40;);
?>
PHP benötigt Schreibrecht für den Ordner!! (in meinem Fall auf einem Win2k3 Server). Also bei anderen nicht MS-OS könnte der Pfad dann z.B. so aussehen:
/home/u/user1/public_html/secure/
Mit stat() kannst Du dann Dateiinfos auslesen.
Eine weitere Möglichkeit wäre, die Sache über eine SQL-Datenbank zu machen.
Datenbank SESSION anlegen mit Feldern: ID:SESS-ID:INSERT-DATE.
starten mit
Code:
<?php
session_start
&
#40;);
//DATENBANKVERBINDUNG hier rein
if&
#40;!$_SESSION[sess_id]) {
$_SESSION
[
sess_id
&
#93;=session_id();
$date
=
time
&
#40;);
mysql_query
&
#40;"INSERT INTO SESSION (SESS-ID, INSERT-DATE) VALUES ('$_SESSION[sess_id]',$date)", $db);
$_SESSION
[
sess_in
&
#93;= mysql_insert_id();
&
#125;
else
&
#123;
$date
=
time
&
#40;);
mysql_query
&
#40;"UPDATE SESSION SET INSERT-DATE=$date WHERE id=$_SESSION[sess_in]", $db);
&
#125;
$activ
=
$date
-
300
;
//300 sec
mysql_query
&
#40;"DELETE FROM SESSION WHERE INSERT-DATE<$activ", $db);
// Jetzt die Datenbank nach Anzahl abfragen
?>
Habe den Code nicht geprüft, muß gleich los zur Arbeit.
Daniel
31. Oktober 2006, 07:50:18
#4
inky
inky
Visit inky's website.
Show inky's last posts.
Show general stats for inky.
HTML Scripter
Beiträge: 66
Usere Online
Also das von Daniel müsste schon passen. Ich hab das "User online" Script auch auf meiner Homepage allerdings anderst.
Ich möchte es auch zeigen und die Funktion/Denkweiße erklären
Gennerell direkt lässt es sich nicht zählen, ob und wieviel Besucher gerade online sind. Für meine Methode brauchen wir ne Datenbank. Dort speichern wir die ip des Besuchers und das Datum + Zeit zu dem Zeitpunkt, wo er gerade die Seite aufgerufen hat. Bsp. Besuer mit ip xxx.xxx.xxx.xx hat die Homepage um 17:15 Uhr betreten. Das ist jetzt abgespeichert.
Jetzt speichert es aber alle ab auch wenn diese schon n Tag vorher sind. Dazu müssen wir ältere Einträge löschen. Wir baun ein Script, das alle Einträge die älter sind wie 1 Minute löschen. Dann haben wir die Onlineanzahl der Besucher auf eine Minute genau.
Wenn ein Besucher aber schon Eingetragen ist und die seite weiter durchstöbert müssen wir bei jedem Seitenaufruf seine Zeit aktuell setzten, das er nicht gelöscht wird. Liest der Besucher jetzt aber 5 Minuten einen Text durch ist er ja noch online hat aber 5 Minuten nicht seine Seite aktualisiert um seine Zeit wieder aktuell zu setzen. Sprich sie ist 5min alt und wird gelöscht, weil wir ja nur 1 Min. eingestellt haben. Ich Empfehle eine Zeit zwischen 5 und 10 Min. Sollte er dann Die seite immer noch nicht Aktualisieren wirds nichts ausmachen ihn Offline anzeigen zu lassen.
Zur Datenbank:
Das feld für Zeit und Datum muss als "datetime" angegeben werden
Mein script:
Code:
$ip = getenv("REMOTE_ADDR"); // Hier holen wir die ip des Besuchers
$abfrage = "SELECT * FROM useronline WHERE ip='$ip'"; //Wir fragen in der Tabelle "useronline" alle einträge ab mit der ip des Besuchers
$result = mysql_query($abfrage) or die("Anfrage fehlgeschlagen: " . mysql_error());
$useronline= mysql_num_rows($result); //Wir zählen die Treffer
if ($useronline == "0") // Keine Treffer bedeutet das der Besucher noch nicht Eingetragen wurde
{
$eintrag = "INSERT INTO useronline
(ip, datum)
VALUES
('$ip', NOW())";
$eintragen = mysql_query($eintrag); // Wir tragen die ip und das jetzige Datum (NOW) in die Tabelle ein
}
else // Wenn der User schon eingetragen wurde müssen wir seine Zeit aktualisieren damit er nicht gelöscht wird
{
$aendern = "UPDATE useronline Set datum = NOW() WHERE ip='$ip' LIMIT 1" ;
$update = mysql_query($aendern);
}
}
$sql = "DELETE FROM
useronline
WHERE
DATE_SUB(NOW(), INTERVAL 5 MINUTE) > datum";
mysql_query($sql) OR die(mysql_error()); // Mit diesem Befehl löschen wir alle Einträge die älter sind als 5 Minute
Und jetzt nur noch alle Einträge abfragen und Zählen schon hat man die Anzahl der Besucher, die sich gerade auf der Seite tummeln
Code:
<?
$abfrage = "SELECT * FROM useronline";
$result = mysql_query($abfrage) or die("Anfrage fehlgeschlagen: " . mysql_error());
$online = mysql_num_rows($result);
echo = "Besucher Online: $online";
?>
Tipp: Um das es funktioniert muss auf jeder seite dieses Script gesezt werden. Hilfreich ist es das Ding extra in ne Datei zu packen und dann per include auf jede seite einzufügen.
Ich hoff es ist verständlich geschrieben
ps: Der code ist nicht gerade kurz gehalten aber er ist mein geschmack und für mich so am übersichtlichsten
31. Oktober 2006, 15:18:06
#5
krafdi
krafdi
Show krafdi's last posts.
Show general stats for krafdi.
Newbie
Beiträge: 13
Usere Online
Danke euch allen!
Ich habe mich für die variante mit DB entschieden. Habe nur noch ein Feld mit Uhrzeit angelegt und gebe diese dann noch mit aus! Auf Wunsch kann ich den Code noch Posten.
Grüße
Krafdi
Fehlender Plan wird durch Wahnsinn ersetzt!!
31. Oktober 2006, 15:19:48
#6
s.wokal
s.wokal
Show s.wokal's last posts.
Show general stats for s.wokal.
PHP Scripter
Beiträge: 131
Usere Online
Klar würd mich freuen wenn du den Code noch reinschreibst! Kann immer Hilfreich sein!
Danke
zu 80% Fertig!
31. Oktober 2006, 16:26:16
#7
vind
vind
Show vind's last posts.
Show general stats for vind.
PHP Scripter
Beiträge: 200
/b/-tard
Usere Online
Zitat von: Daniel
Zitat von: vind
Wo ist dieser Ordner denn Lokal (in meinem fall apache) zu finden?
Moin!
Code:
<?php
session_save_path
&
#40;'d:/wohin_ich_will/');
sesson_start
&
#40;);
?>
PHP benötigt Schreibrecht für den Ordner!! (in meinem Fall auf einem Win2k3 Server). Also bei anderen nicht MS-OS könnte der Pfad dann z.B. so aussehen:
/home/u/user1/public_html/secure/
Mit stat() kannst Du dann Dateiinfos auslesen.
Eine weitere Möglichkeit wäre, die Sache über eine SQL-Datenbank zu machen.
Datenbank SESSION anlegen mit Feldern: ID:SESS-ID:INSERT-DATE.
starten mit
Code:
<?php
session_start
&
#40;);
//DATENBANKVERBINDUNG hier rein
if&
#40;!$_SESSION[sess_id]) {
$_SESSION
[
sess_id
&
#93;=session_id();
$date
=
time
&
#40;);
mysql_query
&
#40;"INSERT INTO SESSION (SESS-ID, INSERT-DATE) VALUES ('$_SESSION[sess_id]',$date)", $db);
$_SESSION
[
sess_in
&
#93;= mysql_insert_id();
&
#125;
else
&
#123;
$date
=
time
&
#40;);
mysql_query
&
#40;"UPDATE SESSION SET INSERT-DATE=$date WHERE id=$_SESSION[sess_in]", $db);
&
#125;
$activ
=
$date
-
300
;
//300 sec
mysql_query
&
#40;"DELETE FROM SESSION WHERE INSERT-DATE<$activ", $db);
// Jetzt die Datenbank nach Anzahl abfragen
?>
Habe den Code nicht geprüft, muß gleich los zur Arbeit.
Daniel
Danke, werde es die kommende Woche mal ausprobieren!
31. Oktober 2006, 20:56:29
#8
krafdi
krafdi
Show krafdi's last posts.
Show general stats for krafdi.
Newbie
Beiträge: 13
Usere Online
Zu erst habe ich folgende Tabelle angelegt.
Code:
CREATE TABLE sm_useronline (
kid int(11) NOT NULL auto_increment,
id char(255) default NULL,
ip char(255) default NULL,
name char(255) default NULL,
zeitid char(255) default NULL,
PRIMARY KEY (kid)
) TYPE=MyISAM CHARSET=latin1;
Danach habe ich in eine zentrale datei welche ich include (functions.php) folgenden Code geschrieben.
Code:
<?php
// Onlineuser Tabelle
$logtab
=
"sm_userstats"
;
// Zeitlimit in Sekunden
$zeitlimit
=
"600"
;
// Zeit und Datum
$aktzeit
=
date
&
#40;"d-m-Y H:i");
$zeit
=
explode
&
#40; " ", microtime());
$userusek
= &
#40;double)$zeit[0];
$usersek
= &
#40;double)$zeit[1];
$User_Id
=
$usersek
+
$userusek
;
$IP
=
getenv
&
#40;REMOTE_ADDR);
// Onlineuser entfernen, sobald das Zeitlimit
// überschritten wurde
mysql_query
&
#40;"delete from $logtab where zeitid < $usersek -$zeitlimit");
// IP-Adresse prüfen
$satz
=
mysql_query
&
#40;"SELECT * FROM $logtab where ip like '$IP'");
@
$userlog
=
mysql_fetch_row
&
#40;$satz);
// Neuen Onlineuser hinzufügen fals IP-Adresse
// noch nicht in der logtab vorhanden
if &
#40;$userlog == false) {
mysql_query
&
#40;"insert INTO $logtab (id,ip,name,zeitid)
VALUES
&
#40;'$User_Id','$IP','$_SERVER[HTTP_HOST]','$usersek')") or die($db_fehler2);
&
#125;
// Anzahl der Onlineuser ermitteln
$res_logtab
=
mysql_query
&
#40;"SELECT Count(*) as gesamt FROM $logtab");
$numberlogtab
=
mysql_fetch_array
&
#40;$res_logtab);
// Anzahl der Online-User ausgeben
if &
#40;!empty($numberlogtab[gesamt])){
$useronline
=
"$numberlogtab[gesamt]"
;
$akttime
=
"$aktzeit"
;
&
#125;
?>
Diesen binde ich per require ("./functions.php"); die Datei ein.
Danach kann ich an jeder beliebigen stelle mit $useronline die Anzahl der aktuellen Online user ausgeben und mit $akttime die Zeit des letzten Seiten Aufrufs.
Fehlender Plan wird durch Wahnsinn ersetzt!!
01. November 2006, 05:39:13
#9
Daniel
Daniel
Visit Daniel's website.
Show Daniel's last posts.
Show general stats for Daniel.
Webseiten-Junkie
Beiträge: 296
Usere Online
Guten Morgen,
finde die Variante mit der IP auch recht gut, allerdings ist mir da beim testen etwas aufgefallen:
Ich habe in meinem privaten Netzwerk 5 PC's, wenn alle auf der Seite sind wird aber trotzdem nur 1 User online angezeigt. Liegt das am IP-Sharing?
Daniel
01. November 2006, 09:45:19
#10
Zabi
Zabi
Visit Zabi's website.
Show Zabi's last posts.
Show general stats for Zabi.
PHP Scripter
Beiträge: 108
Usere Online
Zitat von: Daniel
Ich habe in meinem privaten Netzwerk 5 PC's, wenn alle auf der Seite sind wird aber trotzdem nur 1 User online angezeigt. Liegt das am IP-Sharing?
Daniel
Es liegt am sog. "Natting" - du benutzt lokal völlig andere IP Adressen als extern. Nach außen hin wirkt es immer so als ob nur ein PC da wäre.
Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will.
(Galileo Galilei)
www.zabulus.de
05. November 2006, 15:38:55
#11
vind
vind
Show vind's last posts.
Show general stats for vind.
PHP Scripter
Beiträge: 200
/b/-tard
Usere Online
Zitat von: krafdi
Zu erst habe ich folgende Tabelle angelegt.
Code:
CREATE TABLE sm_useronline (
kid int(11) NOT NULL auto_increment,
id char(255) default NULL,
ip char(255) default NULL,
name char(255) default NULL,
zeitid char(255) default NULL,
PRIMARY KEY (kid)
) TYPE=MyISAM CHARSET=latin1;
Danach habe ich in eine zentrale datei welche ich include (functions.php) folgenden Code geschrieben.
Code:
<?php
// Onlineuser Tabelle
$logtab
=
"sm_userstats"
;
// Zeitlimit in Sekunden
$zeitlimit
=
"600"
;
// Zeit und Datum
$aktzeit
=
date
&
#40;"d-m-Y H:i");
$zeit
=
explode
&
#40; " ", microtime());
$userusek
= &
#40;double)$zeit[0];
$usersek
= &
#40;double)$zeit[1];
$User_Id
=
$usersek
+
$userusek
;
$IP
=
getenv
&
#40;REMOTE_ADDR);
// Onlineuser entfernen, sobald das Zeitlimit
// überschritten wurde
mysql_query
&
#40;"delete from $logtab where zeitid < $usersek -$zeitlimit");
// IP-Adresse prüfen
$satz
=
mysql_query
&
#40;"SELECT * FROM $logtab where ip like '$IP'");
@
$userlog
=
mysql_fetch_row
&
#40;$satz);
// Neuen Onlineuser hinzufügen fals IP-Adresse
// noch nicht in der logtab vorhanden
if &
#40;$userlog == false) {
mysql_query
&
#40;"insert INTO $logtab (id,ip,name,zeitid)
VALUES
&
#40;'$User_Id','$IP','$_SERVER[HTTP_HOST]','$usersek')") or die($db_fehler2);
&
#125;
// Anzahl der Onlineuser ermitteln
$res_logtab
=
mysql_query
&
#40;"SELECT Count(*) as gesamt FROM $logtab");
$numberlogtab
=
mysql_fetch_array
&
#40;$res_logtab);
// Anzahl der Online-User ausgeben
if &
#40;!empty($numberlogtab[gesamt])){
$useronline
=
"$numberlogtab[gesamt]"
;
$akttime
=
"$aktzeit"
;
&
#125;
?>
Diesen binde ich per require ("./functions.php"); die Datei ein.
Danach kann ich an jeder beliebigen stelle mit $useronline die Anzahl der aktuellen Online user ausgeben und mit $akttime die Zeit des letzten Seiten Aufrufs.
Wieso gleich eine neue Tabelle anlegen? Wenn du ein usersystem hast kannst du es ja direkt in die Tabelle mit den Benutzernamen einarbeiten.
Warum ich darauf hinweise? Billige Hosts haben immer eine limitierte Anzahl von DB's und Tabellen, die man einrichten kann. Aber naja, Lokal zum testen isses ja egal.
11. November 2006, 00:34:26
#12
Oetzi
Oetzi
Visit Oetzi's website.
Show Oetzi's last posts.
Show general stats for Oetzi.
PHP Scripter
Beiträge: 163
Usere Online
Zitat von: Daniel
Ich habe in meinem privaten Netzwerk 5 PC's, wenn alle auf der Seite sind wird aber trotzdem nur 1 User online angezeigt. Liegt das am IP-Sharing?
naja das liegt an der Trennung WAN und LAN durch deinen Router. Weil für den Webserver nur die WAN-IP sichtbar ist und dein Router des dann nach intern entsprechend verteilt. Das ist dann natürlich nicht nur bei dir daheim so sondern auch bei Uni-Netzwerken, Firmen-Netzwerken usw. Also allen Netzen wo mehrere Rechner in einem LAN zusammengefasst sind und über ein gemeinsames Gateway die Internetverbindung herstellen. Wenn du trotzdem alle online-pcs aufgelistet haben möchtest bleibt dir eigentlich nur die Möglichkeit des sauber zu lösen über den Vorschlag mit den sessions zu arbeiten. Aber vllt kannst du auch ne Kombination aus beidem machen.
Nämlich ne DB-Lösung wie oben vorgeschlagen nur anstelle der ip-adresse
die session-id speichern. Die bekommst du mit der Funktion session_id(), Diese sollte wenn dein Webserver richtig konfiguriert ist eigentlich aufjedenfall eindeutig für jeden Browser sein für eine längere Zeitspanne.
Sag niemals nie, es sei denn du meinst es ernst?
Johannes Ott
Webmaster
My Tie - Rock&Pop Covers
Webmaster
Jugendkirche Nürnberg
11. November 2006, 01:10:25
#13
Oetzi
Oetzi
Visit Oetzi's website.
Show Oetzi's last posts.
Show general stats for Oetzi.
PHP Scripter
Beiträge: 163
Usere Online
Mein vorgeschlagene Tabelle würde wie folgt ausschauen
Code:
CREATE TABLE `online_user` (
`id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`session_id` VARCHAR( 255 ) NOT NULL ,
`last_klick` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL ,
PRIMARY KEY ( `id` ) ,
INDEX ( `session_id` )
);
und der entsprechende php-code
Code:
<?php
session_start
&
#40;);
$limit
=
10
//minuten
//open db-connection
mysql_query
&
#40;"UPDATE online_users
SET last_klick
=
NOW
&
#40;)
WHERE session_id
=
'".session_id()."'");
if (mysql_affected_rows() == 0) {
mysql_query("
INSERT INTO online_users
&
#40;session_id)
VALUES
&
#40;'".session_id()."')");
&
#125;
mysql_query
&
#40;"DELETE FROM online_users
WHERE last_klick
<
DATE_SUB
&
#40;NOW(), INTERVAL ".$limit." MINUTE)");
$result
=
mysql_query
&
#40;SELECT COUNT(*) as users FROM online_users);
$anzahl
=
mysql_result
&
#40;$result, 0, "users");
?>
Sag niemals nie, es sei denn du meinst es ernst?
Johannes Ott
Webmaster
My Tie - Rock&Pop Covers
Webmaster
Jugendkirche Nürnberg
Seiten: [
1
]
« vorheriges
nächstes »
Gehe zu:
Bitte wählen Sie ein Ziel:
-----------------------------
Aktuelles
-----------------------------
=> Ankündigungen und Regeln
=> Feedback zum Forum
-----------------------------
Webcoding
-----------------------------
=> PHP
=> Datenbanken
=> HTML, CSS und Javascript
=> Weitere Sprachen (ASP, Coldfusion, Perl etc.)
=> Webserver
-----------------------------
SEO
-----------------------------
=> Saubere Seo Techniken
===> Scripte & Software
===> Linktausch & Linkpartner finden
===> Allgemeine Fragen
===> Linkbuilding
===> Content generieren
===> Blog & Ping
===> Scripts & Software
-----------------------------
Online Marketing
-----------------------------
=> Affiliate Marketing
=> Email Marketing
=> Suchmaschinen Marketing
-----------------------------
Sonstiges
-----------------------------
=> Scripte
=> Tutorials
=> Browser und Software
=> Betriebssysteme
=> Jobangebote / Jobgesuche
=> Off-Topic
=> Test-Forum
Lade...