Как я могу проверить, есть ли электронная почта или имя пользователя уже в моей базе данных mysql, пока регистрируется другой пользователь, поэтому я могу остановить процесс регистрации и, возможно, предложить другое 2/3 новое имя пользователя, которого нет в базе данных для нового пользователя.
поэтому я попробовал работать, и я мог бы получить только тот, который проверяет, существует ли в базе данных электронная почта, тем временем мне нужен тот, который будет проверять как имя пользователя, так и адрес электронной почты в базе данных и печатать обе $ ошибки отдельно. Я имею в виду, что если существует электронная почта и имя пользователя не существует, она будет печатать только сообщение об ошибке и то же самое для имени пользователя.
Надеюсь, кто-то меня поймет.
<?php if(isset($_POST['register'])) { $username = $_POST['username']; $full_name = ucwords($_POST['full_name']); $email = $_POST['email']; $password = trim($_POST['password']); $time = time(); $age = $_POST['age']; $gender = $_POST['gender']; // Geolocation $longitude = $_SESSION['longitude']; $latitude = $_SESSION['latitude']; $geo_info = $geo->getInfo($latitude,$longitude); $city = $geo_info['geonames'][0]['name']; $country = $geo_info['geonames'][0]['countryName']; $check_d = $db->query("SELECT username, email from users WHERE username = '$username' OR email = '$email'"); $check_d = $check_d->num_rows; if($check_d == 0) { $db->query("INSERT INTO users (profile_picture,username,full_name,email,password,registered,credits,age,gender,ip,country,city,longitude,latitude) VALUES ('default_avatar.png','$username','$full_name','$email','".$auth->hashPassword($password)."','$time','100','$age','$gender','$ip','".$country."','".$city."','".$longitude."','".$latitude."')"); setcookie('justRegistered', 'true', time()+6); setcookie('mm-email',$email,time()+60*60*24*30,'/'); header('Location: '.$domain.'/people'); } else { $error = 'Username or password already exist, Try Another'; } } if($auth->isLogged()) { $first_name = $system->getFirstName($_SESSION['full_name']); $logged_in_user = header('Location: '.$domain.'/people'); } $users = $db->query("SELECT * FROM users ORDER BY RAND() LIMIT 7"); ?>
Вы можете это сделать, проверив имя пользователя и адрес электронной почты в разделенных запросах.
В реализации я отправляю сообщение сначала, чтобы проверить почту, а затем проверить имя пользователя в базе данных. Если оба они уже находятся в db, более поздняя ошибка (для имени пользователя) перезапишет сообщение для сообщения электронной почты. Вы должны изменить это, чтобы дать пользователю более точную информацию о том, почему набор данных не может быть вставлен в таблицу.
Перед выполнением каких-либо проверок я инициализирую переменную $error
AS null
, так как она будет перезаписана, если одна из проверок ограничений завершится с ошибкой, я могу просто проверить, все ли она по-прежнему равна нулю после проверки, чтобы решить, должна ли выполняться insert
или нет.
ПРИМЕЧАНИЕ. Вы не должны использовать этот скрипт, так как он серьезно уязвим для инъекций sql. Посмотрите эту тему, чтобы узнать, что вы должны изменить: как я могу предотвратить SQL-инъекцию в PHP?
$error = null; $check_mail = $db->query("SELECT id FROM users WHERE email='" . $email . "'"); if ($check_mail->num_rows > 0) { $error = 'Email already exists'; } $check_username = $db->query("SELECT id FROM users WHERE username='" . $username . "'"); if ($check_username->num_rows > 0) { $error = 'username already exists'; } if($error === null){ $db->query("INSERT INTO users (profile_picture,full_name,email,password,registered,credits,age,gender,ip,country,city,longitude,latitude) VALUES ('default_avatar.png','$full_name','$email','" . $auth->hashPassword($password) . "','$time','100','$age','$gender','$ip','" . $country . "','" . $city . "','" . $longitude . "','" . $latitude . "')"); setcookie('justRegistered', 'true', time() + 6); setcookie('mm-email', $email, time() + 60 * 60 * 24 * 30, '/'); header('Location: ' . $domain . '/people'); }
Как правило, вы хотите, чтобы такие ограничения выполнялись на уровне базы данных. С MySQL вы можете добавить unique
индекс в столбцы имени пользователя и электронной почты. Когда дубликат будет введен, запрос завершится с ошибкой.
Затем вы можете проверить, произошел ли дубликат и соответствующим образом обрабатывать его.
try { // Attempt to insert user here } catch (Exception $e) { // It failed! Check if username/email exists so we can confirm the exception is this // The following is pseudocode -- you will need to write your own if (username_exists() || email_exists() { // Generate alternative names $names = generateNames($username); // Send this to your view or however you are displaying info echo("Name is taken!<br>You can try one of these:<br>"); echo("<ul>"); foreach ($names as $name) { echo("<li>$name</li>"); } echo("</ul>"); } }