Ankündigung

Einklappen
Keine Ankündigung bisher.

Darstellen von Ergebnissen einer DB-Abfrage in einer Tabelle mit PDO

Einklappen

Neue Werbung 2019

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

  • #31
    mach mal var_dump($row);

    Kommentar


    • #32
      Wow, da is ganz schön viel drin!

      Ich hab´s!!

      PHP-Code:

        
      foreach ($row as $value) {    //  goes around until there are no columns left
              
      echo "<td>" $value "</td>"//Prints the data
        

      Vielen Dank, Dormilich!!

      Kommentar


      • #33
        Nur Interesse halber:

        Wie hätte man das auch mit PDO::FETCH_NUM lösen können?

        Kommentar


        • #34
          Dann hättest du in dem for() loop über die counter-Variable auf den Wert zugegriffen.

          Kommentar


          • #35
            Darf ich abschließend noch einmal auf die anfängliche Frage der Sicherheit von PDP bzw. PDO Prepared Statements zurückkommen?

            Also wenn man eine Abfrage folgendermaßen macht:


            PHP-Code:

            $stmt 
            $db->prepare('SELECT * FROM `table` WHERE foo = :foo');

            $stmt->bindValue(':foo'$foo);

            $stmt->execute(); 

            ... ist man vor SQL-Injection sicher. Aber warum eigentlich? Ich meine, auch hier müssen die von außen eingegebenen Werte letztendlich in die Datenbank zur Abfrage.

            Und allerletzte Frage: macht es Sinn in puncto Sicherheit zuerst extern eingegebene Werte über mysqli_real_escape_string() laufen zu lassen und dann die Abfrage über Prepared Statements zu machen oder erhöht beides zusammen nicht die Sicherheit im Vergleich zu Prepared Statements alleine?

            Kommentar


            • #36
              ... ist man vor SQL-Injection sicher. Aber warum eigentlich? Ich meine, auch hier müssen die von außen eingegebenen Werte letztendlich in die Datenbank zur Abfrage.
              Ja, aber sie (das SQL Statement und die Daten) werden getrennt voneinander zur DB geschickt, weswegen die Daten nicht mehr als SQL interpretiert werden können.

              Und allerletzte Frage: macht es Sinn in puncto Sicherheit zuerst extern eingegebene Werte über mysqli_real_escape_string() laufen zu lassen und dann die Abfrage über Prepared Statements zu machen oder erhöht beides zusammen nicht die Sicherheit im Vergleich zu Prepared Statements alleine?
              Das ist sogar das verkehrteste, was du machen kannst, da mysqli_real_escape_string() die Daten verändert.

              Kommentar


              • #37
                So, jetzt bin ich wieder gescheiter geworden!
                Nochmals Vielen Dank für deine Hilfe und deine Geduld!

                Kommentar


                • #38
                  Du Dormilich, eine Frage ist noch aufgetaucht:
                  Soweit ich das jetzt verstanden habe, brauche ich die Prepared Statements NUR im WHERE-Statement und nicht, wenn ich NUR einen JOIN verwende, stimmt das so? Und wenn ja, wieso gibt es beim JOIN keine Injection-Gefahr?

                  Danke!

                  Kommentar


                  • #39
                    -> Handbuch .. es geht um Parameter von Außen.

                    Zitat von Handbuch
                    Die Parameter für Prepared Statements müssen nicht maskiert werden. Der Treiber übernimmt das automatisch. Wenn eine Anwendung ausschließlich Prepared Statements benutzt, kann sich der Entwickler sicher sein, dass keine SQL-Injection auftreten wird. (Wenn aber trotzdem andere Teile der Abfrage aus nicht zuverlässigen Eingaben generiert werden, ist dies immer noch möglich.)
                    http://php.net/manual/de/pdo.prepared-statements.php
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #40
                      Danke für die Info!

                      Hab da jetzt leider am Schluss noch ein Problem bekommen beim Wechsel von mysqli zu PDO:


                      PHP-Code:

                      if ($zeilen 0) {

                      echo 
                      "<table id='myTable' class='tablesorter altRowstable'>";

                      echo 
                      "<thead>";


                      $results = array();

                      while (
                      $row $stmt->fetch(PDO::FETCH_ASSOC)) {
                      $results[] = $row;
                      }

                      echo 
                      "<tr>";
                      echo 
                      "<th>" 'Nr' "</th>";

                      for(
                      $x=0;$x<$spalten;$x++){

                            
                      $column[$x] = array_column($results$fields[$x]->name);          //  puts all existing values of a column into the field-name

                               
                      if(array_filter($column[$x])) {                              //  displays only those columns with at least one value in it

                              
                      $key array_search($fields[$x], $custom_column_arr);
                              if(
                      $key !== false){
                                  echo 
                      "<th>" $key "</th>";
                              }else{
                                  echo 
                      "<th>" $fields[$x] . "</th>";
                              }
                          }
                      }
                      echo 
                      "</tr></thead>";

                      echo 
                      "<tbody>";

                      $nr 1;


                            
                      $stmt $pdo->query($sql);
                      // $result = mysqli_query($db, $sql);

                      while ($row $stmt->fetch(PDO::FETCH_NUM)) {
                      echo 
                      "<tr>";
                      echo 
                      "<td>" $nr "</td>";
                        for (
                      $k=0$k<$spalten$k++) {        //  goes around until there are no columns left

                             
                      $column[$k] = array_column($results$fields[$k]->name);         //  puts all existing values of a column into the field-name

                               
                      if(array_filter($column[$k])) {                               //  displays only those columns with at least one value in it

                              
                      echo "<td>" $row[$k] . "</td>"//Prints the data
                        
                      }
                      }
                      echo 
                      "</tr>";
                      $nr $nr 1;


                      }     
                      // Ende der while-Schleife

                      echo "</tbody></table>";
                      }
                      }

                      mysqli_close($db); 

                      Klappt soweit ganz gut und zeigt alles an, was angezeigt werden soll. Nur das Nicht-Darstellen von leeren Spalten, das unter mysqli geklappt hat, funktioniert noch nicht. Nehme mal an, dass es daran liegt, dass der Wechsel von $result = mysqli_query($db, $sql); zu $stmt = $pdo->query($sql); (oberhalb der while-Zeile) nicht korrekt war. Habe es auch mit $stmt->execute(); versucht, jedoch mit gleichem Ergebnis.
                      Hat jemand einen Tipp für mich, wie ich hier weiterkomme?

                      Herzlichen Dank!

                      Kommentar


                      • #41
                        Lass den Schwachsinn mit $fields weg und gib einfach aus, was du im Query angefordert hast.

                        Kommentar


                        • #42
                          Aso ja, hab vergessen anzugeben: $fields = explode(', ', $selection); Also zeige ich eh automatisch die ausgelesenen Spalten an.

                          Aber für das Nicht-Anzeigen von leeren Spalten musste ich in mysqli die Ergebnisse mit $result = mysqli_query($db, $sql); vor dem Anzeigen der einzelnen Zeilen noch einmal abfragen.
                          Wie mache ich das nun in PDO?

                          Kommentar


                          • #43
                            Wie mache ich das nun in PDO?
                            Gar nicht. In deinem Result Set sind alle angeforderten Spalten drin, egal ob die nun eine Zahl, einen String, NULL oder einen Leerstring enthalten.

                            Kommentar


                            • #44
                              Naja, aber das war ja in mysqli auch der Fall, also da war ja in $result auch der gesamte Datensatz drin und ich musste es für diese spezielle Funktion vor dem Anzeigen der Zeilen noch einmal abfragen. Und in PDO klappt es ohne eine nochmalige Abfrage gar nicht, also dann werden nur die Überschriften angezeigt und mit $stmt = $pdo->query($sql); oder $stmt->execute(); bekomme dann auch die Zeilen, jedoch auch die Spalten, die komplett leer sind.

                              Kommentar


                              • #45
                                Was sind bei dir "komplett leere Spalten" ?

                                Kommentar

                                Lädt...
                                X