За последние 24 часа нас посетили 55468 программистов и 1798 роботов. Сейчас ищут 1049 программистов ...

проверка на наличие в базе логина

Тема в разделе "PHP для новичков", создана пользователем Паша92, 13 фев 2017.

  1. Паша92

    Паша92 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    30
    Симпатии:
    0
    При регистрации постоянно выдает ошибку "Пользователь с таким логином уже существует в базе данных"
    Что не так? помогите разобраться.
    PHP:
    1. <?
    2. // Страница регистрации нового пользователя
    3.  
    4. if(isset($_POST['submit']))
    5. {
    6.     $err = [];
    7.  
    8.         // проверям логин
    9.     if(!preg_match("/^[a-zA-Z0-9]+$/",$_POST['login']))
    10.     {
    11.         $err[] = "Логин может состоять только из букв английского алфавита и цифр";
    12.     }
    13.  
    14.     if(strlen($_POST['login']) < 3 or strlen($_POST['login']) > 30)
    15.     {
    16.         $err[] = "Логин должен быть не меньше 3-х символов и не больше 30";
    17.     }
    18.  
    19. // проверяем, не сущестует ли пользователя с таким именем
    20.     $query = mysqli_query($link, "SELECT COUNT(user_id) FROM users WHERE user_login='".mysqli_real_escape_string($link, $_POST['login'])."'");
    21.     if(mysqli_num_rows($query) > 0)
    22.     {
    23.         $err[] = "Пользователь с таким логином уже существует в базе данных";
    24.     }
    25.  
    26.         // Если нет ошибок, то добавляем в БД нового пользователя
    27.     if(count($err) == 0)
    28.     {
    29.  
    30.         $login = $_POST['login'];
    31.  
    32.         // Убераем лишние пробелы и делаем двойное шифрование
    33.         $password = md5(md5(trim($_POST['password'])));
    34.  
    35.         mysqli_query($link,"INSERT INTO users SET user_login='".$login."', user_password='".$password."'");
    36.         header("Location: user-login.php"); exit();
    37.     }
    38.     else
    39.     {
    40.         echo "<center><b>При регистрации произошли следующие ошибки: </b>";
    41.         foreach($err AS $error)
    42.         {
    43.             print $error."</center>";
    44.         }
    45.     }
    46. }
    47. ?>
     
    #1 Паша92, 13 фев 2017
    Последнее редактирование модератором: 13 фев 2017
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Вы не автор кода, так? Дело в том, что COUNT по-любому вернет вам строку с результатом. Вы проверяете не значение которое он вернул, а именно количество строк. Их всегда будет больше нуля.

    А вообще проверку уникальности лучше делать на стороне БД, через выставление уникального индекса на логин и проверки, не вернула ли БД ошибку нарушения индекса во время запроса на запись. Если не вернула, то ок, запись прошла. Если вернула - ой, логин не уникальный.
    --- Добавлено ---
    P.S. Не используйте шорттаги <?, используйте <?php
     
    mahmuzar нравится это.
  3. Паша92

    Паша92 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    30
    Симпатии:
    0

    верно. я не автор
    спасибо, все исправил, вроде работает)
     
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Паша92 строка 35 нефильтрованый $login
    по теме строка 20 возвращает ноль а ноль уже строка
    надо так
    Код (Text):
    1.     if($query > 0)
     
  5. Паша92

    Паша92 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    30
    Симпатии:
    0
    вот это
    Код (Text):
    1.     if(mysqli_num_rows($query) > 0)
    заменить на это?
    Код (Text):
    1.     if($query > 0)
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    И что тогда получится, учитывая, что в $query, в данном случае не результат запроса в чистом виде?
     
  7. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Ну в твоем случае можно сделать так:

    PHP:
    1.  $query = mysqli_query($link, "SELECT COUNT(user_id) as cnt FROM users WHERE user_login='".mysqli_real_escape_string($link, $_POST['login'])."'");
    2.     $usr = mysqli_fetch_array($query, MYSQLI_ASSOC);
    3.     if($usr['cnt'] > 0)
    4.     {
    5.         $err[] = "Пользователь с таким логином уже существует в базе данных";
    6.     }
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а еще можно не считать кол-во пользователей и не дергать кортежи. select 1 в помощь
     
  9. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    ZlobnyKolob, Fell-x27 и mahmuzar нравится это.