WinFuture-Forum.de: [php/mysql] Onlinestatus/counter Ermitteln - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

[php/mysql] Onlinestatus/counter Ermitteln

#16 Mitglied ist offline   Yalamand 

  • Gruppe: aktive Mitglieder
  • Beiträge: 101
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 08. Juni 2005 - 21:53

Zitat (Slayer: 08.06.2005, 22:50)

Aha OK das klingt ja schon besser <_<
Kann mein ip-Feld aber auch VARCHAR sein und PRIMARY?

Aber was ändert sich da zu meinem Code großartig von dem Aufwand her?

  if(mysql_num_rows($user_select) == 1)
  {
 	 mysql_query("UPDATE user_online SET ablauf = '".(time()+$zeitspanne)."' WHERE ip = '$ip'");
  }


Oder ersetzt dein Beispiel auch den Fall, falls nichts vorhanden ist? Also noch folgendes:

mysql_query("INSERT INTO user_online (ip, ablauf) VALUES ('$ip', '".(time()+$zeitspanne)."')");

<{POST_SNAPBACK}>


Klar kann VARCHAR PRIMARY sein... ich persönlich empfehle es aber nicht, da die Indizierung für PRIMARY sonst zu gross und zu langsam wird (bei UPDATE, INSERT, REPLACE und WHERE Abfragen).

Wie schon geschrieben... vom aufwand: Alle die Zeilen in meinem Post können durch die drei von mir ersetzt werden. Denn das REPLACE fungiert als INSERT und UPDATE gleichzeitig wenn eine PRIMARY Spalte im SET verwendet wird. Die if Abfrage die du per PHP machst, macht quasi das REPLACE INTO ja schon. Das prüft ja ob bereits einer existiert mit der IP. Wenn ja löscht er ihn voll automatisch ohne das du dich drum kümmern musst.

Dieser Beitrag wurde von Yalamand bearbeitet: 08. Juni 2005 - 21:54

0

Anzeige



#17 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.475
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 21:57

Super, dann werde ich es doch gleich mal ändern... <_<
Dankeschön auch hiefür, hast mir sehr weitergeholfen!
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#18 Mitglied ist offline   Yalamand 

  • Gruppe: aktive Mitglieder
  • Beiträge: 101
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 08. Juni 2005 - 21:59

Beispiel:

IP: 1.1.1.1 Ablauf: 21312321

REPLACE INTO ... SET ip = '1.1.1.1', ablauf = 5464

bedeutet:

ip ist PRIMARY. D.h. LÖSCHE alle mit ip = 1.1.1.1.
dann füge neuen ein ip 1.1.1.1 ein mit ablauf 5464

ist die ip 1.1.1.1 noch nicht vorhanden fügt er einen neuen datensatz ein mit ip 1.1.1.1 und ablauf 5465.

REPLACE ist also "sicher". Wenn vorhanden "quasi" UPDATE. Wenn nicht vorhanden INSERT.

ACHTUNG: Würde es noch eine dritte Spalte geben, z.B. name und sie wird nicht gesetzt im REPLACE INTO dann geht sie natürlich verloren. Denn: Wenn vorhanden wird der Eintrag gelöscht und dann mit den Parametern von REPLACE neu eingetragen.

Dieser Beitrag wurde von Yalamand bearbeitet: 08. Juni 2005 - 22:00

0

#19 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.475
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 22:01

Zitat (Yalamand: 08.06.2005, 22:59)

Beispiel:

IP: 1.1.1.1 Ablauf: 21312321

REPLACE INTO ... SET ip = '1.1.1.1', ablauf = 5464

bedeutet:

ip ist PRIMARY. D.h. LÖSCHE alle mit ip = 1.1.1.1.
dann füge neuen ein ip 1.1.1.1 ein mit ablauf 5464

ist die ip 1.1.1.1 noch nicht vorhanden fügt er einen neuen datensatz ein mit ip 1.1.1.1 und ablauf 5465.

REPLACE ist also "sicher". Wenn vorhanden "quasi" UPDATE. Wenn nicht vorhanden INSERT.
<{POST_SNAPBACK}>

Das Beispiel hat es mir nun noch besser erklärt, perfekt!
Das erspart ja eine Menge Code und ist auch wesentlich sinnvoller, werde das dann alles ändern.

Aber erstmal TV Total gucken <_<

Gruß Slayer.
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#20 Mitglied ist offline   Yalamand 

  • Gruppe: aktive Mitglieder
  • Beiträge: 101
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 08. Juni 2005 - 22:04

achja: du brauchst bei MySQL kein time() verwenden im PHP. MySQL hat diese Funktion selbst. UNIX_TIMESTAMP().

