L'escape è efficace nella difesa dell'iniezione SQL quanto l'utilizzo dei parametri di query.
Entrambi i metodi sono anche meno efficaci se non li esegui in modo coerente.
Entrambi i metodi sono utili solo per proteggere i valori individuali nelle espressioni SQL. Non supportano altre parti dinamiche della query. Ad esempio, se si desidera ORDINARE PER una colonna specificata dall'utente. Né i parametri di query né le funzioni di escape lo gestiscono.
Quindi, fondamentalmente, è una questione di stile e preferenze personali.
Preferisco i parametri di query perché penso questo:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);
È più chiaro di così:
$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);
Non puoi seriamente dire che giocherellare con tutte quelle virgolette aperte/chiuse e .
la concatenazione di stringhe è più semplice rispetto all'utilizzo di prepare() con i parametri di query.
Riguardo ai tuoi commenti su un'ipotetica query()
funzione con parametri.
Innanzitutto non è necessario. Usare prepare() ed execute() insieme è un piccolo prezzo da pagare per scrivere codice sicuro, e insistendo nel farlo con una singola funzione, sembri pigro. Suppongo che tu non controlli il valore di ritorno delle funzioni che restituiscono false
anche per errore?
Per quel che vale, sarebbe facile scrivere una funzione wrapper per fare entrambe le cose, perché PHP supporta implicitamente varags.
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.
}