datenbank problem
datenbank problem
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
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
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
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

- gn#36
- Ehrenadmin
- Beiträge: 9313
- Registriert: 01.10.2006 16:20
- Wohnort: Ganz in der Nähe...
- Kontaktdaten:
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:
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.
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

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.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
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:
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
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);
}
KB:knigge
Jo dann such halt mal nach mysql_affected_rowsswitchon hat geschrieben:laut php.net existiert die funktion "sql_affected_rows" gar nicht

Code: Alles auswählen
if (mysql_affected_rows()==0)
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:
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
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);
}
}
}
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
Ohne mir jetzt den Code genauer angeschaut zu haben, sehe ich doch, dass dieser Ansatz sinnlos ist:
nimm das
weg und lösche unten noch eine Klammer.
Aber was gefällt Dir denn an dem Vorschlag von Pyramide nicht?
Code: Alles auswählen
if ( $row = $db->sql_fetchrow($result) )
{
while ( $row = $db->sql_fetchrow($result) )
{
Code: Alles auswählen
if ( $row = $db->sql_fetchrow($result) )
{
Aber was gefällt Dir denn an dem Vorschlag von Pyramide nicht?
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Ich schmeiß' alles hin und...
... lasse es liegen
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
die änderung werde ich mal testen