php concat & sicherheit

  • Tag liebe Com,

    kurze Frage, ich wollte in meiner Such-Funktion den Operator "Like" einfügen, & hab bisschen nachgeschaut wie es mit PDO funktioniert.

    Jetzt mal ne Blöde Frage, auch wenn ich es mit PDO mache, gibt es bei dem Code ne Lücke wegen dem % oder so?

    Spoiler anzeigen
    Code
    $sql = "SELECT * FROM user WHERE username like concat('%', :name_like, '%') AND accept_find = 1 AND id != :id ";
  • Passieren kann da nichts.

    Das Verketten erledigt der mysql server über CONTCAT,

    und du setzt die Value für :name_like ja per Platzhalter in die Query.

    Aber:

    Bei LIKE würde ich Dir das hier empfehlen:

    PHP
    $sql = "SELECT * FROM `user` WHERE `username` LIKE :name_like AND `accept_find` = 1 AND `id` != :id;";
    $params = ['name_like' => "%{$yourValueHere}%"];

    LIKE :placeholder

    Dadurch bleibt Dir die Möglichkeit offen, die Platzhalter % und _ über die Parameter zu steuern.

    Beispiele:

    PHP
    $params = ['name_like' => "%{$yourValueHere}%"]; // f.e. %foo%
    $params = ['name_like' => "{$yourValueHere}%"]; // f.e. foo%
    $params = ['name_like' => "%{$yourValueHere}"]; // f.e. %foo
    $params = ['name_like' => "_{$yourValueHere}"]; // f.e. _foo
    // ...

    INFO

    `` bei Feldnamen und Tables nutzen.

    Und Query immer mit ; abschließen.

    Das erschwehrt SQL-injections (man weiß ja nie),

    Fehler wie zB WHERE order = ... (order ist reserviert für order by. Passier nicht mit `order`)

    und sieht besser aus :p

    Und, auch wenn hier nicht relevant, UPDATE und DELETE Queries mit LIMIT 1; abschließen, wenn nur eine Zeile betroffen sein soll.

    SQL
    UPDATE `user` SET `name` = :name; -- OH NOOOO, WHERE bedingung vergessen und alle user sind im arsch :(
    -- damit wäre nur 1 user betroffen:
    UPDATE `user` SET `name` = :name LIMIT 1;
  • cottton

    Danke für die Mühe & Tipps :) Werde es mal gleich direkt anwenden^^

    Edit:

    Bekomme diesen Fehler:

    Zitat

    Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in/users/liscon/www/world_test.php on line 153

    Array ( [0] => HY093 [1] => [2] => )

    Spoiler anzeigen

    2 Mal editiert, zuletzt von selection (28. Februar 2018 um 11:15)

  • Hab ich leider merke ich den Fehler nicht . Ich weiß was diese Fehlermeldung bedeutet aber habe es noch nie so gemacht wie Cotton es gezeigt hat.

Jetzt mitmachen!

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