#php #mysqli
#php #mysqli
Вопрос:
Я пытаюсь повторить «Имя пользователя / электронная почта уже зарегистрирована» только тогда, когда найдены дубликаты, но я застрял с этим echo, пока не зарегистрируюсь. Как я могу показать это только при обнаружении дубликатов и что я здесь делаю не так?😕
// register users
if(isset($_POST['username']) amp;amp; !empty($_POST['username'])){$username = mysqli_real_escape_string($mysqli, $_POST['username']);}
if(isset($_POST['email']) amp;amp; !empty($_POST['email'])){$email = mysqli_real_escape_string($mysqli, $_POST['email']);}
if(isset($_POST['password']) amp;amp; !empty($_POST['password'])){$password = mysqli_real_escape_string($mysqli, $_POST['password']);}
if(isset($_POST['confirm_password'])){$confirm_password =mysqli_real_escape_string($mysqli,$_POST['confirm_password']);}
//chkd amp;amp; secon
$chkd = $mysqli->prepare("SELECT * FROM user WHERE username = ? AND email =?");
$chkd->bind_param("ss", $username, $email);
$chkd->execute();
$chkd->store_result();
$numRows = $chkd->num_rows();
if( $numRows ){
echo "<p style='text-align: center; color:red'>Username/Email is already registered</p>";
} else {
$secon = $mysqli->prepare("INSERT INTO user (username, email, password) VALUES (?, ?, ?)");
$secon->bind_param("sss", $username, $email, $password);
$secon->execute();
$secon->close();
$chkd->close();
echo "<p style='text-align: center; color:red'>DATA registered</p>";};
Комментарии:
1. Возможно, вы хотите сделать:
SELECT * FROM user WHERE username = ? AND email =?
? Обратите внимание на «И».2. спасибо, я это сделал, но проблема все еще существует: D
3. Не используйте
mysqli_real_escape_string
, подготовленные инструкции «сделают это» за вас.4. Вы можете захотеть
$chkd->num_rows
, не$chkd->num_rows()
.5. Итак, где определены $ username и $ email, если они не существуют в POST (или пусты)?
Ответ №1:
Я добавил это, чтобы отобразить ошибки в моей форме
<?php if(count($errors) > 0): ?>
<div class="alert alert-danger">
<?php foreach($errors as $error): ?>
<li><?php echo $error; ?></li>
<?php endforeach; ?>
</div>
<?php endif; ?>
и вот как выглядит переработанный код, и он работает 🙂
<?php
session_start();
// errvar
$errors = array();
// register
if (isset($_POST['register-submit'])) {
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$confirm_password = $_POST['confirm_password'];
// validation
$chkd = $mysqli->prepare("SELECT * FROM user WHERE email = ? LIMIT 1");
$chkd->bind_param("s", $email);
$chkd->execute();
$chkd->store_result();
$row_cnt = $chkd->num_rows;
$chkd->close();
if ($row_cnt > 0) {
$errors['email'] = "Email already exists";
}
$chkd = $mysqli->prepare("SELECT * FROM user WHERE username = ? LIMIT 1");
$chkd->bind_param("s", $username);
$chkd->execute();
$chkd->store_result();
$row_cnt = $chkd->num_rows;
$chkd->close();
if ($row_cnt > 0) {
$errors['username'] = "Username already exists";
}
if (count($errors) === 0) {
$password = password_hash($password, PASSWORD_DEFAULT);
$secon = $mysqli->prepare("INSERT INTO user (username, email, password) VALUES (?, ?, ?)");
$secon->bind_param("sss", $username, $email, $password);
$secon->execute();
$secon->close();
header('Location:home.php');
exit();
}
};
?>