PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   Probleme bei nem user online Script (http://www.selfphp.de/forum/showthread.php?t=9170)

KiKoN 27.11.2004 14:25:34

Probleme bei nem user online Script
 
Hi

Ich habe ein Code Schnipsel umgeformt was anzeigt weviel User auf meine Seite online sind.
Ich hab das ein bissel umgeschrieben.
So das nur angemeldete User bei mein kleines cms als online angezeigt. Also keine Gäste, nur registrierte user.

Folgendes ist dabei rausgekommen:

PHP-Code:

$online_time=600;                // Zeit für wie lange ein User als online gezählt werden
                                // soll (in sec - 600 = 10min)
//neuen besucher registrieren (mit ip und zeit)
function insert_new(){
 global 
$conn;
 global 
$pid;
    
mysql_query("INSERT INTO users (ip, lastact) VALUES ('".$_SERVER[REMOTE_ADDR]."', '".time()."') WHERE ID='$pid'");
    
$query=mysql_query("SELECT * FROM counter_count");
    
$count=mysql_fetch_object($query);
    
$count_query=mysql_query("UPDATE counter_count SET count='".($count->count+1)."'");
}
//besucherzahl ansehen
function see(){
 global 
$conn;

    
$query=mysql_query("SELECT * FROM counter_count");
    
$see=mysql_fetch_object($query);
    echo 
$see->count;
}
//checken, ob der aktuelle besuche mit seiner ip schon registriert ist.
//wenn nicht, dann wird funktion insert_new() aufgerufen, welche ihn registriert
function check(){
 global 
$conn;

    
$query=mysql_query("SELECT * FROM users WHERE ip='".$_SERVER[REMOTE_ADDR]."'");
    
$data=mysql_fetch_object($query);
    if(!
$data->ip){
        
insert_new();
    }
}
//hier wird die onlinezeit des aktuellen besuchers aktualsiert, damit die
//online anzeige immer up to date ist
function update(){
 global 
$conn;
    
mysql_query("UPDATE users SET lastact='".time()."' WHERE ip='".$_SERVER[REMOTE_ADDR]."'");
}
//mit dieser funktion wird die anzahl der aktuell als online zählenden user
//angezeigt
function online(){
 global 
$conn;

    
$query=mysql_query("SELECT * FROM users WHERE lastact=".(time()-$online_time));
    if(
$query){
        
$online=mysql_num_rows($query);
    }
    if(
$online 1){ $online=1; }
    echo 
$online;


Für die MySQL Datenbank hab ich folgende Zeilen genommen:
PHP-Code:

CREATE TABLE counter_count 
id int(11NOT NULL auto_increment
count int(10NOT NULL default '0'
PRIMARY KEY (id
TYPE=MyISAM

// Dann noch zwei weitere zeilen in die Tabelle users eingefügt und zwar folgende:
ip varchar(20NOT NULL default ''
lastact varchar(20NOT NULL default '' 

Ausgeben tu ich das wie folgt:
PHP-Code:

check();
update();
echo 
"besucher";
see();
echo 
"
online:"
;
online(); 

Aber das will alles nicht so richtig funktionieren.
geht ich auf die Seite steht da immer folgendes: besucher online:1
An sich ja logisch... nur steht da immer das da nur ein User online ist, obwohl es mehr sein müssten.
Und dann gib es auch noch Sachen mit der Datenbank.
Die Spalten ip und lastact in der Tabelle users ist überall immer leer.
Und auch in der tabelle counter_count hat 0 Zeilen
Kann da wer die Fehler im Script entdeckte :|


Achja die varible $pid die abgefragt wird, ist die UserID die überall immer ermittelt wird.
und das $conn besteht aus diesen zeilen:
PHP-Code:

$conn=mysql_connect($db_host,$db_user,$db_passwort);
mysql_select_db($db,$conn); 


Ps.: Rechtschreibfehler ;)

chris17 27.11.2004 15:33:09

Hallo,

schau Dir diese Zeile mal ganz genau an...
PHP-Code:

//...
mysql_query("INSERT INTO
                 users (ip, lastact)
             VALUES
                 ('"
.$_SERVER['REMOTE_ADDR']."', '".time()."')
             WHERE ID='$pid'"
);
//... 

Fällt Dir was auf?

Was immer hilfreich ist (während der Entwicklung!) -> mysql_query(...) or die (mysql_error());

Grüße

P.S.: Schreib besser $_SERVER['REMOTE_ADDR'] -> ''

KiKoN 27.11.2004 17:36:46

Also mir fällt da ehrlich gesagt nichts auf :|

chris17 27.11.2004 19:54:04

Ok, was bewirkt eine "WHERE-Klausel" bei einem INSERT? ;-)

P.S.: Hast Du or die (mysql_error()) eingefügt?

KiKoN 27.11.2004 23:03:11

ok hab das mal gemacht mit den mysql_error und jetzt kommt auch was raus worauf du hindeutest^^
Folgende Fehlermeldung kommt:
PHP-Code:

You have an error in your SQL syntaxCheck the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE ID='2'' at line 1 

Aber ich weiß nicht wie ich das Problem lösen soll :|
Er soll ja die ip und lastact in die spalte des jeweiliegen users einfügen. Wenn das nicht mit WHERE geht, wie dann?

chris17 27.11.2004 23:13:42

Du hast das Ganze in die Funktion insert_new() gepackt.
D.h. Du willst einen neuen Datensatz anlegen... -> Lass einfach die WHERE-Klausel weg.

WHERE wird in Verbindung mit UPDATE verwendet.

Grüße

KiKoN 27.11.2004 23:29:59

Ah jetzt weiß ich wo der Denkfehler war.
Klar... insert into hat da ja überhaupt nichts zu suchen. update muss da hin :)
Danke :)
Hab das jetzt geändert und es scheint zu funzen.
Wenn doch noch was is meld ich mich wieder^^"

KiKoN 27.11.2004 23:57:09

ok da is doch noch ein kleines prob :|
die ip und lastact wird jetzt ja wunderbar in die zeilen der users eingetragen.
nur die online anzeige bleibt immer bei 1 stehen :|
Gibt es nicht irgendwie ne andere möglichkeit den counter zu zählen?

xabbuh 28.11.2004 10:18:12

Zum einen würde ich >= statt = als Vergleichsoperator in deinem Query in der Funktion online() benutzen. Und zum Anderen ist es schneller mit COUNT() anstatt mit mysql_num_rows() zu arbeiten. Außerdem war die Variable $online_time in der Funktion online() gar nicht bekannt. Du musst diese Variable also entweder als Parameter übergeben, in der Funktion definieren oder sie hier mit global holen:
PHP-Code:

<?php
    
function online()
    {
        global
            
$conn;
        
$online_time 300;

        
$sql "SELECT
                    COUNT(ip) AS anzahl
                FROM
                    users
                WHERE
                    lastact >= " 
. (time() - $online_time);
        
$result mysql_query($sql);
        
$row mysql_fetch_object($result);
        return 
$row->anzahl;
    }
?>


KiKoN 28.11.2004 10:48:40

ok ich hab deins mal versucht.
Nur das geht auch nicht so ganz :|
Wenn ich die Seite aufrufe steht a nur noch: besucher online
sonst nichts.
hab unter dem return mal ein echo $row; eingefügt, aber kommt das selbe dabei raus.


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:31:44 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.