Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL-Abfrage wird nur zum Teil über PHP ausgegeben. 1 Wert fehlt - Wo ist der Fehler?

Einklappen

Neue Werbung 2019

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

  • SQL-Abfrage wird nur zum Teil über PHP ausgegeben. 1 Wert fehlt - Wo ist der Fehler?

    Hey liebe PHP-SQL-Experten,

    ich habe folgenden PHP-/SQL-Code:
    PHP-Code:
                $sql mysqli_query($db,"
                                            SELECT DISTINCT CONCAT(u.firstname, ' ' ,u.lastname) AS Student, course.fullname AS Course
                                            FROM mdl_course AS course 
                                            JOIN mdl_enrol AS en ON en.courseid = course.id
                                            JOIN mdl_user_enrolments AS ue ON ue.enrolid = en.id
                                            JOIN mdl_user AS u ON ue.userid = u.id
                                            WHERE u.id = '
    $user_id[$i]'"
                                            
    );


                        
    $sql_durchfuehren=mysqli_fetch_row($sql);                    
                        
    //echo is_array($sql_durchfuehren) ? "Ja-Array" : "Nein kein Array";
                        
    if (is_array($sql_durchfuehren))    
                        {
                            
    $sql_durchfuehren array_filter($sql_durchfuehren);
                        }

                        if (
    is_array($sql_durchfuehren))
                        {    
                            echo 
    "Der Benutzer ist in die folgenden Kurse eingeschrieben: <br>";                
                            while(
    $row mysqli_fetch_array($sql))
                            {
                              
    $course_name $row['Course'];
                              echo 
    $course_name." <br>";        
                            }    
                        }
                        else 
                        {
                            echo 
    "<br>Der Benutzer ".$first_name[$i]." ".$last_name[$i]." ist in keinen Kurs eingeschrieben!<br>";
                        } 
    Die Query funktioniert über PHPmyAdmin problemlos.

    Wenn ich nun mittels der while-Schleife das Array ausgeben möchte, unterschlägt mir die Ausgabe einen Wert.
    Was mache ich falsch?

    Danke für Eure Hilfe und bleibt gesund!

    D-T

  • #2
    Warum verwendest du array_filter? Filtere die Daten doch entsprechend mit SQL, dann musst du hinterher nicht nacharbeiten.
    Im übrigen mit jedem fetch wird ein Datensatz aus der DB geholt ob du den nun ausgibst oder nicht. Jetzt schaue dir das noch mal an und ändere es.

    Kommentar


    • #3
      Zunächst Danke.... mit Filter wollte ich die "leeren" Array-Einträge rausfiltern.

      Der Fehler muss in der While-Schleife liegen, ich finde ihn aber leider nicht

      Kommentar


      • #4
        Zitat von Dream-Teacher Beitrag anzeigen
        Zunächst Danke.... mit Filter wollte ich die "leeren" Array-Einträge rausfiltern.
        Wozu? Aus Spaß? Denn bewirken tut das in dem gezeigten Code nichts. Und das doppelte is_array() ist auch sinnlos.

        Zitat von Dream-Teacher Beitrag anzeigen
        Der Fehler muss in der While-Schleife liegen, ich finde ihn aber leider nicht
        Nein, der Fehler ist vor der Schleife das mysqli_fetch_row().

        Kommentar


        • #5
          Hey,

          super Danke!

          Jetzt sieht das Ganze wie folgt aus:
          PHP-Code:
          //Jetzt erfolgt die Überprüfung und Ausgabe, in welchen Kursen der Benutzer eingeschrieben ist. Die User-Identifikation erfolgt anhzand der user_id
                              
          $sql mysqli_query($db,"
                                                  SELECT DISTINCT CONCAT(u.firstname, ' ' ,u.lastname) AS Student, course.fullname AS Course
                                                  FROM mdl_course AS course 
                                                  JOIN mdl_enrol AS en ON en.courseid = course.id
                                                  JOIN mdl_user_enrolments AS ue ON ue.enrolid = en.id
                                                  JOIN mdl_user AS u ON ue.userid = u.id
                                                  WHERE u.id = '
          $user_id[$i]'"
                                                  
          );


                              
          //$sql_durchfuehren=mysqli_fetch_array($sql);                    
                              //echo is_array($sql_durchfuehren) ? "Ja-Array" : "Nein kein Array";
                              /*                    
                              if (is_array($sql_durchfuehren))    
                              {
                                  $sql_durchfuehren = array_filter($sql_durchfuehren);
                              }
                              */                            
                              
          if (is_array($sql_durchfuehren))
                              {    

                                  echo 
          "Der Benutzer ist in die folgenden Kurse eingeschrieben: <br>";                
                                  while(
          $row mysqli_fetch_assoc($sql))
                                  {
                                    
          $course_name $row['Course'];
                                    echo 
          $course_name." <br>";        
                                  }    
                              }
                              else 
                              {
                                  echo 
          "Der Benutzer ".$first_name[$i]." ".$last_name[$i]." ist in keinen Kurs eingeschrieben!<br>";
                              }

                          echo
          "<hr>"
          Heißt, dieses Filter-Spielchen habe ich raus genommen... !

          Mein Ziel ist jetzt folgendes:
          Wenn das Array-leer ist, soll ausgegeben werden:
          Der Benutzer ist in keinen Kurs eingeschrieben....

          Welchen Befehl brauche ich da da? Mit Empty habe ich es nicht hinbekommen.

          Danke, wirklich! für Eure Hilfe!

          D-T

          Kommentar


          • #6
            Das ergibt keinen Sinn. Deine SQL-Abfrage liefert keine leeren Arrays.

            Kommentar


            • #7
              Was für ein Array?
              Du hast eine DB Abfrage, damit holst du Datensätze, bitte lerne die Begriffe. Ein Array wird es dann wenn du einen Datensatz mit fetch_assoc abholst. Du hast also entwder einen Datensatz der nicht vohanden ist oder Null.

              Zudem hast du irreführende Namen in Verwendung. Course ist bei dir in der DB-Abfrage ein mal ein Spaltenalias und ein anderes mal ein Tabellenalias, damit führst du nicht nur uns in die Irre sondern evtl. auch die DB. Verwende eindeutige Namen als Alias.

              Des weiteren solltest du bei DB-Problemen, deine Tabellenstruktur und ein paar Datensäze zur Verfügs stellen und zwar als Create Statement(als Text hier einfügen), damit man das nachvollziehen kann. Bis jetzt siehst nur du die Ausgabe der Daten und weist wovon du sprichst und was fehlt, uns fehlt da jeglicher Zusammenhang. du kannst auch auf sqlfiddle.com ein Beispiel erstellen, wenn du magst.
              Der Präfix mdl_ soll für was stehen, ich würde die Tabellen ja ohne solche Präfixe erstellen, aber da hat jeder so seine eigene Ansichtsweise.

              PHP-Code:
              WHERE u.id '$user_id[$i]'" 
              Das Einfügen von sochen Variablen in das SQL Statement birgt zu 99,99% ein Sicherheitsheitsproblem, warum nicht prepared Statement verwenden?

              Kommentar


              • #8
                Zitat von hellbringer Beitrag anzeigen
                Das ergibt keinen Sinn. Deine SQL-Abfrage liefert keine leeren Arrays.
                Nochmals Danke,

                Die Abfrage ist Abhängig von der user_id und ich habe tatsächlich auch user dabei, die in keine Kurse eingeschrieben sind.
                Entsprechend gibt die Query auch keine Ergebnisse zurück. Getestet in PHPmyadmin.

                Diese Situation, das eben nichts ausgegeben wird, möchte ich "abfangen".
                Dafür suche ich noch eine Möglichkeit.

                Danke und beste Grüße D-T

                Kommentar


                • #9
                  Zitat von Dream-Teacher Beitrag anzeigen
                  Diese Situation, das eben nichts ausgegeben wird, möchte ich "abfangen".
                  Dafür suche ich noch eine Möglichkeit.
                  https://www.php.net/manual/en/mysqli...t.num-rows.php

                  Kommentar


                  • #10
                    Danke für Deine Hilfe!!
                    Ich habe mir mysqli_num_rows angeschaut.
                    Ich kriege damit die Anzahl der Kurse ausgegeben, ABER

                    Wenn ein Benutzer in KEINE KURSE eingeschrieben ist, liefert die FUnktion NICHTS zurück.
                    Also auch nicht die Werte 0 oder NULL - Die Ausgabe (echo(mysqli_num_rows($sql)), die eigentlich die Anzahl ausgibt, bleibt "leer".

                    Auch ein Test mit empty hilft hier nicht weiter. Scheinbar ist die Variable dann NICHT LEER.

                    Meine konkrete Frage: Welchen Wert liefert die Funktion zurück, wenn Sie NICHTS zurückgibt, auf was muss ich in der IF_Anweisung prüfen?

                    Danke!!!

                    Das Forum ist top!

                    D-T

                    Kommentar


                    • #11
                      Steht in der Beschreibung
                      int, also eine Ganzzahl, wenn keine Ergebnisse vorliegen dann 0.
                      Dort steht auch was von buffered result sets, bitte alles komplett lesen.
                      Du brauchst dort also möglicherweise ein store_result um die Rückgabe zu speichern.

                      Du willst zudem
                      PHP-Code:
                      echo "Der Benutzer ".$first_name[$i]." ".$last_name[$i]." ist in keinen Kurs eingeschrieben!<br>"
                      ausgeben, aber wenn kein Kurs vorhanden ist, wird aufgrund des JOIN auch kein Datensatz geliefert, so dass du den Namen auch gar nicht erfährst, daher muss du für den Namen eine zweite Anfrage durchführen um den Namen und Vornamen zu erfahren. Am Besten natürlich vor der Kursabfrage, dann reduziert sich auch die zweite Abfrage.
                      Zudem scheint mir das mit dem JOIN auch nicht korrekt. Du musst mit mdl_user_enrolments anfangen, und die anderen Tabellen dann mit LEFT JOIN verbinden.

                      Du musst zudem immer die Fehler abfangen. Wenn die Abfrage fehlschlägt aufgrund eine Fehlers, dann ist auch alles weitere Sinnlos, weil keine Daten gezählt werden können, siehe dazu den Hinweis Note unter store_result.

                      Versuche das mal umzusetzen.

                      Kommentar


                      • #12
                        Und noch ein ergänzender Hinweis:

                        echo eignet sich nicht wirklich zum Debuggen. Verwende var_dump(), dann siehst du auch was die Funktion wirklich zurückliefert.

                        Kommentar


                        • #13
                          Zitat von Dream-Teacher Beitrag anzeigen
                          Wenn ein Benutzer in KEINE KURSE eingeschrieben ist, liefert die FUnktion NICHTS zurück.
                          Also auch nicht die Werte 0 oder NULL
                          "NICHTS" gibt es bei PHP nicht. Bitte nichts neues dazu erfinden, sondern sich an den Datentypen von PHP orientieren. Es ist alles dokumentiert.

                          Zitat von Dream-Teacher Beitrag anzeigen
                          - Die Ausgabe (echo(mysqli_num_rows($sql)), die eigentlich die Anzahl ausgibt, bleibt "leer".
                          echo eignet sich zur Ausgabe von Text, aber das wars auch schon.

                          Zitat von Dream-Teacher Beitrag anzeigen
                          Auch ein Test mit empty hilft hier nicht weiter. Scheinbar ist die Variable dann NICHT LEER.
                          Was empty() macht, ist genau dokumentiert. Bitte lies öfters die PHP-Doku, bevor du irgendwelche Annahmen triffst.

                          Zitat von Dream-Teacher Beitrag anzeigen
                          Meine konkrete Frage: Welchen Wert liefert die Funktion zurück, wenn Sie NICHTS zurückgibt, auf was muss ich in der IF_Anweisung prüfen?
                          "NICHTS" gibt es nicht.

                          Kommentar


                          • #14
                            Ich bin wirklich dankbar hellbringer für Deine Antwort, sowie für die Antworten der Kolegen.
                            Es ist richtig, dass es NICHTS nicht gibt, aber auf welchen Wert muss ich denn nun prüfen, wenn im STRING nichts ausgegeben wird?
                            Sorry, ich arbeite daran besser zu werden... für Euch sind es Kleinigkeiten... Nochmals Danke!
                            Danke !

                            Kommentar


                            • #15
                              Zitat von Dream-Teacher Beitrag anzeigen
                              aber auf welchen Wert muss ich denn nun prüfen, wenn im STRING nichts ausgegeben wird?
                              Du musst eben die PHP-Doku zu den Funktionen lesen, welche Rückgabewerte diese haben. Auf diese musst/kannst du prüfen.

                              Kommentar

                              Lädt...
                              X