За последние 24 часа нас посетили 17705 программистов и 1280 роботов. Сейчас ищут 1479 программистов ...

Проверка наличия логина в БД, как делать правильно?

Тема в разделе "PHP для новичков", создана пользователем anvyd, 8 окт 2015.

  1. anvyd

    anvyd Новичок

    С нами с:
    17 апр 2015
    Сообщения:
    13
    Симпатии:
    0
    Есть функции регистрации и авторизации, на определенном этапе в этих функциях есть необходимость проверить есть ли уже такой логин в БД, для этого я написал небольшую функцию.

    Код (PHP):
    1. function userExists($login){
    2.     global $link;
    3.     $sql = "SELECT `id` FROM `users` WHERE `login` = '$login' LIMIT 1";
    4.     if (!$res = mysqli_query($link, $sql)) return false;
    5.     if (!mysqli_num_rows($res)) return false; // 1 - Пользователь с таким логином есть в БД; 0 - такого пользователя нет
    6.     mysqli_free_result($res);
    7.     return true;
    8. }
    9.  
    По задумке она возвращает false, если такого логина в БД нет, и true, если логин уже есть.
    Но столкнулся с такой проблемой, что она так же возвращает false, если в запросе произошла ошибка. Это логично, ведь я сам попросил ее возвращать false.

    По идее я могу возвращать:
    false, если произошла ошибка
    -1, если логина нет в БД
    1, если логин есть в БД

    Код (PHP):
    1. function userExists($login){
    2.     global $link;
    3.     $sql = "SELECT `id` FROM `users` WHERE `login` = '$login' LIMIT 1";
    4.     if (!$res = mysqli_query($link, $sql)) return false; // если произошла ошибка в запросе
    5.     if (!mysqli_num_rows($res)) return -1; // 1, если Пользователь с таким логином есть в БД; -1, если такого пользователя нет
    6.     mysqli_free_result($res);
    7.     return true;
    8. }
    9.  
    тогда у меня немного усложнится проверка ответа результата этой функции в функциях регистрации и авторизации. Это меня не пугает, но нормальная ли эта практика? Хотелось бы делать правильно, а не как попало.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    генерируй исключение при ошибке, не надо ничего возвращать. логика остается двоичной: да или нет.
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  4. anvyd

    anvyd Новичок

    С нами с:
    17 апр 2015
    Сообщения:
    13
    Симпатии:
    0
    Прошу прощения, почитал я про исключения, вроде бы даже составил кое какую функцию, но все равно у меня сложности
    Код (PHP):
    1. function userExists($login){
    2.   global $link;
    3.   // Запрос в БД, на предмет наличия такого логина в БД []
    4.   $sql = "SELECT `id` FROM `users` WHERE `email` = '$login' LIMIT 1";
    5.  
    6.   try{
    7.     // Проверяю запрос на ошибки, если с ошибкой, возбуждаем исключение
    8.       if (!$res = mysqli_query($link, $sql)) {
    9.         throw new Exception("Ошибка в запросе userExists");
    10.       }else{
    11.        // проверяем кол-во вернувшихся строк [0-логина нет в БД /1-логин в БД есть]
    12.        if (!mysqli_num_rows($res)) return false;
    13.        return true;
    14.      }
    15.   }catch(Exception $e){
    16.   // В запросе была ошибка, описываем исключение
    17.   ?????
    18.   }
    19. }
    что мне делать то в исключении?
    Создать в сессии какой то элемент, допустим $_SESSION['query_error'] и присвоить ему значение true?
    А потом в функции регистрации перед получением результата функции userExists делать еще одно условие на наличие в сессии "query_error"?
    я просто не понимаю, что мне делать с этим исключением?
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    неправильно. не надо перехватывать исключение в самой функции. пусть оно улетает куда-то "выше".

    суть исключения понятно в названии: это исключительная ситуация, неправильная. нет никаких вариантов «если функция вернула признак "всё сломалось", то…» — это невозможно! раз сломалось, значит всё, приплыли!

    try-catch используется в очень ограниченных случаях и то они все спорные ;) обычно всё, что нужно сделать — выдать прощальное сообщение, записать что-то в логи и сдохнуть. и делать это логично не в каждой подобной функции, а в едином месте.

    почитай про set_exception_handler() — он регистрирует обработчик неперехваченных исключений.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Код (Text):
    1. try {
    2.  $login_free = checkLoginFree($login);
    3. } catch (Exception $e) {
    4.  echo 'Error!';
    5.  var_dump($e);
    6. }