#php #html
#php #HTML
Вопрос:
Мне было интересно, могу ли я получить некоторую помощь относительно того, где я ошибаюсь на странице регистрации для веб-сайта, который я создаю.
Когда пользователь создает учетную запись, выполняется проверка, чтобы убедиться, что имя пользователя и адрес электронной почты, которые они вводят, еще не были приняты. Если ни один из них не принимается, то вводимая ими информация вводится в созданную мной таблицу SQL. На данный момент, хотя это работает не так, как должно быть, если адрес электронной почты уже был взят, отображается ошибка, но если имя пользователя уже взято, ошибка не отображается, и информация вставляется в таблицу SQL.
Это то, что у меня есть на данный момент:
<body>
<?php
//if form has been submitted process it
if(isset($_POST['submit'])){
//collect form data
extract($_POST);
if($name==''){
$error[] = 'Please enter your name.';
}
if($username ==''){
$error[] = 'Please enter the username you would like.';
}
if($email==''){
$error[] = 'Please enter your email address.';
}
if($age < 18){
$error[] = 'You are too young to create an account with this site.';
}
if ($age==''){
$error[] = 'Please enter your age.';
}
if($email==''){
$error[] = 'Please enter your email address.';
}
if($password ==''){
$error[] = 'Please enter your password.';
}
if($passwordConfirm ==''){
$error[] = 'Please confirm the password.';
}
if($password != $passwordConfirm){
$error[] = 'Passwords do not match.';
}
if(!isset($error)){
$query = $dbconn->prepare('SELECT username FROM users WHERE username = ?');
$query->bindValue( 1, $username );
$query->execute();
if( $query->rowCount() > 0 ) { # If rows are found for query
echo '<p class="error" align="center">An account has already been made using this username</p>';
}
$query = $dbconn->prepare('SELECT email FROM users WHERE email = ?');
$query->bindValue( 1, $email );
$query->execute();
if( $query->rowCount() > 0 ) { # If rows are found for query
echo '<p class="error" align="center">An account has already been made using this email address</p>';
}
else {
try {
$hashedpassword = password_hash($password, PASSWORD_BCRYPT);
//insert into database
$stmt = $dbconn->prepare('INSERT INTO users (username,name,password,email,role,age,passwordchange) VALUES (:username, :name, :password, :email, :role, :age, :passwordchange)') ;
$stmt->execute(array(
':username' => $username,
':name' => $name,
':password' => $hashedpassword,
':email' => $email,
':role' => "user",
':age' => $age,
':passwordchange' => 0
));
//redirect to login page
header('Location: login.php');
exit;
} catch(PDOException $e) {
echo $e->getMessage();
}
}
}
}
//check for any errors
if(isset($error)){
foreach($error as $error){
echo '<p class="error" align="center">'.$error.'</p>';
}
}
?>
<div class = "register">
<form action='' method='post' align = "center">
<h2>Register an account</h2>
<p><label>Name</label><br />
<input type='text' name='name' value='<?php if(isset($error)){ echo $_POST['name'];}?>'></p>
<p><label>Username</label><br />
<input type='text' name='username' value='<?php if(isset($error)){ echo $_POST['username'];}?>'></p>
<p><label>Email Address</label><br />
<input type='email' name='email' value='<?php if(isset($error)){ echo $_POST['email'];}?>'></p>
<p><label>Age</label><br />
<input type='age' name='age' value='<?php if(isset($error)){ echo $_POST['age'];}?>'></p>
<p><label>Password</label><br />
<input type='password' name='password' value='<?php if(isset($error)){ echo $_POST['password'];}?>'></p>
<p><label>Confirm Password</label><br />
<input type='password' name='passwordConfirm' value='<?php if(isset($error)){ echo $_POST['passwordConfirm'];}?>'></p>
<p><input type='submit' name='submit' value='Register'></p>
<p>Already a member? <a href="login.php">Log in</a></p>
</form>
</div>
</body>
Дополнительная информация:
если я поменяю местами запросы username и email, то появится сообщение об ошибке, если имя пользователя уже было введено, но не с электронной почтой.
Если у меня нет оператора else с кодом для вставки в базу данных, то оба запроса вернут ошибку. Я просто очень смущен тем, где я ошибся, и любая помощь будет с благодарностью
Редактировать:
Итак, я все еще не понимаю, почему это не работает, я сделал это так, как я делал для других проектов, и это работает нормально, поэтому я не знаю, почему это здесь не работает.
С комментарием, предлагающим поместить else со вторым оператором if для проверки электронной почты, я получаю сообщение об ошибке «неожиданное else». Итак, что еще я могу сделать, чтобы исправить это?
Комментарии:
1. Может быть другая проблема, но проверьте логику скрипта: если имя пользователя существует, вы
echo
получаете сообщение, но выполнение продолжается. Кроме того, не делайтеextract($_POST)
!2. Что не так с использованием extract($_POST)?
3. У вас есть логическая проблема в вашем коде в if else, сначала if работает нормально, а для второго if, если оно равно false, оно переходит в условие else. Поэтому, чтобы исправить это, используйте else if для вашего второго if (который является проверкой электронной почты)
4. В настоящее время ваш код работает в этом потоке, если имя пользователя соответствует только эхо-сообщению, тогда он проверит адрес электронной почты, если он соответствует, эхо-сообщение и часть else не будут работать, если email не соответствует, часть else будет работать независимо от проверки имени пользователя.
5. А, ладно, спасибо, Амир!
Ответ №1:
Мне удалось разобраться, и да, это была логическая проблема, которая вызвала проблему. Вот как я сейчас это делаю, и это работает отлично:
$userQuery = $dbconn->prepare( 'SELECT username FROM users WHERE username = ?');
$userQuery->bindValue( 1, $username );
$userQuery->execute();
$emailQuery = $dbconn->prepare( 'SELECT email FROM users WHERE email = ?' );
$emailQuery->bindValue( 1, $email );
$emailQuery->execute();
if($userQuery->rowCount() > 0 amp;amp; $emailQuery->rowCount() > 0 ) {
echo '<p class="error" align="center">An account has already been made using this username</p>';
echo '<p class="error" align="center">An account has already been made using this email address</p>';
}
else if( $userQuery->rowCount() > 0 ) { # If rows are found for query
echo '<p class="error" align="center">An account has already been made using this username</p>';
}
else if( $emailQuery->rowCount() > 0 ) { # If rows are found for query
echo '<p class="error" align="center">An account has already been made using this email address</p>';
}