Escape är lika effektivt vid SQL-injektionsförsvar som att använda frågeparametrar.
Båda metoderna är också mindre effektiva om du misslyckas med att göra dem konsekvent.
Båda metoderna är endast användbara för att skydda enskilda värden i SQL-uttryck. De stöder inte andra dynamiska delar av frågan. Till exempel om du vill BESTÄLLA EFTER en användarspecificerad kolumn. Varken frågeparametrar eller escape-funktioner hanterar det.
Så i grund och botten är det en fråga om stil och personliga preferenser.
Jag föredrar frågeparametrar eftersom jag tycker detta:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);
Är tydligare än så här:
$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);
Du kan inte på allvar påstå att pyssel med alla dessa öppna citat/stäng-citat och .
strängsammansättning är enklare än att använda prepare() med frågeparametrar.
Om dina kommentarer om en hypotetisk query()
funktion med parametrar.
Först och främst är det inte nödvändigt. Att använda prepare() och execute() tillsammans är ett litet pris att betala för att skriva säker kod, och genom att insistera på att göra det med en enda funktion låter du bara lat. Jag antar att du inte kontrollerar returvärdet för funktioner som returnerar false
på fel, antingen?
För vad det är värt skulle det vara lätt att skriva en omslagsfunktion för att göra båda, eftersom PHP stöder varargs implicit.
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.
}