PHP и mySQLi: мне все еще нужно проверять пользовательский ввод при использовании операторов подготовки? - PullRequest
3 голосов
/ 05 января 2012

Если я использую операторы prepare в mySQLi, мне все равно придется экранировать или проверять пользовательский ввод каким-либо образом. Так, например, если бы у меня был код:

$members = new mysqli("localhost", "user", "pass", "members");
$r_email = $_POST['r_email'];
$check = $members->prepare("select user_id from users where email = ?");
$check->bind_param('s', $r_email);
$check->execute();
$check->store_result();
if ($check->num_rows > 0) {
    echo "user already registered";
    $check->close();
}
$members->close();

Нужно ли изменить $r_email = $_POST['r_email'] на $r_email = mysql_real_escape_string($_POST['r_email']);

Спасибо.

Ответы [ 3 ]

6 голосов
/ 05 января 2012

Вам не нужно уходить с подготовленными утверждениями, но все же рекомендуется проверять введенные пользователем данные (например, обязательные поля заполнены, числовые поля содержат числовые значения и т. Д.)

4 голосов
/ 05 января 2012

Нет необходимости экранировать значение, если вы собираетесь передать его в качестве параметра.На самом деле, вы не должны этого делать, потому что вы вставляете буквенные обратные слэши в свои данные.

Они должны быть частью запроса SQL во время подготовки, чтобы СУБД могла их анализировать и проверять.или проверьте ввод данных пользователем в форме.

Всегда данные SQL-Escape, которые вы вводите в предложения SQL.Никогда SQL-Escape данные вне предложений SQL.

2 голосов
/ 05 января 2012

Нет необходимости избегать ввода, но не экономьте на проверке, у вас все еще могут быть логические ошибки, такие как отправка пустого электронного письма, или ряд других побочных эффектов, которые могут вас укусить.

Всегда проверяйте, сохраняет вас в здравом уме позже, при тестировании на ошибки, это мой девиз @ наименьший.

...