Auswahlfeld zeigt keine Datensätze an mit PDO umgesetzt

kisumi

Grünschnabel
Hallo,
ich bin ganz neu hier und lerne gerade PHP PDO mit prepared Statements. Dabei hänge ich gerade an einer Aufgabe, bei der die Ausgabe eines Auswahlfeldes mit abgefragten Datensätzen und die entsprechende Funktion zum Löschen über einen Button möglich sein soll. Die Umsetzung erfolgt über mehrere Dateien (beim lernen so erfolgt in Beispielaufgaben). Bei der Erstellung zur Ausgabe der Datensätze habe ich anscheinend irgendwo einen Denkfehler und komme seit einiger Zeit nicht darauf. Deshalb möchte ich die Profis hier bitten mir einen kleine Hilfestellung sprich Denkanstoss zu geben. Leider hat mir das nachlesen im Internet bzw. Foren usw. bisher nicht geholfen. Vermutlich ist es ein bescheuerter Anfängerfehler, deshalb vielen Dank vorab für eure Hilfe.

Anbei entsprechende Dateien:
Ausgabedatei - für Aufruf in Browser
Browseransicht - Laufzeitansicht momentan - sollte Feld mit Datensätzen und Button anzeigen, die Datensätze werden nicht angezeigt
Datenbankzugriff - prepared statement dafür - scheint korrekt zu sein
prepared_stmt_baueArtikelAusgabe - hier muss irgendwo der Fehler stecken + weiteres statement für Löschen
prepared_stmt_leseAlleDaten - scheint auch korrekt zu sein.

Die Funktion zum Löschen ist bei der Frage hier noch außen vor, mir geht es um die Ansicht der Datensätze.
 

Anhänge

  • ausgabedatei.png
    ausgabedatei.png
    103,3 KB · Aufrufe: 8
  • browseransicht.png
    browseransicht.png
    21,3 KB · Aufrufe: 7
  • datenbankzugriff.png
    datenbankzugriff.png
    53,4 KB · Aufrufe: 7
  • prepared_stmt_baueArtikelAuswahlualoeschen.png
    prepared_stmt_baueArtikelAuswahlualoeschen.png
    222,4 KB · Aufrufe: 7
  • prepared_stmt_leseAlleDaten.png
    prepared_stmt_leseAlleDaten.png
    80,4 KB · Aufrufe: 7
Zuletzt bearbeitet:

basti1012

Erfahrenes Mitglied
Könntest du mal den Code posten.
In deinen fall würde ich den Code einfach mal testen, dann könnte wir den Fehler schneller finden .
Auch wenn deine Bilder gut geworden sind, lassen die sich nicht einfach debuggen.
Bitte poste einen Code den man testen kann.

Das sieht ja so aus als deine while Schleife keinen Inhalt hat.
Hast du mal geschaut, ob überhaupt irgendwas aus der DB kommt , ich meine ob deine SELECT Abfage überhaupt einen Treffer hat ?
 
Zuletzt bearbeitet:

kisumi

Grünschnabel
Könntest du mal den Code posten.
In deinen fall würde ich den Code einfach mal testen, dann könnte wir den Fehler schneller finden .
Auch wenn deine Bilder gut geworden sind, lassen die sich nicht einfach debuggen.
Bitte poste einen Code den man testen kann.

Das sieht ja so aus als deine while Schleife keinen Inhalt hat.
Hast du mal geschaut, ob überhaupt irgendwas aus der DB kommt , ich meine ob deine SELECT Abfage überhaupt einen Treffer hat ?
Das hier ist die Verbindung zur Datenbank aus einer eigenen Datei:

PHP:
<?php

try {

    $pdo = new PDO ( 'mysql:dbname=bestelldatenbank;host=localhost;charset=utf8', 'root', '' );

} catch ( PDOException $e ) {

    die ( $e->getMessage () );

}

?>

Das ist die Ausgabedatei:

HTML:
<!DOCTYPE HTML>

<html lang="de">

<head>

    <meta charset="utf-8" />

    <title>Artikel löschen</title>

<?php

    require_once("artikel.class.php");

?>

</head>

<body>

<div class="ausgabe">

<?php

    $artikel = new artikel();

    $artikel->lesenAlleDaten();

?>

</div>

</body>

</html>

Und hier noch die Datei mit der Abfrage und den prepared Statements

PHP:
<?php

