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?


  • 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
    1. $sql = "SELECT * FROM `user` WHERE `username` LIKE :name_like AND `accept_find` = 1 AND `id` != :id;";
    2. $params = ['name_like' => "%{$yourValueHere}%"];

    LIKE :placeholder

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


    Beispiele:

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


    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
    1. UPDATE `user` SET `name` = :name; -- OH NOOOO, WHERE bedingung vergessen und alle user sind im arsch :(
    2. -- damit wäre nur 1 user betroffen:
    3. 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] => )