Здравствуйте. Изучаю php/MySQL и все остальное, связанное с веб-разработкой. Дали мне задание сделать страницу регистрации пользователей и страницу управления и вывода пользователей. То есть всю таблицу SQL. У меня получилось все реализовать. Не получается реализовать, чтобы уже ранее зарегистрированный пользователь и его Эмайл не мог дважды проходить регистрацию. То есть нужно проверить, что такой эмайл был в базе данных и его регистрация не допустимо. $flag_err = false; переменная. База данных - $db Три колонки в таблице: name, email, adress Таблица: news Привожу ниже код: PHP: // получаем запрос if ($_POST['registration']) { // Если этот флаг = false, то ошибок нет $flag_err = false; // Если пустой regname, то ставим флаг = true if ($_POST['regname'] == '') { $flag_err = true; } if ($_POST['regemail'] == '') { $flag_err = true; } if ($_POST['regadress'] == '') { $flag_err = true; } // Функция addslashes особым образом "экранирует" символы, которые могут использовать злоумышленники для взлома базы данных // Важно, перед записью в БД, экранировать символы, иначе кулхацкеры взломают все вокруг // Создадим переменные для передачи их в тело запроса mysqli_qery $name = addslashes($_POST['regname']); $regemail = addslashes($_POST['regemail']); $regadress = addslashes($_POST['regadress']); // Вот код который должен проверить уникальность эмайла, и если он верен, то переменная //$flag_err = true; и записи в базу данных не будет $res = mysqli_query($db,"SELECT 1 FROM `news` WHERE `name` = '$name'"); $count = mysqli_num_rows($res); if ($count ->num_rows > 0) { $flag_err = true; } if ($flag_err == false) { mysqli_query($db, "INSERT INTO " . $db_table . "(name, email, adress) VALUES('$name','$regemail','$regadress')") or die(mysqli_error($db));
Здравствуйте, PHP: <?php error_reporting ( E_ALL ); if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) { $error = []; $filter = filter_input_array ( INPUT_POST, [ 'regname' => FILTER_DEFAULT, 'regemail' => FILTER_VALIDATE_EMAIL, 'regadress' => FILTER_DEFAULT, ] ); if ( in_array ( null, $filter, true ) ) { $error['undefined'] = 'Undefined inputs name :('; } else { if ( $filter['regname'] === false ) { $error['regname'] = 'Укажите имя.'; } if ( $filter['regemail'] === false ) { $error['regemail'] = 'Заполните поле хозяйственным мылом'; } if ( $filter['regadress'] === false ) { $error['regadress'] = 'Ул. Пушкина, д. Колотушкина, кв. Петрова, спросить у Вольнова'; } if ( $error === [] ) { mysqli_query ( $db, "SELECT COUNT(*) FROM `news` WHERE `name` = '" . mysqli_escape_string ( $db, $filter['regname'] ) . "'" ); if ( mysqli_num_rows () > 0 ) { $error['clone'] = 'Птичка уже в клетке!'; } } } if ( $error !== [] ) { echo implode ( '<br>', $error ); } else { mysqli_query ( $db, "INSERT INTO " . $db_table . "(name, email, adress) VALUES ( '" . mysqli_escape_string ( $db, $filter['regname'] ) . "', '" . mysqli_escape_string ( $db, $filter['regemail'] ) . "', '" . mysqli_escape_string ( $db, $filter['regadress'] ) . "' )"); } }
Мне как-то кто-то говорил, что php фигня. Не язык даже. А на данный момент он самый сложных язык их тех, что я изучал. Реально сложный.
Спасибо, у же сделал нашел свою ошибку. Бывают вот такие иногда мелочи. Когда особенно не знаком с синтаксисом, и пишешь абсолютную чушь
PHP: <? include 'dbconnect.php'; global $db; $name = ($_POST['regisrtname']); $email = ($_POST['registremail']); $password =($_POST['registrpassword']); // Для проверки уже существующего имени, делаем запрос в БД $res = mysqli_query($db,"SELECT 1 FROM `news` WHERE `name` = '$name'"); // Создаем нашу переменную и с помощью данной команды mysqli_num_rows чекаем все грядки в конкретном столбце $count = mysqli_num_rows($res); // Получаем зпрос из формы ($_POST['registr_registr_button']) { // Если запрос получен, то наша переменная всегда будет фелс $flag_err = false; // Если запрос из формы заполнения имени пустой, то он будет тру, если же не пустой то фелс if ($_POST['regisrtname'] == '') { $flag_err = true; } if ($_POST['registremail'] == ''){ $flag_err = true; } if ($_POST['registrpassword'] == ''){ $flag_err = true; } // Если данное значеие стент больше нуля, то такая запись в базе данных уже был, и переменная станет тру и запись не произойдет if ($count > 0) { $flag_err = true; } // Запись будет производиться только тогда когда значение переменной фелс, в противном случаи тру If ($flag_err == false) { mysqli_query($db, "INSERT INTO news (name,email,password) VALUES('$name','$email','$password')") or die(mysqli_error($db)); } } ?>
Неверная логика. Сразу вставляете и потом изучаете результат запроса. Предварительная выборка может понадобиться только для дружественности интерфейса, но у вас этого нет. --- Добавлено --- P.S. Про SQL-инъекции почитайте.
Я недавно php изучаю можете показать где что не так. Хотите сказать, что лучше сначала регистрировать, а потом проверять наличие такого пользователя?
Да, причем SELECT для этого естественно не нужен. --- Добавлено --- В случае ошибки при выполнении запроса получайте и анализируйте номер ошибки MySQL.
@La_Fleur_, забыл сказать самое важное, хотя и очевидное: поле с мылом должно быть юником, ну или первичным ключом (вижу, числового id в таблице у вас нет, что в данном случае достаточно странно).