class artikel {



private $tabelle = "artikel";

public $anr = "anr";

public $name = "name";

    

public function lesenAlleDaten() {

    $sql = "SELECT " . $this->anr . "," . $this->name .

             "FROM " . $this->tabelle . "

             ORDER BY" . $this->anr;

    $this->baueArtikelAuswahl($sql);

}   



public function lesenDatensatz($id) {

        require ("db.inc.php");

        if ($stmt = $pdo->prepare ( "SELECT" . $this->anr . "," . $this->name . "FROM artikel" )) {

            $stmt->bindParam ( ':anr', $id );

            $stmt->execute ();

            return ($stmt->fetch(PDO::FETCH_ASSOC));

        }

        else {

            return false;

        }

    }

    

public function aloeschen($id) {

     require("db.inc.php");

     $sql = "DELETE FROM "

             .$this->tabelle

             ." WHERE anr = :anr";

     if ($stmt = $pdo -> prepare($sql)) {

        $stmt->bindParam(':anr', $id);

        $stmt -> execute();

      }

}



private function baueArtikelAuswahl($sql) {

    require_once("db.inc.php");

    if ($stmt = $pdo -> prepare($sql)) {

        $stmt -> execute();

            echo "<form action='' method='post'>\n\t

            <label for='artikel'>Artikel: </label>\n\t";

            

            $stmt->bindParam ( ':name', $n );

            echo "<select name=' . $n . ' size='20'>\n\t";



            while ($id = $stmt -> fetch(PDO::FETCH_OBJ)) {

                echo "<option value=' . $id . '>";

                echo $id ." | " . $n ."<br></option>\n\t";

            }

            echo "</select><input type='submit' name='aloeschen' value='Artikel löschen'/>\n\t

            </form>\n\t";

        }

    }

}



?>

Erst mal vielen Dank für den Hinweis ich dachte die Bilder würden ausreichen.

Ja, ich habe die Abfrage schon extra getestet und da hat das funktioniert. Ich denke der Fehler liegt tatsächlich bei dem Statement mit der Bezeichnung baueArtikelAuswahl.
 
Zuletzt bearbeitet von einem Moderator:

Sempervivum

Erfahrenes Mitglied
Beim Posten von Code besser Codetags verwenden: Das Menüsymbol (drei Punke) rechts von dem Landschaftssymbol und dann </>.

Auch ohne den Code zu testen, sehe ich schon einen Fehler, und zwar, wie Du vermutest, in der Funktion baueArtikelAuswahl:
Die richtige Reihenfolge lautet: prepare - bindParam - execute - fetch
Wobei man die Parameter auch direkt beim Execute binden kann, indem man ein Array übergibt.
In der Funktion aloeschen ist die Reihenfolge richtig.
 

basti1012

Erfahrenes Mitglied
Hier sollten auch leerzeichen zwischen stehen
Code:
$sql = "SELECT " . $this->anr . "," . $this->name ."FROM " . $this->tabelle . "ORDER BY" . $this->anr;
Das Ergebnis sieht dann so aus
Code:
SELECT anr,nameFROM artikel ORDER BYanr
Ich glaube nicht das SQL die Leerzeichen selbe einsetzt.Oder liege ich da falsch ?
 

basti1012

Erfahrenes Mitglied
Ich arbeite immer mit mysqli und habe mit dieser Variante kaum Erfahrung.
Deswegen mache ich auf meinen Gedanken eine Frage.
Du möchtest doch in den <select> Feld alle Dateien angezeigt bekommen, oder ?
Wenn ja finde ich deine Schleife noch nachvollziehbar.
Aber was soll hier bei der Variable N rauskommen?
PHP:
$stmt->bindParam ( ':name', $n );
echo "<select name=' . $n . ' size='20'>\n\t";

Wenn deine SELECT DB Abfrage 10 Treffer hat, welche Name landet den dann in Variable $n ?

Da brauche ich mal Nachhilfe.
Wenn dann verstehe ich das nicht , oder du hast da was falsch gemacht.

Ansonsten hätte ich es so gemacht .
Da frage ich auch mal ob das richtig ist ?


PHP:
    public function lesenAlleDaten() {
        $sql = "SELECT id," . $this->anr . "," . $this->name ." FROM " . $this->tabelle . " ORDER BY " . $this->anr;
        require_once("db.inc.php");
        if ($stmt = $pdo -> prepare($sql)) {

            //$stmt->bindParam ( ':name', $n );
            $stmt -> execute();
            echo "<form action='' method='post'>
                  <label for='artikel'>Artikel: </label>
                  <select name='kill' size='20'>";
            while ($row = $stmt->fetch()) {
                echo "<option value='".$row['id']."'>".$row['id'] ." | " . $row['name'] ."</option>\n\t";
            }
            echo "</select>
                <input type='submit' name='aloeschen' value='Artikel löschen'>
                </form>";
        }
    }
 
