Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Abfrage

Einklappen

Neue Werbung 2019

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

  • MySQL Abfrage

    Hallo Leute, mein Code sollte eigentlich mit Hilfe einer While-Schleife einige Überschriften ausgeben. Leider passiert bei mir nicht. Vielleicht findet ja von euch einer einen Fehler im Code.

    Der Code für die MySQL Connection:
    PHP-Code:
    $mysql_host "***";
        
    $mysql_username "***";
        
    $mysql_password "***";
        
    $mysql_database "***";

        
    $pdo = new PDO("mysql:host=".$mysql_host.";dbname=".$mysql_database$mysql_username$mysql_password); 
    Der Code:
    PHP-Code:
    <?php
              $getCategory_STATEMENT 
    $pdo->prepare("SELECT * FROM productitem WHERE active = true");
              
    $getCategory_STATEMENT->execute();

              while(
    $rowPC $getCategory_STATEMENT->fetch()) {
                if(
    $rowPC['active'] == "true") {
                  
    ?>
                    <div class="ProductCategory">
                      <!-- ProductCategory -->
                      <h1 class="ProductCategoryH1"><u><?php echo $rowPC['name']; ?></u></h1>
                      <div class="row">
                        <?php
                          $getItemsInCategory 
    $pdo->prepare("SELECT * FROM productitem WHERE ProductCategoryID = :pid");
                          
    $getItemsInCategory->bindParam("pid"htmlspecialchars(trim($rowPC['id'])));
                          
    $getItemsInCategory->execute();

                          while(
    $rowPI $getItemsInCategory->fetch()) {
                            if(
    $rowPI['active'] == "true") {
                              
    ?>
                                <div class="col-sm">
                                  <div class="ProductItem bg-info">
                                    <img class="ProductItem_IMG" src="<?php echo $rowPI['small_icon']; ?>" alt="ProductImage">
                                    <div class="card-body">
                                      <h5 class="product-title"><b><?php echo $rowPI['name']; ?></b></h5>
                                      <p><?php echo $rowPI['short_description']; ?></p>
                                      <?php
                                        
    if($rowPI['forFree'] == "true") {
                                          echo 
    '<p style="margin-bottom: 0;"><a href="#" class="btn btn-warning"> <b>ansehen</b> </a> <span class="product-price_free">&ensp; <b>FREE &euro;</b>  &ensp;</span></p>';
                                        } else {
                                          echo 
    '<p style="margin-bottom: 0;"><a href="#" class="btn btn-warning"> <b>ansehen</b> </a> <span class="product-price">&ensp; <b>' $rowPI['price'] . ' &euro;</b>  &ensp;</span></p>';
                                        }
                                      
    ?>
                                    </div>
                                  </div>
                                </div>
                              <?php
                            
    }
                          }

                        
    ?>
                      </div> <!-- ROW END -->
                    </div> <!-- ProductCategory END -->
                  <?php

    Vielen dank schon mal für euer Hilfe.

  • #2
    mal von dem ganzen Durcheinander und schlechten Code abgesehen, was soll diese Zeile denn bewirken:
    PHP-Code:
    $getItemsInCategory->bindParam("pid"htmlspecialchars(trim($rowPC['id']))); 

    Kommentar


    • #3
      Zitat von protestix Beitrag anzeigen
      mal von dem ganzen Durcheinander und schlechten Code abgesehen, was soll diese Zeile denn bewirken:
      PHP-Code:
      $getItemsInCategory->bindParam("pid"htmlspecialchars(trim($rowPC['id']))); 
      Diese fügt an das Statement denn wert der Produkt Kategorie an.

      Was findest du denn am Code schlecht? Vielleicht kann ich etwas besser machen?

      Kommentar


      • #4
        Warum Trim?
        Und warum htmlspecialchars?
        Es ist doch eine id also eigentlich eine Ganzzahl und auch keine html Ausgabe.

        Kommentar


        • #5
          Zitat von WebInsel Beitrag anzeigen
          Was findest du denn am Code schlecht? Vielleicht kann ich etwas besser machen?
          1. Datenbankabfragen haben in der HTML-Ausgabe nichts verloren. Beachte das EVA-Prinzip.

          2. Verwende niemals SELECT *.

          3. Beachte den Kontextwechsel nach HTML. Werte, die in HTML-Code eingefügt werden, müssen mit htmlspecialchars() escaped werden. Dagegen hat htmlspecialchars() bei Datenbankabfragen überhaupt nichts verloren.

          4. Datenbankabfragen in Schleifen sind böse und kosten unnötig Performance. Mach eine Datenbankabfrage, die auf einmal alle Daten holt, die du benötigst.

          5. true (Boolean) ist was anderes als "true" (String). Du verwendest einmal das eine und einmal das andere, das ergibt keinen Sinn und wird wohl Fehler verursachen.

          6. Ein href="#" ist Quatsch. Erzeuge mit PHP keine Links, die gar nicht funktionieren. Wenn ein Link nur mit JavaScript funktioniert, erzeuge ihn mit JavaScript und nicht mit PHP. Dadurch wird gewährleistet, dass PHP keine kaputte Seite ausliefert, falls mal JavaScript am Client nicht aktiv ist.

          7. Du kannst statt &euro; auch einfach € schreiben. Es ist nicht nötig seinen Text zu verstümmeln.

          Kommentar


          • #6
            WebInsel

            Zitat von hellbringer Beitrag anzeigen
            7. Du kannst statt &euro; auch einfach € schreiben. Es ist nicht nötig seinen Text zu verstümmeln.
            8. Wenn du hoffenltich UTF-8 als Zeichensatz nutzt, sowohl beim Speichern des Scriptes, also auch im HTTP-Header bei der Auslieferung der Daten. Solltest du aber das veraltete Latin1 (ISO 8859-1) nutzen, dann musst du das machen, da das Euro-Zeichen erst ab 8859-15 enthalten ist.

            Daher: Nutze durchgängig UTF-8 (ohne BOM) und gut ist.

            MOD: Verschoben von PHP-Fortgeschritten
            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


            • #7
              hellbringer
              Zitat von hellbringer Beitrag anzeigen

              1. Datenbankabfragen haben in der HTML-Ausgabe nichts verloren. Beachte das EVA-Prinzip.

              2. Verwende niemals SELECT *

              3. Beachte den Kontextwechsel nach HTML. Werte, die in HTML-Code eingefügt werden, müssen mit htmlspecialchars() escaped werden.

              4. Datenbankabfragen in Schleifen sind böse und kosten unnötig Performance. Mach eine Datenbankabfrage, die auf einmal alle Daten holt, die du benötigst.
              zu 1. Das habe ich schon öfters gelsen, aber noch nie eine richtige Antwort erhalten wo es dann hin soll?

              zu 2. Wenn ich aber sowisos alle Werte benötige, wieso sollte man dann nicht SELECT * verwenden?

              zu 3. Ich dachte man nuss htmlsspecialchars() nur bei eingaben vom Benutzer verwenden und nicht bei der HTML Ausgabe.

              zu 4. Aber ich erstelle dich anhand des while die einzelnen divs mit der Ausgabe.

              Kommentar


              • #8
                1.) in seprateate Dateien
                2.) https://use-the-index-luke.com/blog/...he-star-stupid
                3.) bei Kontextwechsel
                4.)
                PHP-Code:
                 while($rowPC $getCategory_STATEMENT->fetch()) {
                   while(
                $rowPI $getItemsInCategory->fetch()) {}
                   } 
                wie häufig fragst Du da bei der Db insgesamt nach?

                Kommentar


                • #9
                  Zitat von WebInsel Beitrag anzeigen
                  . Ich dachte man nuss htmlsspecialchars() nur bei eingaben vom Benutzer verwenden
                  Dort ist es am aller falschesten. Wie oben schon erwähnt: Immer bei der "Ausgabe" (dem Kontextwechsel) zu HTML hin.
                  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


                  • #10
                    Zitat von tomBuilder Beitrag anzeigen
                    4.)
                    PHP-Code:
                     while($rowPC $getCategory_STATEMENT->fetch()) {
                    while(
                    $rowPI $getItemsInCategory->fetch()) {}

                    wie häufig fragst Du da bei der Db insgesamt nach?
                    Solange bis ich alle Werte(Kategorien und Produkte) habe.

                    Kommentar


                    • #11
                      Dafür gibt es doch JOINs.
                      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


                      • #12
                        Legen wir mal los.

                        PHP-Code:
                        $getCategory_STATEMENT $pdo->prepare("SELECT * FROM productitem WHERE active = true");
                        $getCategory_STATEMENT->execute(); 
                        Das ist kein prepared statement auch wenn du es so aussehen lassen willst.

                        Für eine normale Query ohne dynamische Parameter braucht es kein prepared statement, kostest nur unnötig Zeit.
                        Du fragst sowieso immer die gleiche Tabelle ab und einziges Kriterium ist, dass die Ausgabe nach active=true gefiltert wird.

                        Demnach ist diese Angabe dann wohl überflüssig,
                        PHP-Code:
                        if($rowPC['active'] == "true") { 
                        Du kannst also eine Abfrage nehmen, diese als normales Query in PDO ausführen und mit fetch_all dir alle Kategorien und Produkte auf einmal ausgeben lassen.
                        Eventuell brauchst du noch ein ORDER BY ProductCategoryID

                        Das Ganze ohne SELECT *, sondern mit Aufführung aller Spalten ergibt dir dann ein mehrdimensionales Array.

                        Bis hier hast du schon mindestens ein 30faches an Zeit eingespart, du bist also vom Fahrad auf ein Formel1 Auto umgestiegen.

                        Die Ausgabe kannst du dir nun vorab zusammen bauen und zwar ohne diese vielen DIVs und mit richtiger Zuordnung der H-Elemente. Das wird in der Wissenssammlung sehr gut erklärt unter https://php-de.github.io/jumpto/gruppenbruch/.

                        Du solltest auch dein HTML validieren lassen. Google mal nach Validator W3c.

                        Wenn du das alles umgesetzt hast kannst du uns denen Code ja mal zeigen.

                        Kommentar

                        Lädt...
                        X