Escapování je při obraně SQL injection stejně efektivní jako použití parametrů dotazu.
Obě metody jsou také méně účinné, pokud je nebudete dělat důsledně.
Obě metody jsou užitečné pouze pro ochranu jednotlivých hodnot ve výrazech SQL. Nepodporují jiné dynamické části dotazu. Například pokud chcete ORDER BY uživatelem zadaného sloupce. To nezvládají ani parametry dotazu, ani escapovací funkce.
V zásadě je to tedy otázka stylu a osobních preferencí.
Preferuji parametry dotazu, protože si myslím toto:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);
Je to jasnější než toto:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);
To nemůžete myslet vážně, že si hrajete se všemi těmi otevřenými/zavřenými uvozovkami a .
zřetězení řetězců je jednodušší než použití Prepare() s parametry dotazu.
Znovu vaše komentáře k hypotetickému query()
funkce s parametry.
Za prvé to není nutné. Současné použití Prepare() a execute() je malá cena za psaní zabezpečeného kódu, a když trváte na tom, že to budete dělat s jedinou funkcí, zníte jen líně. Předpokládám, že nekontrolujete návratovou hodnotu funkcí, které vracejí false
buď v chybě?
Za to, co stojí za to, by bylo snadné napsat funkci wrapper, která by dělala obojí, protože PHP implicitně podporuje varargs.
function myquery() {
global $pdo;
$params = func_get_args();
$sql = array_shift($params);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt; // so we can fetch(), etc.
}