Я хотел бы проверить, нет ли имени пользователя в моей базе данных. Если да, то я хотел бы перенаправить обратно на мою страницу регистрации. Код, который у меня есть, позволяет добавлять имена пользователей, но не проверяет, существует ли имя пользователя. Пожалуйста помоги!!! Это код для страницы register.php. Код полностью пропускает проверку на «имя пользователя» и вставляет в базу данных, если она существует или нет.
<?php error_reporting (E_ALL ^ E_NOTICE); include ('dbconn.php'); session_start(); $GLOBALS[$error_message]; $GLOBALS[$username]; if(isset($_POST['submit'])) { $error = array(); if(empty($_POST['username'])) { $error[] = 'Please enter a username. '; } else { $username = mysqli_real_escape_string($connection, $_POST['username']); } if(empty($_POST['password'])) { $error[] = 'Please enter a password. '; } else { $password = mysqli_real_escape_string($connection,$_POST['password']); } if(empty($_POST['cpassword'])) { $error[] = 'Please confirm password. '; } else { $cpassword = mysqli_real_escape_string($connection,$_POST['cpassword']); } if($password == $cpassword) { $mainpassword= $password; } else { $error[] = 'Your passwords do not match. '; } if(empty($error)) { $query = "SELECT * from User WHERE username=' ".$username." ' "; $result = mysqli_query($connection, $query) or die (mysqli_error($connection)); if(mysqli_num_rows($result)> 0) { $multi = "Sorry ! This Username is not available...Please choose another"; } else{ $sql="INSERT INTO user(username,password)VALUES ('$username','$password')"; mysqli_query($connection, $sql) or die(mysqli_error($connection)); header('Location:/MySQLi/confirmation.php'); } } else { $error_message = '<span class="error">'; foreach($error as $key => $values) { $error_message.="$values"; } $error_message.="</span><br/><br/>"; } } ?>
Вы вручную добавляете пробелы вокруг своего имени пользователя, чтобы он выглядел так, как будто его не существует:
$query = "SELECT * from User WHERE username=' ".$username." ' "; ^ ^
Должно быть:
$query = "SELECT * from User WHERE username='".$username."' ";
Использование подготовленного заявления позволит избежать этой проблемы и потенциальных проблем с внедрением sql за один раз:
$query = "SELECT * from User WHERE username=?";
Также убедитесь, что вы последовательно используете свои имена таблиц и столбцов: User
не обязательно совпадает с user
.
Также обратите внимание, что вы никогда не должны хранить пароли открытого текста в базе данных, вы должны солировать и хешировать их .
Имена таблиц SQL могут быть чувствительны к регистру, поэтому «пользователь» и «пользователь» не совпадают. Если ваша таблица имеет имя «пользователь» с нижним регистром, тогда «SELECT * FORM User» с верхним регистром может не дать никаких результатов.
Если вы просто хотите проверить существование, вы можете выбрать «1» и добавить ограничение 1, чтобы запрос не просматривал всю таблицу, например:
"SELECT 1 FROM user WHERE username='" . $username . "' LIMIT 1";
Или вы можете сделать свой столбец имени пользователя UNIQUE, тогда инструкция INSERT завершится с ошибкой, если имя пользователя уже существует, что дает вам простой запрос с одним запросом, который может вставлять нового пользователя, а также сообщать вам, если это имя уже выполнено.
Наконец, ваш код широко открыт для атак SQL Injection. Всегда избегайте ввода пользователем или используйте подготовленные заявления.