Ankündigung

Einklappen
Keine Ankündigung bisher.

Query läd nur einen Datensatz aus DB-Tabelle

Einklappen

Neue Werbung 2019

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

  • Query läd nur einen Datensatz aus DB-Tabelle

    Hallo, ich versuche, eine Art Terminkalender anzulegen. Aktuell bin ich auf folgendes Problem gestoßen: Der Code
    PHP-Code:
    $servername "localhost";
        
    $user "u307040513_pvd";
        
    $pw "*****************";
        
    $db_forum "u307040513_forum";

        
    $link_forum mysqli_connect($servername$user$pw$db_forum);
        if (!
    $link_forum){
            die(
    "Verbindungsfehler: " mysqli_connect_errno());
        }

        
    $query_kalender "SELECT id, termin, datum, art FROM kalender ORDER BY datum ASC";
        
    $ergebnis mysqli_query($link_forum$query_kalender);
        
    $datensatz mysqli_fetch_assoc($ergebnis);
        
    print_r($datensatz); 
    Wirft mir anstelle des gesamten Datenbestandes der Tabelle nur diesen einzigen Datensatz raus:

    PHP-Code:
    Array ( [id] => [termin] => Wiederholungsklausur HS 1.1 [datum] => 03.03.2020 [art] => klausur 
    Allerdings sind in der Datenbank mehr Datensätze vorhanden. Die Tabellenstruktur:

    id (primary key, AutoIncrement) //ID des Eintrags
    termin (text) //Name des Termins
    datum (varchar(19)) //Datum des Termins
    art (text) //entweder "klausur" oder "praxis" -> soll später farblich unterschiedlich dargestellt werden

    Die Daten in der Tabelle sind wie folgt:
    4 Brühl 30.03.2020 praxis
    5 Wiederholungsklausur HS 1.1 03.03.2020 klausur
    6 Wiederholungsklausur HS 1.2 05.03.2020 klausur
    7 Brühl 03.08.2020 praxis
    Aber wie gesagt wird nur ein Termin (der erste gemäß ORDER BY) ausgegeben. Ohne ORDER BY ist es der erste Eintrag der Tabelle. Ich finde einfach nicht den Grund dafür
    Übrigens: Ich bin Anfänger und es gibt sicher an vielen Stellen im Code Optimierungsbedarf. Ich würde mich aber in erster Linie freuen, den Fehler zu finden, der zu dem beschriebenen Problem führt.

    LG

  • #2
    Lies doch in der Doku nach was mysqli_fetch_assoc() genau macht:

    https://www.php.net/manual/de/mysqli...etch-assoc.php

    Kommentar


    • #3
      Du solltest auch immer die DB nach Fehlern abfragen, sowie du es mit dem connect machst. Wenn du das nicht machst erhältst du keine Angabe darüber was schief gelaufen sein könnte.

      So in etwa:
      PHP-Code:
      $res $mysqli->query($query);

      if (!
      $res) {
         
      printf("Errormessage: %s\n"$mysqli->error);

      mysqli_fetch holt immer nur einen Datensatz ab, wenn du mehrere brauchst, weil mehrere zurückgeliefert werden könnten, dann musst du in einer Schleife die Datensätze abholen.
      Siehe auch https://www.php.net/manual/en/mysqli.examples-basic.php

      Wenn du uns deine DB Struktur vorstellen möchtest, mache es bitte als CREATE statement, das geht auch mit PHPMyAdmin über export.

      Datum hat bei dir einen falschen Datentyp, bitte lerne die Grundlagen zu SQL.

      Kommentar


      • #4
        Zitat von jonas3344 Beitrag anzeigen
        Lies doch in der Doku nach was mysqli_fetch_assoc() genau macht
        Oh, I see. Eigentlich habe ich eine While-Schleife drum, habe dann aber beim Versuch, den Fehler einzugrenzen, wohl etwas zu klein eingegrenzt. Dann versuche ich mein jetziges Script noch mal neu aufzubauen, bis es irgendwann nicht mehr funktioniert und so den Fehler zu finden.

        Kommentar


        • #5
          Ich habe den Problempunkt gefunden.

          PHP-Code:
          <?php
          while ($datensatz mysqli_fetch_assoc($ergebnis)) { ?>
              <div class="kalendereintrag klausur">
                  <?php
                  
          //Name und Datum des Termins
                  
          echo $datensatz['termin'] . ": " $datensatz['datum'] . "<br>";
                  
          //Countdown
                  
          function diff_time($differenz)
                             {  
                             
          $tag  floor($differenz / (3600*24));
                             
          $std  floor($differenz 3600 24);
                             
          $min  floor($differenz 60 60);
                             
          $sek  floor($differenz 60);

                             return array(
          "sek"=>$sek,"min"=>$min,"std"=>$std,"tag"=>$tag);
                             }

                          
          $noch strtotime($datensatz['datum']) - time();
                          
          $differenz diff_time($noch);
                          echo 
          "noch " $differenz['tag'] . "Tage";
                  
          ?>
              </div>
          <?php
          }
          ?>
          Wenn ich alles ab "//Countdown" weglasse, werden mir alle Daten perfekt untereinander ausgegeben. Wenn ich aber versuche, mir einen Countdown zu basteln (aus einem Tutorial geklaut, hat funktioniert als ich die Termine manuell einzeln in der PHP/HTML Datei eingetragen habe ohne Datenbank), funktioniert dieser beim ersten Eintrag, beim zweiten nicht und die nachfolgenden werden überhaupt nicht mehr angezeigt:

          PHP-Code:
          Wiederholungsklausur HS 1.12020-03-03 00:00:00
          noch 8 Tage

          Wiederholungsklausur HS 1.2
          2020-03-05 00:00:00 
          Ich glaube die Bemerkung, dass ich den Grund nicht verstehe, kann ich mir sparen^^ Ich vermute es liegt an der Variablen $differenz, da ich die ja je Durchlauf der while Schleife anders definiere. Kann ja nicht funktionieren, oder? Aber wie kann ich die Variable für jeden Durchlauf einzigartig benennen?
          https://www.php.net/manual/de/langua...s.variable.php
          bin ich damit auf dem richtigen Weg?
          EDIT: Nö, anscheinend nicht. Habe jetzt versucht, alle Variablen in der Funktion von z.B. $differenz in ${$datensatz['id']}differenz umzubenennen. Dachte das wäre dann für den Datensatz mit der ID 4 einfach $4differenz und für den Datensatz mit der ID 5 $5differenz. Geht aber nicht. Jetzt gehen mir die dummen Ideen aus

          Kommentar


          • #6
            Dass beim Abrufen der Daten eine Schleife mit mehrfachem Aufruf von mysqli_fetch_assoc() fehlt wurde ja schon erwähnt, aber:

            Zitat von Supertim99 Beitrag anzeigen
            id (primary key, AutoIncrement) //ID des Eintrags
            termin (text) //Name des Termins
            datum (varchar(19)) //Datum des Termins
            art (text) //entweder "klausur" oder "praxis" -> soll später farblich unterschiedlich dargestellt werden
            Dein Datenbankdesign ist defekt: bei termin und art wäre als Typ VARCHAR sinnvoller (für art ggf. ENUM) und datum sollte vom type DATE sein, VARCHAR ist da völlig falsch (den Typ von id schreibst du nicht, deswegen lässt sich dazu nichts sagen).

            Kommentar


            • #7
              Hast du das error-reporting aktiviert?

              Du deklarierst eine Funktion innerhalb einer Schleife, das heisst x-mal. Eigentlich müsste PHP hier einen "cannot redeclare function" Fehler werfen.

              PHP-Logik hat nichts innerhalb von HTML-Code verloren. Beschäftige Dich mal mit EVA (Eingabe - Verarbeitung - Ausgabe). D.h. in Deinem Fall würdest du zuerst alle Daten holen, die verarbeiten und dann anschliessend unten dran ausgeben.

              Kommentar


              • #8
                Zitat von Supertim99 Beitrag anzeigen
                Wenn ich alles ab "//Countdown" weglasse, werden mir alle Daten perfekt untereinander ausgegeben. Wenn ich aber versuche, mir einen Countdown zu basteln (aus einem Tutorial geklaut, hat funktioniert als ich die Termine manuell einzeln in der PHP/HTML Datei eingetragen habe ohne Datenbank), funktioniert dieser beim ersten Eintrag, beim zweiten nicht und die nachfolgenden werden überhaupt nicht mehr angezeigt:

                Wiederholungsklausur HS 1.1: 2020-03-03 00:00:00[…]
                Du erstellst bei jedem Schleifendurchlauf die Funktion diff_time (bzw. versuchst es) - das geht aber nicht, beim zweiten Durchlauf kracht es und das Script steigt vmtl mit einem Fatal error aus den du wohl aufgrund falscher Einstellungen (error_reporting und display_errors aufdehen!) nicht zu sehen bekommst. Aber um die Differenz zu berechnen brauchst du die Funktion überhaupt nicht, die DateTime-Klasse existiert bzw. Mysql kann das auch selbst.
                Und: das was du hier an der datum-Spalte postest passt nicht zu dem was in #1 steht, trotzdem sollte/muss die Spalte vom Typ DATE bzw. DATETIME sein.

                Kommentar


                • #9
                  Zitat von tk1234 Beitrag anzeigen
                  Du erstellst bei jedem Schleifendurchlauf die Funktion diff_time (bzw. versuchst es) - das geht aber nicht, beim zweiten Durchlauf kracht es und das Script steigt vmtl mit einem Fatal error aus den du wohl aufgrund falscher Einstellungen (error_reporting und display_errors aufdehen!) nicht zu sehen bekommst.
                  Richtig. Habe es jetzt eingestellt und sehe den Fehler. Klingt auch logisch
                  Zitat von tk1234 Beitrag anzeigen
                  Aber um die Differenz zu berechnen brauchst du die Funktion überhaupt nicht, die DateTime-Klasse existiert bzw. Mysql kann das auch selbst.
                  Schaue ich mir mal an
                  Zitat von tk1234 Beitrag anzeigen
                  Und: das was du hier an der datum-Spalte postest passt nicht zu dem was in #1 steht, trotzdem sollte/muss die Spalte vom Typ DATE bzw. DATETIME sein.
                  Habe ja den Typen zwischenzeitlich von VARCHAR zu DATETIME geändert.

                  Zum Verständnis: Warum ist bei den anderen Spalten VARCHAR besser als TEXT?
                  Typ der id ist INT, ist denke ich klar.

                  Kommentar


                  • #10
                    Termine werden nicht in unix Timestamp Format in die DB eingetragen sondern im ISO Format. Bitte lerne die Grundlagen.
                    Links dazu hast du ja schon erhalten.

                    Kommentar


                    • #11
                      Zitat von Supertim99 Beitrag anzeigen
                      Habe ja den Typen zwischenzeitlich von VARCHAR zu DATETIME geändert. DATE macht keinen Sinn, weil ich, wenn ich einen Termin anlege, das Datum weiß und nicht den UNIX Zeitstempel, wie soll ich den also eintragen. Wenn ich aber mein Problem hier gelöst habe werde ich ein Formular zum Termin hinzufügen bauen und dann versuchen mit $datum = strtotime($_POST['datum']) das im Formular eingetragene Datum direkt in den UNIX Zeitstempel zu konvertieren und so (als DATE Typ) in der DB zu speichern. Dann müsste ich danach auch leichter damit rechnen können.
                      Mit DATE kannst du genauso rechnen wie mit DATETIME - das Format des Datums ist bei beiden Formaten gleich, bei DATETIME ist halt nur noch die Zeit dabei (2020-02-23 vs. 2020-02-23 16:03:06). Wenn du die Zeit brauchst, nimm DATETIME, sonst DATE - mit dem UNIX-Zeitstempel hat das alles nichts zu tun, den solltest du auch nicht verwenden (zu viele Einschränkungen).

                      Zitat von Supertim99 Beitrag anzeigen
                      Zum Verständnis: Warum ist bei den anderen Spalten VARCHAR besser als TEXT?
                      Typ der id ist INT, ist denke ich klar.
                      Weniger Speicherbedarf. Wirklich relevant ist das bei dir vermutlich eher nicht, trotzdem mache ich mir idR beim Anlegen einer Tabelle Gedanken was da mal rein soll und wähle die Spaltentypen entsprechend aus (auch meist einen kleineren INT-Typ oder erwartest du >2 bzw. >4 (bei unsigned int) Milliarden Einträge?)

                      Kommentar


                      • #12
                        Zitat von tk1234 Beitrag anzeigen
                        mit dem UNIX-Zeitstempel hat das alles nichts zu tun
                        Hm ne stimmt, da hab ich eben beim Nachlesen was falsch verstanden.

                        Kommentar

                        Lädt...
                        X