Monatsberechnung
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anfang
beginn
bereich
code
date
datenbank
datum
ende
februar
funktion
http
jahr
monat
schleife
stelle
tabelle
tag
url
zugriff
-
Hallo Zusammen,
Ich bin zur Zeit dabei meinen Statistik tag/bereich">Bereich auszubauen. Ich habe jetzt schon seit etwa 4 Monaten dafür den täglichen Besucheransturm mit meinem Counter aufgezeichnet, sodass ich die Werte für die Tage habe.
Das sieht dann etwa so aus:
Bild
Diese Werte möchte ich jetzt mithilfe eines PHP Skriptes weiter verwerten, sodass ich am Ende eine Monatsübersicht habe.
Beispielsweise:
Das Skript berechnet alle Tage zusammen (nur die Spalte guests_counter) die in Monat Januar, Februar & März aufgezeichnet wurden, sodass ich am Ende eine Besucherzahl für den ganzen Monat habe.
Die Daten werden jeden Tag um 0 Uhr automatisch in die Tabelle ergänzt, sodass das Skript immer die aktuelle Anzahl zeigt. Doch wie kann ich es so zusammen Basteln das immer nur der gesamte Monat zusammengerechnet wird und nicht alle Werte?
Liebe Grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
So ungefähr:
select sum(guests_counter) from {NAME_DER_TABELLE} where date>="01.02.2015" and date<="28.02.2015"
Ich kenne mich mit den Datumsformaten nicht so richtig aus.
Hast du als Spaltentyp "date" eingestellt? Das ist natürlich Voraussetzung. -
Hallo!
Vielen dank für deinen Beitrag.
Also der Spaltentyp ist VARCHAR(10) ich kann es aber jedoch problemlos auf date umändern und dann alle Punkte durch - ersetzen.
Die Frage die sich mir bei dem Code nun stellt, wie kann ich das jetzt automatisch auf die ganze Tabelle beziehen?
Da du das date ja konstant vorgegeben hast.
LG -
Also ich würd mir das recht einfach machen und für jeden Monat eine Abfrage durchführen.
Ich arbeite prinzipiell mit Prepared Statements, gerade jetzt wird das sinnvoll. (Ich stelle ja mehrere gleichartige Abfragen)
// Verbindungsaufbau und Vorbereitung $sql=new mysqli("host","user","passwort","datenbank"); $abfrage=$sql->prepare("select sum(guests_counter) from {NAME_DER_TABELLE} where date>=? and date<=?"); $abfrage->bind_param("ss", $anfang, $ende); $abfrage->bind_result($zugriffe); // Eine Abfrage: $monat=2; // Februar $jahr=2015; $anfang=date("Y-m-d",mktime(0,0,0,$monat,1,$jahr)); $ende=date("Y-m-d",mktime(0,0,0,$monat+1,0,$jahr)); $abfrage->execute(); $abfrage->fetch(); echo $zugriffe; // Abfrage (Zeile 11 bis 16) beliebig oft wiederholen, gerne auch in einer Schleife // Und am Ende wieder aufräumen: $abfrage->close(); $sql->close(); // Nur, falls du es nicht mehr brauchst
Ungetestet und damit ohne Garantie
Edit: ein Fehler schon ausgebessert.
Beitrag zuletzt geändert: 23.3.2015 20:22:27 von fuerderer -
Dazu erstellst du dir eine Schleife.
1. Bestimme den ersten und den letzten Monat, den du ausgeben möchtest.
-> Den letzten Monat kann man aus der Datenbank lesen oder über das aktuelle Datum bestimmen.
-> Den ersten Monat kann man aus der Datenbank lesen, fest ins Programm schreiben oder ein bestimmtes Intervall nach vorne legen (z.B. alles seit 6 Monaten)
2. Lasse eine Schleife darüber laufen, die alle Monate im Bereich einmal verarbeitet. Darin passiert dann die Abfrage.
Versuch mal, alleine da dran zu gehen. Auch wenn du noch viel Hilfe brauchst, nur durch Probieren lernt man zu programmieren.
Wenn du keinen Plan hast, hab ich eine leichtere Aufgabe für dich:
Lasse dir alle Zugriffszahlen innerhalb eines bestimmten Jahres ausgeben.
Viel Erfolg -
Ich habe mir jetzt mal einen kleinen Lösungsweg überlegt, verzweifel aber an der Stelle wo ich eine Schleife brauche die immer nur für die gleichen Werte gilt.
$abfrage = $sql->query("SELECT * FROM guests_day ORDER BY id ASC"); $beginn = 0; while($row = $abfrage->fetch_array()){ $endedertage = substr($row['date'], -7); if($endedertage == $endedertage){ $beginn = $beginn + $row['guests_counter']; } echo $beginn . "<br>"; }
Resultat: http://marvinkleinmusic.de/functions/stat.php
Wenn alles richtig wäre, dann würden nur 3 Ausgaben erscheinen. Ich glaube aber ich habe irgendwo einen Logikfehler drin.
Ich trenne erstmal alle Datumswerte auf die letzten 7 Stellen, sodass ich erhalte 01.2015,02.2015 etc.
Was jetzt jedoch fehlt ist das mittels einer Funktion alle $endedertage zusammen gerechnet werden, die gleich enden.
LG -
Wie wäre es, wenn du das per »GROUP BY« direkt nach Monaten gruppierst und dann per »COUNT()« abzählst? Dann sparst du dir all die PHP-Pfuschereien … und wenn du das Datum als »DATE«-Feld gespeichert hättest, wär das mit dem »nach Monat«-gruppieren auch weiter kein Problem, denn dafür gibt es ja die Datum/Zeit-Funktionen.
-
Also das Feld lässt sich Problemlos auf DATE abändern.
Aber mir erschließt sich die Funktion von GROUP BY nicht ganz. Wie erkennt MySQL dann das es nur alle Daten aus einem Monat benutzen soll?
Hättest du vielleicht ein kleines Beispiel oder ein relativ einfach verständliches Tutorial dafür?
Liebe Grüße -
Also wenn ich in meiner Chatlog-Datenbank folgendes Statement ausführe bekomm ich genau das, was du bei dir machen willst, allerdings ist das bei mir DB2, das »to_char« musst du also mit »date_format« lösen:
select count(*) as count, to_char(time, 'mm.YYYY') as time from chatmsg group by to_char(time, 'mm.YYYY');
Beitrag zuletzt geändert: 27.3.2015 19:00:36 von hackyourlife -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage