DB-Abfrage mit array-Werten will nicht klappen

  • Bei diesem Skript komme ich einfach nicht weiter!

    Als erstes wird die Datenbank nach 10 zutreffenden ids befragt.
    Dieses Ergebnis wird in das PHP array $zehnids gesteckt.

    Das Problem:
    Im Zweiten Schritt wird dieselbe Tabelle nach weiteren Spalten unter Benutzung der $zehnids-Werte abgefragt.

    Doch die Zweite Abfrage bringt die Fehlermeldung:

    Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous in G:


    Wo ist der Fehler? Oder lässt sich die ganze Abfrage-Technik besser machen?


    Der Grund, warum ich dieses Konstrukt verwende, ist:
    die spalte8 wird am Ende des Skripts (schritt3) hochgezählt, also geändert - wodurch bei der nächsten Abfrage andere
    ids als result gezogen werden. Darum ist es wichtig, immer mit den gleichen ids zu fragen.

    der Problem-Code:

    <html>
    <head>
    <?php
    echo ("<script type=\"text/JavaScript\">");
    $pdo = new PDO('mysql:host=localhost;dbname=db1', 'ichselbst', 'abc');
    // schritt 1: Javascript-array und php-array $zehnids füllen
    $stmt = $pdo->prepare("SELECT `id`, `ar`, `ra` FROM tabelle1 WHERE `kategorie`= ? ORDER BY `gez` ASC LIMIT 10");
    $stmt->execute(array('meinekategorie'));
    $zehnids = array();
    $gespkt = 0;
    while($row = $stmt->fetch())
    {
    $zehnids[] = $row['id']; // 10 zutreffende ids in PHP-array $zehnids speichern
    echo ("ans[" . $row["id"] . "] = \"" . $row["ar"] . "\"; ");
    echo ("pu[" . $row["id"] . "] = " . $row["ra"] . "; ");
    $gespkt = ($gespkt + $row["ra"]); // mögliche Gesamtpunktzahl erzählen
    }
    echo ("</script>\n");
    ?>
    </head>
    <body>

    <?php
    // schritt 2: weitere spalten mit den selben $zehnids holen
    foreach ($zehnids as $einzid)
    {
    echo ("<hr>");
    $stmt = $pdo->prepare("SELECT tabelle1.id, tabelle1.frage, ... , tabelle1.gez, tabelle2.look FROM tabelle1, tabelle2 WHERE (tabelle1.autor = tabelle2.user AND `id`= ?) LIMIT 10");
    stmt->execute(array('$einzid')); // Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous in G:\xampp:57 Stack trace: #0

    while($row = $stmt->fetch())
    {
    echo ("\n<div class=\"sowas\">\n");
    echo("..." . $row["frage"]);
    echo("...</div>");
    //schritt 3: die frage als gezogen vermerken = gezogen hochzählen
    $statement = $pdo->prepare("UPDATE tabelle1 SET gez = ? WHERE id = ?");
    $statement->execute(array($row["gez"]++, $row));
    }

    }
    ?>

  • Du prüfst in der where-Klausel eine ID ab. Weil es diese in beiden Tabellen gibt ist das mehrdeutig. Du musst, ebenso wie bei den anderen Spaltennamen, den Tabellennamen davor stellen.

  • Wenn ich

    WHERE (tabelle1.autor = tabelle2.user AND `tabelle1.id`= ?) schreibe, kommt ein ähnlicher Fehler:

    // Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tabelle1.id' in 'where clause' in G:\xampp\

  • WHERE (tabelle1.autor = tabelle2.user AND `tabelle1.id`= ?) schreibe, kommt ein ähnlicher Fehler:

    // Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tabelle1.id' in 'where clause' in G:\xampp\

    Lass die Backticks weg, die sind meistens überflüssig - und wenn du sie verwendest, dann darfst du sie nur um Tabellen- und Spaltennamen setzen, aber nicht um beides zusammen.

    Deine ganze Konstruktion ist aber ohnehin nur mäßig sinnvoll: Datenbankabfragen sollten nie in Schleifen gemacht werden. Wie die Tabellen aussehen und welche Daten du genau brauchst geht aus deinem Posting nicht so ganz hervor, aber vom Prinzip her kannst du die Daten die du mit de zweiten Abfrage holst nach diesem Prinzip mit einer Abfrage holen:
    SELECT spalten FROM tabelle WHERE id IN (SELECT id FROM tabelle WHERE <BedingungZumHolenDerIds>)
    So bekommst du alle Daten ohne mehrere Abfragen ausführen zu müssen - das gleiche Prinzip funktioniert auch für UPDATE-Querys.

    Außerdem: den Javascript-Code solltest du nicht von Hand zusammenbauen (zumal bei dir die Behandlung des Kontextwechsels fehlt!), besser wäre es alle Daten als PHP-Array zu sammeln und dann per json_encode() einen JSON-String daraus zu machen welcher dann in den HTML-Code geschrieben wird. In Javascript hilft dann ein JSON.parse() um mit Javascript auf die Daten zuzugreifen - Zeichen die dir den JS-Code kaputt machen würden, werden dabei gleich entschärft und stellen kein Problem mehr dar.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!