Ankündigung

Einklappen
Keine Ankündigung bisher.

Sql Daten der letzten 3 Wochen erhalten [Wöchentlich]

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    OK, dann ist das anders als ich erwartet hatte. Benutze intval um die Anzahl nach integer zu konvertieren.

    Kommentar


    • #17
      Perfekt, nun läuft es, habe jetzt bein schreiben in den Array die
      Code:
      row['nr']
      mit intval umschlossen und es klappt.
      Das andere Diagram habe ich jetzt auch am Laufen, wie du Vorgeschlagen hattest habe ich mir die letzten 21 Tage ausgeben lassen und dann den Array in 3 Teile geteilt.

      Danke für die Hilfe

      Kommentar


      • #18
        Nun gibt es doch noch ein kleines Problem, in ganz seltenen fällen kann es vorkommen, dass ein Tag mal 0 Aufrufe hat. dann verschieben sich aber alle Werte und dass gibt ein großes Chaos in der Tabelle.
        Besteht die möglichkeit Tage mit keinen Aufrufen einfach mit einer "Platzhalter" 0 zu befüllen?

        Derzeit sieht das ganze so aus dass der ausgabe array in 3 Teile aufgespalten wird und dann an das Script geleitet wird.
        PHP-Code:
        <?php
        $sql 
        "SELECT MONTH(visit_date) AS 'MONTH', DAY(visit_date) AS 'DAY', COUNT(1) AS visits FROM `visits` WHERE visit_date > DATE_SUB(NOW(), INTERVAL 21 DAY) GROUP BY MONTH(visit_date), DAY(visit_date)";
        $result $conn->query($sql);

        if(!
        $result){
        die(
        "Retriving Query Error<br>".$sql);
        }

        $visits = [];
        $days = [];
        foreach (
        $result as $row) {
        $visits[] = $row['visits'];
        $dt = new DateTime();
        $dt->setDate(date("Y"),$row['MONTH'], $row['DAY']);
        $days[] = $dt->format('D');
        }

        $visits_1 = [];
        $visits_2 = [];
        $visits_3 = [];

        $visits_1 array_slice($visits07);
        $visits_2 array_slice($visits714);
        $visits_3 array_slice($visits1421);
        $days array_slice($days07);
        ?>
        HTML-Code:
        <script type="text/javascript">
        var nrVisitors_1 = <?php echo json_encode($visits_1); ?>;
        var nrVisitors_2 = <?php echo json_encode($visits_2); ?>;
        var nrVisitors_3 = <?php echo json_encode($visits_3); ?>;
        
        var days = <?php echo json_encode($days); ?>;
        </script>
        Gibt es da eine einfache möglichkeit für oder muss ich da dann über 1000 umwege gehen?

        Kommentar


        • #19
          Wie man die fehlenden Elemente gleich mit SQL einfügen kann, weiß ich leider nicht, aber ich würde folgendes Vorgehen vorschlagen:
          In das Ergebnis auch den numerischen Wochentag eintragen. Diesen kannst Du ja aus visit_date ermitteln. Dann in der foreach-Schleife prüfen, ob ein Sprung im Wochentag vorliegt und wenn ja, einen Datensatz mit 0 einfügen.

          Kommentar


          • #20
            Das ist eine Gute Idee und scheint auch innerhalb eines Monats zu funktionieren. Wenn aber ein Monats Wechsel dazwischen liegt funktioniert dass nicht mehr, da logischerweise der letzte Tag nicht mehr einen enfernt liegt.
            Also würde alles weitere als 1 angegeben werden. Kann php prüfen ob da ein Monatswechsel ist und ob die letzte zahl auch der letze tag des monats war?

            Zusätzlich Dazu ist mir noch ein Fehler aufgefallen, wenn ich die 3 Arrays mit var_dump(); ausgeben lasse, hat der erste [7] Zahlen, der 2. [13] und der 3. [5]
            Ich weiß nicht ob das noch zu problemen führen kann und wollte das auch gerne beheben.

            Hier einmal die änderung:
            PHP-Code:
            $visits = [];
            $days = [];
            $last_day 0;
            foreach (
            $result as $row) {
            if(
            $last_day != && $row['DAY'] != $last_day 1){
            $visits[] = 0;
            $dt = new DateTime();
            $dt->setDate(date("Y"),$row['MONTH'], $row['DAY']+1);
            $days[] = $dt->format('D');

            $last_day $row['DAY'] + 1;
            } else {
            $visits[] = $row['visits'];
            $dt = new DateTime();
            $dt->setDate(date("Y"),$row['MONTH'], $row['DAY']);
            $days[] = $dt->format('D');

            $last_day $row['DAY'];
            }
            }

            $visits_1 = [];
            $visits_2 = [];
            $visits_3 = [];

            $visits_1 array_slice($visits07);
            $visits_2 array_slice($visits714);
            $visits_3 array_slice($visits1421);
            $days array_slice($days07);

            var_dump($visits_1);echo'<br/>';
            var_dump($visits_2);echo'<br/>';
            var_dump($visits_3); 
            Und der var_dump:
            Code:
            array(7) { [0]=> string(3) "190" [1]=> string(3) "118" [2]=> string(3) "126" [3]=> string(3) "114" [4]=> string(3) "134" [5]=> string(3) "180" [6]=> string(2) "66" }
            array(13) { [0]=> string(3) "115" [1]=> string(2) "95" [2]=> string(3) "108" [3]=> string(3) "154" [4]=> string(3) "131" [5]=> string(3) "145" [6]=> string(3) "103" [7]=> string(3) "152" [8]=> int(0) [9]=> int(0) [10]=> int(0) [11]=> int(0) [12]=> string(1) "3" }
            array(6) { [0]=> string(3) "152" [1]=> int(0) [2]=> int(0) [3]=> int(0) [4]=> int(0) [5]=> string(1) "3" }

            Kommentar


            • #21
              Ich meinte den Wochentag, also 0 für Montag, 1 für Dienstag, ... 6 für Sonntag. Da musst Du natürlich den Übergang von Sonntag 6 auf Montag 0 richtig berücksichtigen.

              Kommentar


              • #22
                Wenn ich das jetzt richtig verstanden habe sollte es so klappen, was es aber nicht macht.Mir wird alles nur noch als 0 ausgegeben.

                PHP-Code:
                $visits = [];
                $days = [];
                $last_day;
                $dt = new DateTime();
                foreach (
                $result as $row) {
                if(!empty(
                $last_day) && $dt->format('N') != $last_day || $dt->format('N') != $last_day 6){
                $visits[] = 0;
                $dt->setDate(date("Y"),$row['MONTH'], $row['DAY']+1);
                $days[] = $dt->format('D');

                $last_day $dt->format('N');
                } else {
                $visits[] = $row['visits'];
                $dt->setDate(date("Y"),$row['MONTH'], $row['DAY']);
                $days[] = $dt->format('D');

                $last_day $dt->format('N');
                }

                Kommentar


                • #23
                  Ich habe da mal etwas ausgearbeitet und das DateTime-Objekt benutzt. Ist etwas kompliziert geworden, aber es sollte den Übergang zwischen den Monaten und Jahren richtig berücksichtigen und auch funktionieren, wenn eine ganze Woche fehlen sollte.
                  Code:
                  $sql = "SELECT YEAR(visit_date) AS 'YEAR', MONTH(visit_date) AS 'MONTH', DAY(visit_date) AS 'DAY', COUNT(1) AS visits FROM `visits` WHERE visit_date > DATE_SUB(NOW(), INTERVAL 21 DAY) GROUP BY MONTH(visit_date), DAY(visit_date)";
                  $result = $pdo->query($sql);
                  // Referenzdatum fuer heute vor einer Woche bereitstellen
                  // aktuelles Datum ermitteln und Uhrzeit entfernen
                  $refDate = new DateTime();
                  $stripped = $refDate->format('Y-m-d');
                  $refDate = new DateTime($stripped);
                  // 3 Wochen subtrahieren
                  $refDate->modify('-3 week');
                  $visits = [];
                  foreach ($result as $row) {
                      // Referenzdatum um 1 Tag erhoehen
                      $refDate->modify('+1 day');
                      // und im selben Format wie das Datum aus der DB bereit stellen
                      $refDateStr = $refDate->format('Y-n-j');
                      // Datum aus der DB bereit stellen
                      $currDateStr = $row['YEAR'] . '-' . $row['MONTH'] . '-' . $row['DAY'];
                      echo $refDateStr . ' ' . $currDateStr . ' ' . $row['visits'] . '<br>';
                      // Sind beide unterschiedlich, liegt ein Tag oder mehrere
                      // ohne Besuche vor
                      // wir muessen diese mit 0 Besuchen auffuellen
                      if ($refDateStr != $currDateStr) {
                          // DateTime-Objekt fuer die Zeit aus der DB bereit stellen
                          $currDate = new DateTime($currDateStr);
                          // und die Differenz zum Referenzdatum ermitteln
                          $diff = $currDate->diff($refDate);
                          $diffDays = $diff->format('%a');
                          // fuer jeden fehlenden Tag einen Datensatz mit 0 Besuchen ergaenzen
                          for ($i = 0; $i < 30 && $diffDays > 0; $i++, $diffDays--) {
                              echo 'diff=' . $diffDays . '<br>';
                              $refDate->modify('+1 day');
                              $visits[] = 0;
                          }
                      }
                      $visits[] = $row['visits'];
                  }
                  var_dump($visits);
                  var_dump(count($visits));

                  Kommentar


                  • #24
                    Wie bekomme ich jetzt den passenden Array mit den Wochentagen, die werden nämlich jetzt nicht mehr übergeben.

                    Kommentar


                    • #25
                      Das kann man leicht hinzu fügen, in deinem eigenen Code war es ja schon drin:
                      Code:
                      $sql = "SELECT YEAR(visit_date) AS 'YEAR', MONTH(visit_date) AS 'MONTH', DAY(visit_date) AS 'DAY', COUNT(1) AS visits FROM `visits` WHERE visit_date > DATE_SUB(NOW(), INTERVAL 21 DAY) GROUP BY MONTH(visit_date), DAY(visit_date)";
                      $result = $pdo->query($sql);
                      // Referenzdatum fuer heute vor einer Woche bereitstellen
                      // aktuelles Datum ermitteln und Uhrzeit entfernen
                      $refDate = new DateTime();
                      $stripped = $refDate->format('Y-m-d');
                      $refDate = new DateTime($stripped);
                      // 3 Wochen subtrahieren
                      $refDate->modify('-3 week');
                      $visits = [];
                      $days = []; // <---
                      foreach ($result as $row) {
                          // Referenzdatum um 1 Tag erhoehen
                          $refDate->modify('+1 day');
                          // und im selben Format wie das Datum aus der DB bereit stellen
                          $refDateStr = $refDate->format('Y-n-j');
                          // Datum aus der DB bereit stellen
                          $currDateStr = $row['YEAR'] . '-' . $row['MONTH'] . '-' . $row['DAY'];
                          echo $refDateStr . ' ' . $currDateStr . ' ' . $row['visits'] . '<br>';
                          // Sind beide unterschiedlich, liegt ein Tag oder mehrere
                          // ohne Besuche vor
                          // wir muessen diese mit 0 Besuchen auffuellen
                          if ($refDateStr != $currDateStr) {
                              // DateTime-Objekt fuer die Zeit aus der DB bereit stellen
                              $currDate = new DateTime($currDateStr);
                              // und die Differenz zum Referenzdatum ermitteln
                              $diff = $currDate->diff($refDate);
                              $diffDays = $diff->format('%a');
                              // fuer jeden fehlenden Tag einen Datensatz mit 0 Besuchen ergaenzen
                              for ($i = 0; $i < 30 && $diffDays > 0; $i++, $diffDays--) {
                                  echo 'diff=' . $diffDays . '<br>';
                                  $visits[] = 0;
                                  $days[] = $refDate->format('D'); // <---
                                  $refDate->modify('+1 day');
                              }
                          }
                          $days[] = $refDate->format('D'); // <---
                          $visits[] = $row['visits'];
                      }
                      var_dump($visits);
                      var_dump($days);
                      var_dump(count($visits));

                      Kommentar


                      • #26
                        Scheint nich so ganz richtig zu funktionieren, ich bekomme eine riesige menge an daten ausgegeben wenn ich die var_dump() nicht auskommentiere und die Aufrufe stimmen mit dem was die Datenbank zurück gibt auch nicht überein.
                        Außerdem scheint es 67mal bei den Tagen den Montag eingetragen zu haben usw.

                        Hab da es hier für den Post viel zu lang ist das auf Pastebin reinkompiert: https://pastebin.com/tTz5bBzg

                        Für dies woche sollten die Werte wie Folg aussehen:
                        Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag
                        5 130 204 75 0 3 0
                        Zuletzt geändert von Nightland Driver; 08.02.2021, 13:35. Grund: Hinzufügen der Aktuellen Werte

                        Kommentar


                        • #27
                          Ja, da ist was oberfaul, aber bei mir funktioniert der Code einwandfrei, habe ihn auch noch Mal aus #25 in meine Testdatei kopiert.

                          Ist das Problem erst aufgetreten, als Du die Version mit den Wochentagen aus #25 genommen hast?

                          Kannst Du einen SQL-Dump deiner Datentabelle schicken, vielleicht wieder über pastebin?

                          Kommentar


                          • #28
                            Nein bei beiden versionen besteht der fehler. Hier ist der SQL Dump: https://pastebin.com/dtauPURp

                            Kommentar


                            • #29
                              OK, ich teste es mal mit dem Dump ...

                              Kommentar


                              • #30
                                ... alles klar, da stimmte beim Einstieg in die Schleife etwas nicht. Dieses funktioniert jetzt bei mir:
                                Code:
                                $sql = "SELECT YEAR(visit_date) AS 'YEAR', MONTH(visit_date) AS 'MONTH', DAY(visit_date) AS 'DAY', COUNT(1) AS visits FROM `visits` WHERE visit_date > DATE_SUB(NOW(), INTERVAL 21 DAY) GROUP BY MONTH(visit_date), DAY(visit_date)";
                                $result = $pdo->query($sql);
                                // Referenzdatum fuer heute vor einer Woche bereitstellen
                                // aktuelles Datum ermitteln und Uhrzeit entfernen
                                $refDate = new DateTime();
                                $stripped = $refDate->format('Y-m-d');
                                $refDate = new DateTime($stripped);
                                // 3 Wochen subtrahieren
                                $refDate->modify('-3 week');
                                $visits = [];
                                $days = []; // <---
                                foreach ($result as $row) {
                                    // und im selben Format wie das Datum aus der DB bereit stellen
                                    $refDateStr = $refDate->format('Y-n-j');
                                    // Datum aus der DB bereit stellen
                                    $currDateStr = $row['YEAR'] . '-' . $row['MONTH'] . '-' . $row['DAY'];
                                    echo $refDateStr . ' ' . $currDateStr . ' ' . $row['visits'] . '<br>';
                                    // Sind beide unterschiedlich, liegt ein Tag oder mehrere
                                    // ohne Besuche vor
                                    // wir muessen diese mit 0 Besuchen auffuellen
                                    if ($refDateStr != $currDateStr) {
                                        // DateTime-Objekt fuer die Zeit aus der DB bereit stellen
                                        $currDate = new DateTime($currDateStr);
                                        // und die Differenz zum Referenzdatum ermitteln
                                        $diff = $currDate->diff($refDate);
                                        $diffDays = $diff->format('%a');
                                        // fuer jeden fehlenden Tag einen Datensatz mit 0 Besuchen ergaenzen
                                        for ($i = 0; $i < 30 && $diffDays > 0; $i++, $diffDays--) {
                                            echo 'diff=' . $diffDays . '<br>';
                                            $visits[] = 0;
                                            $days[] = $refDate->format('D'); // <---
                                            $refDate->modify('+1 day');
                                        }
                                    } else {
                                        // Referenzdatum um 1 Tag erhoehen
                                        $refDate->modify('+1 day');
                                    }
                                    $days[] = $refDate->format('D'); // <---
                                    $visits[] = $row['visits'];
                                }
                                var_dump($visits);
                                var_dump($days);
                                var_dump(count($visits));

                                Kommentar

                                homepage-forum.de - Hilfe für Webmaster! Statistiken

                                Einklappen

                                Themen: 56.805   Beiträge: 430.091   Mitglieder: 28.558   Aktive Mitglieder: 55
                                Willkommen an unser neuestes Mitglied, Koller-Consulting.

                                Online-Benutzer

                                Einklappen

                                244 Benutzer sind jetzt online. Registrierte Benutzer: 2, Gäste: 242.

                                Mit 3.502 Benutzern waren am 23.01.2020 um 18:20 die meisten Benutzer gleichzeitig online.

                                Die neuesten Themen

                                Einklappen

                                Die neuesten Beiträge

                                Einklappen

                                Lädt...
                                X