Я очень новичок в mysqli раньше, я пишу запросы в mysql, но mysqli более продвинутый, поэтому я впервые использую его. Ниже приведен мой PHP-код.предотвратить SQL-инъекцию в mysqli
function clean($str) {
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
$email = clean($_POST['email']);
$password = clean($_POST['password']);
//$password =md5($password);
if(empty($res['errors'])) {
$result = $mysqli->query("SELECT uid FROM users where email='$email' and password = '$password'");
if($result->num_rows == 1){
$res['success'] = true;
}
else{
array_push($res['errors'], 'Invalid login details');
$res['success'] = false;
}
}else{
$res['success'] = false;
}
echo json_encode($res);
}
Функция очистки не работает должным образом, потому что sql-запросы возвращают false, если я правильно ввожу имя пользователя и пароль. Итак, похоже, что это неверно в случае с mysqli.
Я проверил эту ссылку PHP MySQLI Prevent SQL Injection и узнал, что мы должны подготовить запрос.
Я вижу, что есть пример, но я не могу понять, как подготовить/связать, если мне нужно использовать две или более формы данных.
Спасибо за ваше время.
обновленный код
$result = $mysqli->prepare("SELECT uid FROM users where email=:email and password = :password");
$result->execute([
':email' => $email,
':password' => $password]);
//$result->execute();
if($result->num_rows == 1){
//if(mysqli_num_rows($result) === 1) {
$res['success'] = true;
}
else{
array_push($res['errors'], 'Invalid login details');
$res['success'] = false;
}
использование redbeanphp, который построен на pdo. – jewelhuq
Причина в том, что вы смешиваете API-интерфейсы MySQL, вы не можете этого сделать, если вы все еще используете 'return mysql_real_escape_string ($ str);' с вашим текущим/новым кодом. Просто избавитесь от всего этого и используйте подготовленное заявление. Кроме того, мы не знаем, есть ли какие-либо значения в ваших массивах POST, так как вы не разместили свою HTML-форму. –
мы также не знаем, с каким API вы (сейчас) используете для связи. 'Mysql_'? 'Mysqli_'? PDO? Другие? Тогда у вас есть 'if ($ result-> num_rows == 1) {' это синтаксис 'mysqli_' и ваш' where email =: email и password =: password' - PDO. Опять же, они НЕ смешивают. –