PHP: защита от инъекций с использованием подготовленных операторов

Я знаком с использованием PHP для выполнения запросов mySQL. Тем не менее, я использую reg exps как защиту от инъекций. После прочтения нескольких вопросов / ответов здесь, на SO, я решил выбрать готовые заявления.

Доступны два варианта (дайте мне знать, если их больше):

  1. mysqli подготовил заявления
  2. PDO подготовил штаны

Вопрос 1

Я пытаюсь понять примеры кода, приведенные на связанных страницах.

Для mysqli , пример # 1:

if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { $stmt->bind_param("s", $city); 

Что делает параметр "s" ?
Если мне нужно больше одного параметра, как мне это сделать?

Для PDO , пример # 1:

 $sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 

В чем цель PDO::ATTR_CURSOR и PDO::CURSOR_FWDONLY здесь?

вопрос 2

Какой из них, mysqli или PDO, вы бы порекомендовали? За и против?

Вопрос 1

Параметр s связывает «:» с любым значением $ city. Поэтому, если ваш sql « SELECT District FROM City WHERE Name = s », ваш выполненный запрос будет « SELECT District FROM City Where Name = $city ».

Чтобы связать больше параметров, просто вызовите bindParam для каждого параметра. Вы также можете передать массив в PDOStatement :: execute.

вопрос 2

Поскольку я использую несколько разных баз данных (mysql и sqllite), я предпочитаю работать с PDO. За дополнительной информацией по этому вопросу обратитесь к mysqli или PDO – каковы плюсы и минусы? ,

s указывает, что $city ожидается строка

Часть PDO::ATTR_CURSOR – это имя параметра, которое вы передаете в PDO. Значение PDO::CURSOR_FWDONLY (которое по умолчанию, поэтому вам не нужно указывать, если) означает, что для каждого вызова, который вы выполняете для PDOStatement::fetch() вам будет предоставлена ​​следующая строка в результирующем наборе. Альтернативным вариантом будет PDO::CURSOR_SCROLL – но если вы специально не знаете, что вам это нужно (и ваша база данных поддерживает его), вы должны оставить его по умолчанию.