Zuletzt bearbeitet:

kisumi

Grünschnabel
Hier sollten auch leerzeichen zwischen stehen
Code:
$sql = "SELECT " . $this->anr . "," . $this->name ."FROM " . $this->tabelle . "ORDER BY" . $this->anr;
Das Ergebnis sieht dann so aus
Code:
SELECT anr,nameFROM artikel ORDER BYanr
Ich glaube nicht das SQL die Leerzeichen selbe einsetzt.Oder liege ich da falsch ?
Das stimmt und ich habe es schon korrigiert. danke
 

kisumi

Grünschnabel
Beim Posten von Code besser Codetags verwenden: Das Menüsymbol (drei Punke) rechts von dem Landschaftssymbol und dann </>.

Auch ohne den Code zu testen, sehe ich schon einen Fehler, und zwar, wie Du vermutest, in der Funktion baueArtikelAuswahl:
Die richtige Reihenfolge lautet: prepare - bindParam - execute - fetch
Wobei man die Parameter auch direkt beim Execute binden kann, indem man ein Array übergibt.
In der Funktion aloeschen ist die Reihenfolge richtig.
danke, habe ich jetzt berücksichtigt.
 

kisumi

Grünschnabel
Ich arbeite immer mit mysqli und habe mit dieser Variante kaum Erfahrung.
Deswegen mache ich auf meinen Gedanken eine Frage.
Du möchtest doch in den <select> Feld alle Dateien angezeigt bekommen, oder ?
Wenn ja finde ich deine Schleife noch nachvollziehbar.
Aber was soll hier bei der Variable N rauskommen?
PHP:
$stmt->bindParam ( ':name', $n );
echo "<select name=' . $n . ' size='20'>\n\t";

Wenn deine SELECT DB Abfrage 10 Treffer hat, welche Name landet den dann in Variable $n ?

Da brauche ich mal Nachhilfe.
Wenn dann verstehe ich das nicht , oder du hast da was falsch gemacht.

Ansonsten hätte ich es so gemacht .
Da frage ich auch mal ob das richtig ist ?


PHP:
    public function lesenAlleDaten() {
        $sql = "SELECT id," . $this->anr . "," . $this->name ." FROM " . $this->tabelle . " ORDER BY " . $this->anr;
        require_once("db.inc.php");
        if ($stmt = $pdo -> prepare($sql)) {

            //$stmt->bindParam ( ':name', $n );
            $stmt -> execute();
            echo "<form action='' method='post'>
                  <label for='artikel'>Artikel: </label>
                  <select name='kill' size='20'>";
            while ($row = $stmt->fetch()) {
                echo "<option value='".$row['id']."'>".$row['id'] ." | " . $row['name'] ."</option>\n\t";
            }
            echo "</select>
                <input type='submit' name='aloeschen' value='Artikel löschen'>
                </form>";
        }
    }
Es stimmt, die Datensätze sollten zwischen einem <select> innerhalb <option> angezeigt werden. Dabei wollte ich mit $n noch vor der Schleife eine entsprechende Bezeichnung angeben, was wie ich jetzt sehe keinen Sinn ergibt und unnötig ist. War tatsächlich ein Fehler meinerseits. Ich muss zugeben, dass ich mich so viel damit beschäftigt habe, dass ich den Wald vor lauter Bäumen nicht mehr sehe.

Den Vorschlag für lesenAlleDaten habe ich ausprobiert und leider scheint es nicht zu funktionieren. Die Ansicht bleibt weiterhin ohne Datensätze, genau wie bei mir zuvor. Ich bin ja keine Profi, kann aber rein Formal auch nichts falsches bei dem Vorschlag sehen.
 

kisumi

Grünschnabel
Auf jeden Fall vielen Dank für eure Mühe und schnellen Antworten. Nachdem ich jetzt alle Antworten und Hinweise beachtet und umgesetzt habe, hat die Anzeige endlich richtig funktioniert. Vielen Dank.
Letztendlich lag es tatsächlich an einem Anfängerfehler, und zwar die fehlenden Leerzeichen bei der SELECT Abfrage. Ich dachte die ganze Zeit, es läge an dem Statement baueArtikelAuswahl, aber die Leerzeichen hatte ich übersehen.

Vielen Dank an alle