Я хотел бы проверить, существует ли уже имя пользователя в моей базе данных. Если это произойдет, я хотел бы перенаправить обратно на мою страницу регистрации. Код, который у меня есть, работает для добавления имен пользователей, но не проверяет, существует ли имя пользователя. Пожалуйста помоги!!! Это код для страницы 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 могут быть чувствительными к регистру, поэтому «пользователь» и «пользователь» не совпадают. Если ваша таблица с именем «user» в нижнем регистре, то «SELECT * FORM User» в верхнем регистре может не дать никаких результатов.
Если вы просто хотите проверить существование, вы можете выбрать «1» и добавить предел 1, чтобы запрос не сканировал всю таблицу, например:
"SELECT 1 FROM user WHERE username='" . $username . "' LIMIT 1";
Или вы можете сделать свой столбец с именем пользователя УНИКАЛЬНЫМ, тогда оператор INSERT завершится ошибкой, если имя пользователя уже существует, предоставив вам простую проверку одним запросом, которая может как вставить нового пользователя, так и сообщить, если это имя уже занято.
Наконец, ваш код широко открыт для атак SQL-инъекций. Всегда избегайте пользовательского ввода или используйте подготовленные операторы.