Ескейпирането е също толкова ефективно при защита от SQL инжекция, колкото и използването на параметри на заявка.
И двата метода също са по-малко ефективни, ако не ги правите последователно.
И двата метода са полезни само за защита на индивидуални стойности в SQL изрази. Те не поддържат други динамични части на заявката. Например, ако искате да ПОРЪЧИТЕ ПО посочена от потребителя колона. Нито параметрите на заявката, нито функциите за екраниране се справят с това.
Така че по принцип това е въпрос на стил и лични предпочитания.
Предпочитам параметри на заявката, защото мисля така:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);
По-ясно е от това:
$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);
Не може сериозно да го кажете, че се занимавате с всички тези отворени/затварящи кавички и .
конкатенацията на низове е по-лесна от използването на подготовка() с параметри на заявката.
Повторете вашите коментари за хипотетичен query()
функция с параметри.
На първо място, не е необходимо. Използването на подготовка() и execute() заедно е малка цена за писане на защитен код и като настоявате да го правите с една функция, просто звучите мързеливи. Предполагам, че не проверявате върнатата стойност на функции, които връщат false
при грешка?
За каквото си струва, би било лесно да се напише функция за обвиване, която да прави и двете, защото PHP поддържа неявно 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.
}