datenbank problem

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
metty84
Mitglied
Beiträge: 159
Registriert: 08.03.2007 13:13
Wohnort: Marienberg
Kontaktdaten:

datenbank problem

Beitrag von metty84 »

ja ich hab auf meim bord nen kleinen zähler eingerichtet der für jeden user die anzahl an profilaufrufen zählt und nun wollen meine user weil sie so scharf auf den virtuellen schw...vergleich sind gern eine topliste wo angezeigt wird wer in den letzten 7 tagen die meisten profilaufrufe hatte. das script zu schreiben für die toplist ist nicht das ding das problem ist das ich ja jeden tag speichern muss wieviele user das profil besucht haben und das immer für die vergangenen 7 tage. wen ich da für jeden tag nen eintrag in ner tabelle erstellen würde wäre die db schnel zugemüllt den es wären dan schon jetzt 7000 einträge mit je 3 feldern also kann ichs nur für jeden user speichern eine tabelle ähnlich der usertabelle anlegen mit 8 feldern einmal user_id und dan 7 felder für sieben tage.

so und nun kommt mein problem wie bekomme ich die daten von feld 1 am ende vom tag 1 in die spalte2 und die daten der spalte 2 in die spalte 3 usw... ... und zu guterletzt noch die komplete spalte 1 auf 0 gesetzt

mit nem normalen phpscript wen ich da mit for each arbeite wird das script sicherlich wegen zeitüberschreitung abgebrochen also was soll ich tuen? cronjobs kann ich nutzen aber nützt ja nichts wen das script abbricht!

jemand ne idee?

danke im voraus!

mfg metty
Zothos
Mitglied
Beiträge: 194
Registriert: 31.08.2005 15:31
Wohnort: Ubstadt-Weiher

Beitrag von Zothos »

wäre es nicht sinvoller gewesen, du machst eine 3 spaltige tabelle?

index | userclicked_id| date

so würde ich dann einfach abfragen, wie viele klicks der user hatte die heute waren, gestern, letzte woche, etc etc und macht dann ein select mit count(userid).


Das ganze könnte man auch einfach weiter spinnen, wenn man z.b. wissen will wer geklickt hat, dazu brauch man nur ein feld ergänzen. und ein wenig php code.

index | userclicked_id | user_id | date


Definition:

userclicked_id <- der user dessen profil geclicked wurde
user_id <- der user der geclicked hat.


Hint:
Wenn du etwas programmieren willst, immer zuerst nachdenken un nicht einfach mal was dahinproggen :P
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Wenn du aber für jeden Klick einen extra Datenbankeintrag erstellst dann hast du schnell ordentliche Datenmengen zusammen...

Eigentlich müsste das was du machen willst ganz einfach auch mit einer simplen SQL Abfrage funktionieren:

Code: Alles auswählen

UPDATE tabelle SET feld7 = feld6, feld6 = feld5, feld5 = feld4, feld4 = feld3, feld3 = feld2, feld2 = feld1, feld1 = 0 WHERE bedingung
WHERE bedingung kannst du natürlich auch weglassen wenn du alle Daten der Tabelle verarbeiten willst (was vermutlich der Fall ist). Das ganze dann per Cronjob ausführen lassen (oder selbst sehr diszipliniert jeden Tag zur gleichen Zeit :) ), indem du es in einem PHP Skript oder sonstwo einbaust.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Mit 7 Feldern zu arbeiten ist so ziemlich die unflexibelste Lösung. Ich würde einfach eine Tabelle erstellen mit den Feldern user_id, datum, klicks. Der Code sieht dann etwa so aus:

Code: Alles auswählen

UPDATE statistik SET klicks=klicks+1 WHERE user_id=$user_id AND datum=CURDATE();
if(sql_affected_rows() == 0)
{
    INSERT INTO statistik (user_id, datum, klicks) VALUES ($user_id, CURDATE(), 1);
}
Und für den Fall, daß du bei deinem hoster für jedes byte einzeln bezahlen musst noch einen cronjob für DELETE FROM statistik WHERE datum < CURDATE() - INTERVAL 7 DAY
KB:knigge
switchon
Gesperrt
Beiträge: 138
Registriert: 02.05.2007 15:30

Beitrag von switchon »

laut php.net existiert die funktion "sql_affected_rows" gar nicht
leere signatur
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

O RLY?

Wenn man sich den Code mal genauer anguckt, stellt man fest daß das pseudocode ist, der 1:1 kopiert gar nicht lauffähig ist. Stattdessen muss man sein Hirn einschalten und ihn an die verwendete Umgebung anpassen.
KB:knigge
Benutzeravatar
easygo
Mitglied
Beiträge: 2170
Registriert: 03.09.2004 13:45
Kontaktdaten:

