OOP Fehler -> PDOStatement::execute(): SQLSTATE[HY093]:

  • Hallo
    Kann mir jemand sagen was ist hier nicht gut, was muss ich ändern...und was bedeutet dieser Fehler? ??


    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /Users/xxxxxxxx/Desktop/mamp-SERVER/website_sd/mysql.php on line 82
    Erfolgreich hinzufügt



    Hier einen teil vom Code:


    Line 82 wäre hier unter => line 19 (if bedienung)







    Formularscript


    Danke :wacko:

  • Hmm, was mir hier auf den ersten Blick auffällt:
    Eigentlicher Code

    PHP: 12
    function createNewNews($autor,$titel,$datum,$news)


    Formularscript

    PHP: 11
    $db->createNewNews($autor, $datum, $titel, $news)


    Merkste was?
    Umdrehen, gucken obs hilft, nochml melden ;)


    Und noch was anderes: das Validieren bei prepare, bindParam und sowas funktioniert nur mit den Platzhaltern, nicht mit Variablen, du kannst also im eigentlichen Code (erster Block) folgendes machen:

    PHP: 5
    // Das hier
    $stmt = self::$_db->prepare("SELECT * FROM eintraege ORDER BY eintrag_id " . $sort);
    $stmt->execute();
    
    
    
    
    // Gegen das tauschen
    $stmt = $_db->query("SELECT * FROM eintraege ORDER BY eintrag_id " . $sort);
  • Der (fatale :D) Fehler den Scout gepostet hat
    plus:


    die SQL-Abfrage sollte so aus sehen:

    SQL
    INSERT INTO `eintraege` 
    (`autor`,`titel`,`datum`,`news`) -- du hattest das hier vergessen =)
    VALUES(:autor, :titel, :datum, :news); -- hier habe ich '', weggelassen. es ist unnötig einer auto_increment id einen leeren string mitzugeben


    bei ->bindParam gibts nen Tippfehler bei "news"
    (daher der Fehler, den Du bekommen hast. Denn so ging PHP von 5 Parametern aus: :autor, :datum, :titel, :news und :news: )

    PHP
    $stmt->bindParam(":autor", $autor);
    $stmt->bindParam(":datum", $datum);
    $stmt->bindParam(":titel", $titel);
    // $stmt->bindParam(":news:",  $news); doppelpunkt fehler ":news:"
    $stmt->bindParam(":news",  $news); // richtig


    meine Empfehlung: (ohne bindParam())



    @Scout
    das macht nix.
    Man kann eine Query durch ->prepare jagen, ohne darin einen einzigen Platzhalter zu verwenden. Es ist also nicht falsch.


    btw: ASC und DESC, wie auchTabellennamen ect, kann man nicht mit Platzhaltern einsetzen.
    Und genau das, was iphone hier gemacht hat ist der korrekte weg. (Will das nur noch mal erwähnen, da ich es für wichtig halte)

    PHP
    if ($sort != "ASC" && $sort != "DESC") {
            return -1;
        }


    $sort kann also nur ASC oder DESC enthalten und es ist keine SQL-Injection durch diese angehängte Variable möglich. :thumbup:

  • Hmm, das hat wohl die temporäre Analphabetie bei mir zugeschlagen :)


    Und was den Befehl mit ASC / Desc angeht: Mir ist klar, dass das mit Platzhaltern nicht funktioniert, aber wenn man keine Platzhalter nutzt und den Befehl nicht wiederverwenden will, warum dann erst preparen und nicht gleich in die DB jagen?


    Deswegen habe ich das vorgeschlagen, das preparen ist in dem Fall unnötig, nicht falsch :)

  • Ich meinte ja nicht, dass es falsch wäre. Hätte mich da besser ausdrücken können =)


    Wegen prepare()
    prepare ist nicht dazu gedacht eine Query mehrfach wieder verwenden zu können. Man muss sie also nicht ~zwischenspeichern o.ä.
    Man kann die einmal angeschickte Query zwar mit anderen Werten wieder verwenden, ohne diese nochmal zu ->prepare´n,
    aber Geschwindigkeit bringt das nicht. (getestet mit tausenden ->prepare() und das Ergebnis lag bei mircosecs)
    Es geht dabei eher um die Vorbereitung der Query (Platzhalter ect).


    Ich bevorzuge auch immer prepare zu verwenden.
    Denn sobald man was im Code (der Query) ändert, KÖNNTE man übersehen, dass man query() anstatt prepare() verwendet hat.
    Man würde zwar in dem Fall einen Error um die Ohren bekommen, weil der SQL-Server mit evtl neu hinzugefügten und unersetzten Platzhalten nicht klarkommt,
    aber ich gehe dabei immer vom (meinem) Prinzip aus: alles was schief gehen könnte gleich ~abfangen

Jetzt mitmachen!

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