also z.b.

REPLACE INTO test SET time = UNIX_TIMESTAMP()

führt ganz ohne PHP zum gleichen Ergebnis wie

REPLACE INTO test SET time '.$time.'

spart PHP den Aufwand der Zeichenverkettung und der MySQL Server kann es schneller bearbeiten

Zitat (Slayer: 08.06.2005, 23:01)

Aber erstmal TV Total gucken ;D
<{POST_SNAPBACK}>


... und ich muss weiterschuften, kunden bringen mich morgen sonst um, vierteilen mich und freuen sich das sie am nächsten tag etwas zu essen haben *g*

Versuch immer den Code so klein wie möglich zu halten, schau ob es Funktionen gibt die das gleiche machen können ohne Zusatzaufwand. PHP ist gut, aber viele Aufgaben können mit MySQL auch ohne extra Einmischung von PHP gemacht werden. Das sind meine Ratschläge <_< Bist aber auf dem besten Wege. Wenn du fertig bist, poste es nochmal... wenn ich Zeit habe werd ich dir zeigen wie ich es gemacht hätte und warum. Dann kannst du besser Vergleichen und sehen ob du vielleicht noch etwas übersehen hast :P Ist aber nur ein Vorschlag.
0

#21 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.475
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 09. Juni 2005 - 13:02

So, ich habe die Funktionen jetzt mal geändert:

function user_online()
{
	$zeitspanne = 120; // Zeitspanne (in Sekunden) für den Onlinestatus
	$ip = get_ip();
	$zeitstempel = time();

	mysql_query("DELETE FROM user_online WHERE ablauf < $zeitstempel");

	mysql_query("REPLACE INTO user_online SET ip = '$ip', ablauf = '".($zeitstempel+$zeitspanne)."'");

	// Ermittelt aktive User
	$online_result = mysql_query("SELECT count(*) FROM user_online");
	return mysql_result($online_result, 0);
}

function mitglieder_online()
{
	$zeitspanne = 420; // Zeitspanne in (Sekunden) für den Onlinestatus
	$zeitstempel = time();

	// Setzt Onlinestatus auf 0 wenn offline
	mysql_query("UPDATE mitglieder SET onlinestatus = '0' WHERE zuletzt_online < $zeitstempel");

	if(isset($_SESSION['user_id']))
	{
        // Setzt Onlinestatus auf 1 wenn online
  mysql_query("UPDATE mitglieder SET zuletzt_online = '".($zeitstempel+$zeitspanne)."', onlinestatus = '1' WHERE id = '".$_SESSION['user_id']."'");
	}

	// Ermittelt aktive Mitglieder
	$online_result = mysql_query("SELECT count(*) FROM mitglieder WHERE onlinestatus = '1'");
	return mysql_result($online_result, 0);
}


Allerdings das mit dem UNIX_TIMESTAMP; noch nicht.
Funktioniert das denn auf jedem System (auch Windows etc.)?

So und egal was du findest oder verbessern würdest, schreibe es, ich freue mich darüber ;)

Dieser Beitrag wurde von Slayer bearbeitet: 09. Juni 2005 - 13:29

Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#22 Mitglied ist offline   Yalamand 

  • Gruppe: aktive Mitglieder
  • Beiträge: 101
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 09. Juni 2005 - 17:54

UNIX_TIMESTAMP() als MySQL-Anweisung ist eigentlich schon lange Verfügung auf MySQL-Servern. Ich schau es mir an und poste wenn ich soweit bin, heute und morgen noch etwas stressig im Laden :)
0

#23 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.475
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 09. Juni 2005 - 18:35

Zitat (Yalamand: 09.06.2005, 18:54)

UNIX_TIMESTAMP() als MySQL-Anweisung ist eigentlich schon lange Verfügung auf MySQL-Servern. Ich schau es mir an und poste wenn ich soweit bin, heute und morgen noch etwas stressig im Laden :)
<{POST_SNAPBACK}>

Keine Ursache ;D

Also kann ich UNIX_TIMESTAMP(); immer und überall anwenden, auch auf Windows-Systemen?
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#24 _Benjamin_

  • Gruppe: Gäste

geschrieben 09. Juni 2005 - 22:09

warum sollten sie das nicht ?
0

#25 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.475
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 10. Juni 2005 - 13:08

Zitat (Benjamin: 09.06.2005, 23:09)

warum sollten sie das nicht ?
<{POST_SNAPBACK}>

Kann ja sein, dachte eventuell wegen dem UNIX_TIMESTAMP;

Aber sicher ist sicher :allesgute:

Dieser Beitrag wurde von Slayer bearbeitet: 10. Juni 2005 - 13:09

Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0