Beitrag von easygo »

switchon hat geschrieben:laut php.net existiert die funktion "sql_affected_rows" gar nicht
Jo dann such halt mal nach mysql_affected_rows :wink:

Code: Alles auswählen

if (mysql_affected_rows()==0)
Benutzeravatar
metty84
Mitglied
Beiträge: 159
Registriert: 08.03.2007 13:13
Wohnort: Marienberg
Kontaktdaten:

Beitrag von metty84 »

erstmal vielen dank für die zahlreichen antworten! danke! danke! danke!

ich konnte leider erst jetzt antworten weil ich die letzten 2 tage mit meiner band auf tour war.

nun zum thema:

das problem ist wen ich jeden profilaufruf mit id und timestamp speichern würde, wären das bereits innerhalb von 7 tagen ungefähr 100.000 datenbankeinträge und das nur bei der aktuellen userzahl wen ich das mal hochrechne wären es in 2 jahren für den zeitraum von 7 tagen ne halbe million einträge da sagt dan der server goodbye wen du da irgendwas sortieren oder auswerten willst. von daher fällt das also flach! aber ich hab nen kleinen code gebastelt der jedoch noch einen fehler in sich birgt, nur finde ich den nicht! das problem ist das jeweils der erste datenbankeintrag nicht aktuallisiert wird. alle darauffolgenden werden tadellos aktuallisiert. kann mir da jemand nen tip geben was ich falsch mache?

hier der code:

Code: Alles auswählen

		$sql = "SELECT * FROM orion_profile_views
		ORDER BY user_id ASC"; 
		$result = $db->sql_query($sql); 

if ( $row = $db->sql_fetchrow($result) )
{
  while ( $row = $db->sql_fetchrow($result) )
  {
  	$pv_user_id = $row['user_id'];
  	$pv_day_1 = $row['day_1'];
  	$pv_day_2 = $row['day_2'];
  	$pv_day_3 = $row['day_3'];
	$pv_day_4 = $row['day_4'];
	$pv_day_5 = $row['day_5'];
	$pv_day_6 = $row['day_6'];
	
		  $sql = "UPDATE orion_profile_views
			SET day_1 = '0', day_2 = '" . $pv_day_1 . "', day_3 = '" . $pv_day_2 . "', day_4 = '" . $pv_day_3 . "', day_5 = '" . $pv_day_4 . "', day_6 = '" . $pv_day_5 . "', day_7 = '" . $pv_day_6 . "'
			WHERE user_id = " . $pv_user_id . "";
		if (!$db->sql_query($sql))
		{
			message_die(GENERAL_ERROR, 'Could not update profileviews', '', __LINE__, __FILE__, $sql);
		}
	
	
	}
		
		
}
mit dieser variante gibt es halt genau soviele dbeinträge wie user, deren profile bereits angezeigt wurden und 1000 dbeinträge lassen sich schneller verarbeiten als 100.000

also wer da noch rat weis dafür wäre ich dankbar!

und gleich noch das darauffolgende prob... für die topliste, gibt es die möglichkeit die komplette tabelle auszulesen dan eine summe für jede zeile zu bilden(ohne das die userid in die summe einbezogen wird) und dan das array nach dieser errechneten summe neu zu sortieren damit ichs ausgeben kann? oder gibts vileicht sogar ne einfachere lösung für das auswerten?

mfg metty
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Ohne mir jetzt den Code genauer angeschaut zu haben, sehe ich doch, dass dieser Ansatz sinnlos ist:

Code: Alles auswählen

if ( $row = $db->sql_fetchrow($result) )
{
  while ( $row = $db->sql_fetchrow($result) )
  { 
nimm das

Code: Alles auswählen

if ( $row = $db->sql_fetchrow($result) )
{
weg und lösche unten noch eine Klammer.

Aber was gefällt Dir denn an dem Vorschlag von Pyramide nicht?
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
metty84
Mitglied
Beiträge: 159
Registriert: 08.03.2007 13:13
Wohnort: Marienberg
Kontaktdaten:

Beitrag von metty84 »

naja das problem ist das ich auch bissel an die zukunft meiner seite denken muss und bei den registrierungszahlen... ich hatte aleine im letzten halben jahr knap 1000 registrierungen in zwei jahren wären das schon 5000 user rechnet man das nun noch mal 7 sind wir auch schonwieder bei 35.000 dbeinträgen und bei meiner lösung wären es halt nur 5000 dbeinträge. verstehst?

die änderung werde ich mal testen
Antworten

Zurück zu „Coding & Technik“