За последние 24 часа нас посетили 20137 программистов и 1700 роботов. Сейчас ищут 1383 программиста ...

Проверить уникальность имени в базе данных

Тема в разделе "PHP и базы данных", создана пользователем La_Fleur_, 20 июл 2018.

  1. La_Fleur_

    La_Fleur_ Новичок

    С нами с:
    20 июл 2018
    Сообщения:
    6
    Симпатии:
    0
    Здравствуйте. Изучаю php/MySQL и все остальное, связанное с веб-разработкой. Дали мне задание сделать страницу регистрации пользователей и страницу управления и вывода пользователей. То есть всю таблицу SQL. У меня получилось все реализовать. Не получается реализовать, чтобы уже ранее зарегистрированный пользователь и его Эмайл не мог дважды проходить регистрацию. То есть нужно проверить, что такой эмайл был в базе данных и его регистрация не допустимо.
    $flag_err = false; переменная.
    База данных - $db
    Три колонки в таблице: name, email, adress
    Таблица: news

    Привожу ниже код:
    PHP:
    1. // получаем запрос
    2. if ($_POST['registration']) {
    3.  
    4.     // Если этот флаг = false, то ошибок нет
    5.     $flag_err = false;
    6.  
    7.     // Если пустой regname, то ставим флаг = true
    8.     if ($_POST['regname'] == '') {
    9.         $flag_err = true;
    10.     }
    11.  
    12.     if ($_POST['regemail'] == '') {
    13.         $flag_err = true;
    14.     }
    15.  
    16.     if ($_POST['regadress'] == '') {
    17.         $flag_err = true;
    18.     }
    19.         // Функция addslashes особым образом "экранирует" символы, которые могут использовать злоумышленники для взлома базы данных
    20.         // Важно, перед записью в БД, экранировать символы, иначе кулхацкеры взломают все вокруг
    21.  
    22.         // Создадим переменные для передачи их в тело запроса mysqli_qery
    23.      
    24. $name = addslashes($_POST['regname']);
    25.         $regemail = addslashes($_POST['regemail']);
    26.         $regadress = addslashes($_POST['regadress']);
    27.    
    28. // Вот код который должен проверить уникальность эмайла, и если он верен, то переменная   //$flag_err  = true; и записи в базу данных не будет
    29.    
    30. $res = mysqli_query($db,"SELECT 1 FROM `news` WHERE `name` = '$name'");
    31.    
    32.       $count = mysqli_num_rows($res);
    33.    
    34.       if ($count ->num_rows > 0) {
    35.    
    36.       $flag_err  = true;
    37. }
    38.      if ($flag_err == false) {
    39.  
    40.  
    41.         mysqli_query($db, "INSERT INTO " . $db_table . "(name, email, adress) VALUES('$name','$regemail','$regadress')") or die(mysqli_error($db));
     
    #1 La_Fleur_, 20 июл 2018
    Последнее редактирование модератором: 20 июл 2018
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    Здравствуйте,
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. if ( $_SERVER['REQUEST_METHOD'] === 'POST' )
    6. {
    7.     $error = [];
    8.  
    9.     $filter = filter_input_array ( INPUT_POST, [
    10.         'regname' => FILTER_DEFAULT,
    11.         'regemail' => FILTER_VALIDATE_EMAIL,
    12.         'regadress' => FILTER_DEFAULT,
    13.     ] );
    14.  
    15.     if ( in_array ( null, $filter, true ) )
    16.     {
    17.         $error['undefined'] = 'Undefined inputs name :(';
    18.     }
    19.     else
    20.     {
    21.         if ( $filter['regname'] === false )
    22.         {
    23.             $error['regname'] = 'Укажите имя.';
    24.         }
    25.      
    26.         if ( $filter['regemail'] === false )
    27.         {
    28.             $error['regemail'] = 'Заполните поле хозяйственным мылом';
    29.         }
    30.      
    31.         if ( $filter['regadress'] === false )
    32.         {
    33.             $error['regadress'] = 'Ул. Пушкина, д. Колотушкина, кв. Петрова, спросить у Вольнова';
    34.         }
    35.      
    36.         if ( $error === [] )
    37.         {
    38.             mysqli_query ( $db, "SELECT COUNT(*) FROM `news` WHERE `name` = '" . mysqli_escape_string ( $db, $filter['regname'] ) . "'" );
    39.          
    40.             if ( mysqli_num_rows () > 0 )
    41.             {
    42.                 $error['clone'] = 'Птичка уже в клетке!';
    43.             }
    44.         }
    45.     }
    46.  
    47.     if ( $error !== [] )
    48.     {
    49.         echo implode ( '<br>', $error );
    50.     }
    51.     else
    52.     {
    53.         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'] ) . "' )");
    54.     }
    55. }
     
    _ne_scaju_, Taktreba и La_Fleur_ нравится это.
  3. La_Fleur_

    La_Fleur_ Новичок

    С нами с:
    20 июл 2018
    Сообщения:
    6
    Симпатии:
    0
    Обязательно попробую. Такого я еще не видел.
     
  4. La_Fleur_

    La_Fleur_ Новичок

    С нами с:
    20 июл 2018
    Сообщения:
    6
    Симпатии:
    0
    Мне как-то кто-то говорил, что php фигня. Не язык даже. А на данный момент он самый сложных язык их тех, что я изучал. Реально сложный.
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    с 40 строки код не рабочий. Твоя задача выяснить почему
     
  6. La_Fleur_

    La_Fleur_ Новичок

    С нами с:
    20 июл 2018
    Сообщения:
    6
    Симпатии:
    0
    Спасибо, у же сделал нашел свою ошибку. Бывают вот такие иногда мелочи. Когда особенно не знаком с синтаксисом, и пишешь абсолютную чушь :)
     
  7. La_Fleur_

    La_Fleur_ Новичок

    С нами с:
    20 июл 2018
    Сообщения:
    6
    Симпатии:
    0
    PHP:
    1. <?
    2.  
    3. include 'dbconnect.php';
    4. global $db;
    5.  
    6. $name = ($_POST['regisrtname']);
    7. $email = ($_POST['registremail']);
    8. $password =($_POST['registrpassword']);
    9.  
    10. // Для проверки уже существующего имени, делаем запрос в БД
    11. $res = mysqli_query($db,"SELECT 1 FROM `news` WHERE `name` = '$name'");
    12.  
    13. // Создаем нашу переменную и с помощью данной команды mysqli_num_rows чекаем все грядки в конкретном столбце
    14. $count = mysqli_num_rows($res);
    15.  
    16. // Получаем зпрос из формы
    17. ($_POST['registr_registr_button']) {
    18.  
    19.     // Если запрос получен, то наша переменная всегда будет фелс
    20.     $flag_err = false;
    21.  
    22.     // Если запрос из формы заполнения имени пустой, то он будет тру, если же не пустой то фелс
    23.     if ($_POST['regisrtname'] == '') {
    24.         $flag_err = true;
    25.     }
    26.  
    27.     if ($_POST['registremail'] == ''){
    28.         $flag_err = true;
    29.     }
    30.  
    31.     if ($_POST['registrpassword'] == ''){
    32.         $flag_err = true;
    33.     }
    34.    
    35.     // Если данное значеие стент больше нуля, то такая запись в базе данных уже был, и переменная станет тру и запись не произойдет
    36.     if ($count > 0) {
    37.  
    38.     $flag_err  = true;
    39. }
    40.  
    41.     // Запись будет производиться только тогда когда значение переменной фелс, в противном случаи тру
    42.     If ($flag_err == false) {
    43.  
    44.     mysqli_query($db, "INSERT INTO news (name,email,password) VALUES('$name','$email','$password')") or die(mysqli_error($db));
    45. }
    46.  
    47. }
    48.  
    49. ?>
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.840
    Симпатии:
    652
    Неверная логика. Сразу вставляете и потом изучаете результат запроса. Предварительная выборка может понадобиться только для дружественности интерфейса, но у вас этого нет.
    --- Добавлено ---
    P.S. Про SQL-инъекции почитайте.
     
  9. La_Fleur_

    La_Fleur_ Новичок

    С нами с:
    20 июл 2018
    Сообщения:
    6
    Симпатии:
    0
    Я недавно php изучаю можете показать где что не так. Хотите сказать, что лучше сначала регистрировать, а потом проверять наличие такого пользователя?
     
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.840
    Симпатии:
    652
    Да, причем SELECT для этого естественно не нужен.
    --- Добавлено ---
    В случае ошибки при выполнении запроса получайте и анализируйте номер ошибки MySQL.
     
    MouseZver нравится это.
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.840
    Симпатии:
    652
    @La_Fleur_, забыл сказать самое важное, хотя и очевидное: поле с мылом должно быть юником, ну или первичным ключом (вижу, числового id в таблице у вас нет, что в данном случае достаточно странно).