DB PDO Wert aus Datenbank mit variable vergleichen

  • Das "Problem" ist die config, die Du beim Verbinden mit gibst.

    PHP
    PDO::ATTR_EMULATE_PREPARES => false


    Info dazu zB hier: https://www.php-einfach.de/201…pdoattr_emulate_prepares/


    Durch diese Einstellung überlässt Du dem DB-Server das parsen der Platzhalter.
    Und der kommt mit mehreren gleichen nicht klar (will nicht, kann nicht , oder soll evtl auch nicht).


    PDO::ATTR_EMULATE_PREPARES In kurz:
    Wenn false, dann wird die Query nicht von PHP ge-parsed, sondern Query und Values an den DB-Server gesandt.
    Der kümmert sich dann um die Query/Platzhalter/Values.
    Wenn true, dann übernimmt PHP (PDO) das parsen (emuliert). Der DB-Server bekommt dann die "fertige" Query, ohne Platzhalter.


    Zur Sicherheit: in der Theorie sollte man meinen, dass ein Extra Layer (Schicht), der die Query behandelt, "extra" anfällig wäre.
    Da sich aber immer nur einer um die Platzhalter kümmert (entweder PHP order DB-Server), stellt sich eher die Frage
    "Wer ist vertrauenswürdiger?".
    Behandelt also PHP oder der DB-Server die Platzhalter besser.
    Da könnte man sich streiten.
    Man könnte meinen, wenn man immer PHP emulieren lässt, dann bekommt man auch immer das gleich sichere Ergebnis,
    egal welcher DB-Server gerade genutzt wird.
    (Das könnte man per Pro und Contra noch weiter ausführen. Dabei kommen aber noch Versionen ect dazu und das Thema endet nie)


    Empfehlen würde ich Default - also true (gar nicht erst in der config mitgeben). Aber das ist meine persönliche Meinung.


    BTW: PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION würde ich empfehlen. Fehler sind übersichtlicher, beinhalten mehr Informationen und können einfacher abgefangen werden.
    Es sieht zwar umständlich aus, immer einen try/catch -Block um alle Statements (prepare, execute) zu setzen,
    aber man spart sich das unterschiedliche Abfangen bei PDO::prepare und PDOStatement::execute.
    (Wobei bei ::prepare selten ein Fehler auftreten sollte. Das passiert dann eher bei ::execute)
    Und man bekommt per $e->getMessage() die schon fertige, lesbare Meldung. Per ::errorInfo muss man sich die Message selbst zusammen schneidern.


    So, war wieder viel, hab aber selbst noch was dabei gelernt :)

Jetzt mitmachen!

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