Ankündigung

Einklappen
Keine Ankündigung bisher.

Uncaught TypeError: timetable is undefined

Einklappen

Neue Werbung 2019

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

  • Uncaught TypeError: timetable is undefined

    Liebes PHP.de-Forum,

    heute habe ich eine kompliziertere Frage (denke ich)

    Ich habe folgenden JavaScript-Code:
    Code:
    var pupilGroups = ["test"];
                var value = '<table class="w3-table" id="timetable"><thead><th>Zeit</th><th>Montag</th><th>Dienstag</th><th>Mittwoch</th><th>Donnerstag</th><th>Freitag</th></thead><tbody>';
                var timetable = ajaxSQLQuery("SELECT NAME, TIME, STATE, GROUPS, DAY FROM topics ORDER BY FIELD (DAY, 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag');");
                function stateHTML (index) {
                    if (timetable[index][2] === 12) {
                        return("<td id='l:" + timetable[index][0] + "' class='alert alert-success'>" + timetable[index][0] + "</td>");
                    } else {
                        switch(timetable[index][2]) {
                            case 4:
                                return("<td id='l:" + timetable[index][0] + "' class='alert alert-warning'>" + timetable[index][0] + "</td>");
                            case 5:
                                return("<td id='l:" + timetable[index][0] + "' class='alert alert-warning'>" + timetable[index][0] + "</td>");
                            case 10:
                                return("<td id='l:" + timetable[index][0] + "' class='alert alert-warning'>" + timetable[index][0] + "</td>");
                            default:
                                return("<td id='l:" + timetable[index][0] + "' class='alert alert-danger'>" + timetable[index][0] + "</td>");
                        }
                    }
                }
                var i;
                for (i = 0; i < timetable.length; i++) {
                    if (!timetable[i][3].some(r=> pupilGroups.includes(r))) {
                        timetable.splice(i, 1)
                    }
                }
                var one = [];
                var two = [];
                var three = [];
                var four = [];
                var five = [];
                var six = [];
                var seven = [];
                var eight = [];
                var nine = [];
                for (i = 0; i < timetable.length; i++) {
                    var current = timetable[i];
                    switch (current[1]) {
                        case "08:30:00":
                            one.push(stateHTML(i));
                        case "09:15:00":
                            two.push(stateHTML(i));
                        case "10:00:00":
                            three.push(stateHTML(i));
                        case "11:15:00":
                            four.push(stateHTML(i));
                        case "12:00:00":
                            five.push(stateHTML(i));
                        case "13:15:00":
                            six.push(stateHTML(i));
                        case "14:00:00":
                            seven.push(stateHTML(i));
                        case "14:30:00":
                            eight.push(stateHTML(i));
                        case "15:15:00":
                            nine.push(stateHTML(i));
                    }
                }
                for (i = 0; i < one.length; i++) {
                    value += "<tr>" + one[i];    
                }
                value += "</tr>";
                for (i = 0; i < two.length; i++) {
                    value += "<tr>" + two[i];
                }
                value += "</tr>";
                for (i = 0; i < three.length; i++) {
                    value += "<tr>" + three[i];
                }
                value += "</tr>";
                for (i = 0; i < four.length; i++) {
                    value += "<tr>" + four[i];                
                }
                value += "</tr>";
                for (i = 0; i < five.length; i++) {
                    value += "<tr>" + five[i];                
                }
                value += "</tr>";
                for (i = 0; i < six.length; i++) {
                    value += "<tr>" + six[i];                
                }
                value += "</tr>";
                for (i = 0; i < seven.length; i++) {
                    value += "<tr>" + seven[i];                
                }
                value += "</tr>";
                for (i = 0; i < eight.length; i++) {
                    value += "<tr>" + eight[i];            
                }
                value += "</tr>";
                for (i = 0; i < nine.length; i++) {
                    value += "<tr>" + nine[i];                
                }
                value += "</tr></tbody></table>";
                document.write(value);
    Die Funktion ajaxSQLQuery sendet ein Request an eine PHP-Datei, welche das Request anschließend an MySQL weiterleitet. Wenn ich nun aber diesen Code ausführe, kommt der Fehler
    Code:
    Uncaught TypeError: timetable is undefined
    Die Datenbank sieht folgendermaßen aus:
    Code:
    +--------------+----------+-------+----------+------------+
    | NAME         | TIME     | STATE | GROUPS   | DAY        |
    +--------------+----------+-------+----------+------------+
    | NuT 8        | 08:30:00 |    12 | ["test"] | Montag     |
    | Freiarbeit   | 10:00:00 |    12 | ["test"] | Montag     |
    | Sport        | 11:15:00 |    12 | ["test"] | Montag     |
    | Mathe 8      | 08:30:00 |    12 | ["test"] | Dienstag   |
    | Freiarbeit   | 10:00:00 |    12 | ["test"] | Dienstag   |
    | Freiarbeit   | 11:15:00 |    12 | ["test"] | Dienstag   |
    | Wirtschaft 8 | 08:30:00 |    12 | ["test"] | Mittwoch   |
    | French       | 10:00:00 |    12 | ["test"] | Mittwoch   |
    | Englisch     | 11:15:00 |    12 | ["test"] | Mittwoch   |
    | Musik        | 08:30:00 |    12 | ["test"] | Donnerstag |
    | Freiarbeit   | 10:00:00 |    12 | ["test"] | Donnerstag |
    | Kunst 8      | 11:15:00 |    12 | ["test"] | Donnerstag |
    | Freiarbeit   | 08:30:00 |    12 | ["test"] | Freitag    |
    | Freiarbeit   | 10:00:00 |    12 | ["test"] | Freitag    |
    | Freiarbeit   | 11:15:00 |    12 | ["test"] | Freitag    |
    +--------------+----------+-------+----------+------------+
    15 rows in set (0.003 sec)
    Hier die Struktur:

    Code:
    +---------+--------------+------+-----+---------+----------------+
    | Field   | Type         | Null | Key | Default | Extra          |
    +---------+--------------+------+-----+---------+----------------+
    | INDEX   | int(11)      | NO   | PRI | NULL    | auto_increment |
    | NAME    | varchar(255) | YES  |     | NULL    |                |
    | TIME    | time         | YES  |     | NULL    |                |
    | ENDTIME | time         | YES  |     | NULL    |                |
    | STATE   | tinyint(2)   | NO   | MUL | NULL    |                |
    | GROUPS  | longtext     | YES  |     | NULL    |                |
    | DAY     | varchar(10)  | YES  |     | NULL    |                |
    | ROOM    | varchar(3)   | YES  |     | NULL    |                |
    | TEACHER | varchar(255) | YES  |     | NULL    |                |
    +---------+--------------+------+-----+---------+----------------+
    9 rows in set (0.031 sec)
    Warum tritt dieser Fehler auf? Mache ich etwas falsch?

    Vielen Dank im Voraus

  • #2
    Warum tritt dieser Fehler auf? Mache ich etwas falsch?
    Das ist i.d.R. mit "Ja" zu beantworten.

    Die Browser Konsole zeigt Dir auch an, in welcher Zeile der Fehler auftritt. Zudem ist sie relativ aussagekräftig, timetable scheint vor Verwendung nicht definiert worden zu sein.
    Je nachdem, wie Du die SQL-Query abfeuerst oder die Rückgabe machst, scheint nicht das anzukommen, was Du erwartest.

    Schau Dir das PHP.Script allein an und was es für eine Rpckgabe erzeugt. Dann schaust Du mit console.log oder console.table, was JavaScript zurückbekommt.
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Arne Drews Dieser Code wird von PHP zurückgegeben:
      Code:
      [["NuT 8","08:30:00","12","[\"test\"]","Montag"],["Freiarbeit","10:00:00","12","[\"test\"]","Montag"],["Sport","11:15:00","12","[\"test\"]","Montag"],["Mathe 8","08:30:00","12","[\"test\"]","Dienstag"],["Freiarbeit","10:00:00","12","[\"test\"]","Dienstag"],["Freiarbeit","11:15:00","12","[\"test\"]","Dienstag"],["Wirtschaft 8","08:30:00","12","[\"test\"]","Mittwoch"],["French","10:00:00","12","[\"test\"]","Mittwoch"],["Englisch","11:15:00","12","[\"test\"]","Mittwoch"],["Musik","08:30:00","12","[\"test\"]","Donnerstag"],["Freiarbeit","10:00:00","12","[\"test\"]","Donnerstag"],["Kunst 8","11:15:00","12","[\"test\"]","Donnerstag"],["Freiarbeit","08:30:00","12","[\"test\"]","Freitag"],["Freiarbeit","10:00:00","12","[\"test\"]","Freitag"],["Freiarbeit","11:15:00","12","[\"test\"]","Freitag"]]
      Wenn ich die Daten in der Konsole nach dem Request ausgeben lasse, kommt alles an, wie oben. Sobald ich aber das Ganze als Variable verwende, funktionierts irgendwie nicht mehr. Wenn ich die Variable in der Konsole ausgeben möchte, erhalte ich undefined als Antwort, als würde ich die Variable gar nicht deklariert haben.

      Du hast es geschafft, dass ich komplett auf dem Schlauch stehe... Kannst du dir das erklären?
      Vielen Dank für deine Antwort!

      Kommentar


      • #4
        Das sieht aus als verwendetest du asynchronen Code (ajaxSQLQuery) synchron, was natürlich nicht funktioniert. Und document.write() macht es auch nicht wirklich besser.

        Kommentar


        • #5
          Dormilich das könnte ein Argument sein... Hier mein Code für die Funktion:

          Code:
          function ajaxSQLQuery (SQLquery) {
            $.post(
                  "/modules/communicator.php",
                  {
                      action: "PHP_sqlexecutequery",
                      query: SQLquery
                  },
                  function(result) {
                      return result;
                  }
              );
          }
          Es ist kein Ajax, soweit ich weiß (ich sollte mal meine Funktionnamen überdenken), aber es könnte durchaus asynchroner Code sein. Was würdest du vorschlagen, wenn dem so ist? Soll ich stattdessen das klassische XHR verwenden?

          Kommentar


          • #6
            Wenn der Schnipsel der Grund für jQuery ist, dann solltest Du das weglassen und nativ mit dem XmlHttpRequest-Objekt arbeiten.
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar


            • #7
              Zitat von nicom Beitrag anzeigen
              Es ist kein Ajax, soweit ich weiß (ich sollte mal meine Funktionnamen überdenken)
              Das ist sowas von AJAX.

              Zitat von nicom Beitrag anzeigen
              Soll ich stattdessen das klassische XHR verwenden?
              Das ändert nichts daran, dass es asynchroner Code bleibt.

              Kommentar


              • #8
                Es ist ausserdem eine ganz, ganz schlechte Idee eine Query auf diese Art an den Server zu senden und dann direkt auszuführen. Ich könnte Dir problemlos die ganze Datenbank löschen.

                Kommentar


                • #9
                  jonas3344 Danke für die Nachricht, aber der root-Account wird später nicht mehr für die Anmeldung verwendet, ich habe bereits einen Account angelegt, welcher nur SELECT und INSERT Rechte hat. Zwar können dann leider immer noch falsche Daten eingespeist werden, aber ich bin gerade dabei, eine Lösung zu finden.
                  Dormilich Ich habe gerade versucht, ein synchrones Request mit XHR zu machen:
                  Code:
                  function xhrSQLQuery (SQLquery) {
                      var url = "/modules/communicator.php?action=PHP_sqlexecutequery&query=" + SQLquery;
                      var xhr = new XMLHttpRequest();
                      xhr.onreadystatechange = function() {
                          if (this.readyState == 4 && this.status == 200) {
                              return(xhr.responseText);
                          }
                      };
                      xhr.open("POST", url, false);
                      xhr.send();
                  }
                  Wenn ich nun in der Konsole auf das Request klicke, zeigt er mir das Ergebnis richtig an. Wenn ich aber das Ganze mit Code anzeigen möchte, etwa so:
                  Code:
                  console.log(xhrSQLQuery())
                  Dann kommt wieder undefined als Antwort. Was mache ich falsch?

                  Kommentar


                  • #10
                    @alle Ich hatte gerade einen GEISTESBLITZ!

                    Ich kann diesen Skript doch auch über PHP ausführen! Somit muss ich mich nicht mit asynchronen Requests herumschlagen, sondern kann die Tabelle gleich auf dem Server vorbereiten!

                    Vielen Dank für eure Hilfe trotzdem!

                    Kommentar


                    • #11
                      Ein synchroner Request ist eine ganz schlechte Idee, weil das den Browser blockiert.

                      Es gibt übrigens Dokus mit Beispielen:

                      https://developer.mozilla.org/en-US/...onous_Requests

                      Warum liest man die nicht einfach mal, statt irgendwas im Durcheinander herumzuprobieren?

                      Kommentar


                      • #12
                        @Alle Irgendwas passt immer noch nicht. Ich habe jetzt alles in PHP Code umgewandelt und soweit ich beurteilen kann, stimmt alles:
                        PHP-Code:
                        <?php
                                    $pupilGroups 
                        = ["test"];
                                    
                        $pupilString implode(" "$pupilGroups);
                                    
                        $query "SELECT NAME, TIME, STATE, GROUPS, DAY FROM topics WHERE GROUPS LIKE '%{$pupilString}%' ORDER BY FIELD (DAY, 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag');";
                                    
                        $value '<table class="w3-table" id="timetable"><thead><th>Zeit</th><th>Montag</th><th>Dienstag</th><th>Mittwoch</th><th>Donnerstag</th><th>Freitag</th></thead><tbody>';
                                    
                        $conn mysqli_connect("localhost:3306""root""""montemanager");
                                    
                        $timetable mysqli_fetch_all(mysqli_query($conn$query));
                                    function 
                        stateHTML ($index$table) {
                                        if (
                        $table[$index][2] === 12) {
                                            return(
                        "<td id='l:" $table[$index][0] . "' class='alert alert-success'>" $table[$index][0] . "</td>");
                                        } else {
                                            switch(
                        $table[$index][2]) {
                                                case 
                        4:
                                                    return(
                        "<td id='l:" $table[$index][0] . "' class='alert alert-warning'>" $table[$index][0] . "</td>");
                                                case 
                        5:
                                                    return(
                        "<td id='l:" $table[$index][0] . "' class='alert alert-warning'>" $table[$index][0] . "</td>");
                                                case 
                        10:
                                                    return(
                        "<td id='l:" $table[$index][0] . "' class='alert alert-warning'>" $table[$index][0] . "</td>");
                                                default:
                                                    return(
                        "<td id='l:" $table[$index][0] . "' class='alert alert-danger'>" $table[$index][0] . "</td>");
                                            }
                                        }
                                    }
                                    
                        $one = [1];
                                    
                        $two = [2];
                                    
                        $three = [3];
                                    
                        $four = [4];
                                    
                        $five = [5];
                                    
                        $six = [6];
                                    
                        $seven = [7];
                                    
                        $eight = [8];
                                    
                        $nine = [9];
                                    
                        $i;
                                    for (
                        $i 0$i count($timetable); $i++) {
                                        
                        $current $timetable[$i];
                                        switch (
                        $current[1]) {
                                            case 
                        "08:30:00":
                                                
                        array_push($onestateHTML($i$timetable));
                                            case 
                        "09:15:00":
                                                
                        array_push($twostateHTML($i$timetable));
                                            case 
                        "10:00:00":
                                                
                        array_push($threestateHTML($i$timetable));
                                            case 
                        "11:15:00":
                                                
                        array_push($fourstateHTML($i$timetable));
                                            case 
                        "12:00:00":
                                                
                        array_push($fivestateHTML($i$timetable));
                                            case 
                        "13:15:00":
                                                
                        array_push($sixstateHTML($i$timetable));
                                            case 
                        "14:00:00":
                                                
                        array_push($sevenstateHTML($i$timetable));
                                            case 
                        "14:30:00":
                                                
                        array_push($eightstateHTML($i$timetable));
                                            case 
                        "15:15:00":
                                                
                        array_push($ninestateHTML($i$timetable));
                                        }
                                    }
                                    
                        $value .= "<tr>";
                                    for (
                        $i 0$i count($one); $i++) {
                                        
                        $value .= "<td>" $one[$i] . "</td>";    
                                    }
                                    
                        $value .= "</tr><tr>";
                                    for (
                        $i 0$i count($two); $i++) {
                                        
                        $value .= "<td>" $two[$i] . "</td>";
                                    }
                                    
                        $value .= "</tr><tr>";
                                    for (
                        $i 0$i count($three); $i++) {
                                        
                        $value .= "<td>" $three[$i] . "</td>";
                                    }
                                    
                        $value .= "</tr><tr>";
                                    for (
                        $i 0$i count($four); $i++) {
                                        
                        $value .= "<td>" $four[$i] . "</td>";        
                                    }
                                    
                        $value .= "</tr><tr>";
                                    for (
                        $i 0$i count($five); $i++) {
                                        
                        $value .= "<td>" $five[$i] . "</td>";
                                    }
                                    
                        $value .= "</tr><tr>";
                                    for (
                        $i 0$i count($six); $i++) {
                                        
                        $value .= "<td>" $six[$i] . "</td>";                
                                    }
                                    
                        $value .= "</tr><tr>";
                                    for (
                        $i 0$i count($seven); $i++) {
                                        
                        $value .= "<td>" $seven[$i] . "</td>";                
                                    }
                                    
                        $value .= "</tr><tr>";
                                    for (
                        $i 0$i count($eight); $i++) {
                                        
                        $value .= "<td>" $eight[$i] . "</td>";            
                                    }
                                    
                        $value .= "</tr><tr>";
                                    for (
                        $i 0$i count($nine); $i++) {
                                        
                        $value .= "<td>" $nine[$i] . "</td>";                
                                    }
                                    
                        $value .= "</tr></tbody></table>";
                                    echo(
                        $value);
                        ?>
                        So sieht die Datenbank in MySQL aus:
                        Code:
                        +-------+--------------+----------+----------+-------+----------+------------+------+-------------------+
                        | INDEX | NAME         | TIME     | ENDTIME  | STATE | GROUPS   | DAY        | ROOM | TEACHER           |
                        +-------+--------------+----------+----------+-------+----------+------------+------+-------------------+
                        |     2 | NuT 8        | 08:30:00 | 09:45:00 |    12 | ["test"] | Montag     | NULL | Frau Brüderl      |
                        |     3 | Freiarbeit   | 10:00:00 | 10:45:00 |    12 | ["test"] | Montag     | NULL | Frau Tillmann     |
                        |     4 | Sport        | 11:15:00 | 12:45:00 |    12 | ["test"] | Montag     | NULL | Herr Brückner     |
                        |     5 | Mathe 8      | 08:30:00 | 09:45:00 |    12 | ["test"] | Dienstag   | NULL | Frau Brüderl      |
                        |     6 | Freiarbeit   | 10:00:00 | 10:45:00 |    12 | ["test"] | Dienstag   | NULL | Frau Tillmann     |
                        |     7 | Freiarbeit   | 11:15:00 | 12:45:00 |    12 | ["test"] | Dienstag   | NULL | Frau Tillmann     |
                        |     8 | Wirtschaft 8 | 08:30:00 | 09:45:00 |    12 | ["test"] | Mittwoch   | NULL | Frau Hellmann     |
                        |     9 | French       | 10:00:00 | 10:45:00 |    12 | ["test"] | Mittwoch   | NULL | Frau L'Helguen    |
                        |    10 | Englisch     | 11:15:00 | 12:45:00 |    12 | ["test"] | Mittwoch   | NULL | Frau Cripps-Brück |
                        |    11 | Musik        | 08:30:00 | 09:45:00 |    12 | ["test"] | Donnerstag | NULL | Herr Steiner      |
                        |    12 | Freiarbeit   | 10:00:00 | 10:45:00 |    12 | ["test"] | Donnerstag | NULL | Frau Tillmann     |
                        |    13 | Kunst 8      | 11:15:00 | 12:45:00 |    12 | ["test"] | Donnerstag | NULL | Frau Weber        |
                        |    14 | Freiarbeit   | 08:30:00 | 09:45:00 |    12 | ["test"] | Freitag    | NULL | Frau Tillmann     |
                        |    15 | Freiarbeit   | 10:00:00 | 10:45:00 |    12 | ["test"] | Freitag    | NULL | Frau Tillmann     |
                        |    16 | Freiarbeit   | 11:15:00 | 12:45:00 |    12 | ["test"] | Freitag    | NULL | Frau Tillmann     |
                        +-------+--------------+----------+----------+-------+----------+------------+------+-------------------+
                        15 rows in set (0.016 sec)
                        Komischerweise duplizieren sich manche Unterrichte und sind in falschen Arrays drin. Ich kann leider keinen Screenshot hochladen, aber ich kann euch den Link zum Screenshot geben: http://montemanager.de/stundenplan.png

                        Warum passiert das? Ich kann nicht mehr denken... Ich sitze jetzt schon Stunden an diesem Projekt...

                        Bitte helft mir!

                        Kommentar

                        Lädt...
                        X