Есть функции регистрации и авторизации, на определенном этапе в этих функциях есть необходимость проверить есть ли уже такой логин в БД, для этого я написал небольшую функцию. Код (PHP): function userExists($login){ global $link; $sql = "SELECT `id` FROM `users` WHERE `login` = '$login' LIMIT 1"; if (!$res = mysqli_query($link, $sql)) return false; if (!mysqli_num_rows($res)) return false; // 1 - Пользователь с таким логином есть в БД; 0 - такого пользователя нет mysqli_free_result($res); return true; } По задумке она возвращает false, если такого логина в БД нет, и true, если логин уже есть. Но столкнулся с такой проблемой, что она так же возвращает false, если в запросе произошла ошибка. Это логично, ведь я сам попросил ее возвращать false. По идее я могу возвращать: false, если произошла ошибка -1, если логина нет в БД 1, если логин есть в БД Код (PHP): function userExists($login){ global $link; $sql = "SELECT `id` FROM `users` WHERE `login` = '$login' LIMIT 1"; if (!$res = mysqli_query($link, $sql)) return false; // если произошла ошибка в запросе if (!mysqli_num_rows($res)) return -1; // 1, если Пользователь с таким логином есть в БД; -1, если такого пользователя нет mysqli_free_result($res); return true; } тогда у меня немного усложнится проверка ответа результата этой функции в функциях регистрации и авторизации. Это меня не пугает, но нормальная ли эта практика? Хотелось бы делать правильно, а не как попало. PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Прошу прощения, почитал я про исключения, вроде бы даже составил кое какую функцию, но все равно у меня сложности Код (PHP): function userExists($login){ global $link; // Запрос в БД, на предмет наличия такого логина в БД [] $sql = "SELECT `id` FROM `users` WHERE `email` = '$login' LIMIT 1"; try{ // Проверяю запрос на ошибки, если с ошибкой, возбуждаем исключение if (!$res = mysqli_query($link, $sql)) { throw new Exception("Ошибка в запросе userExists"); }else{ // проверяем кол-во вернувшихся строк [0-логина нет в БД /1-логин в БД есть] if (!mysqli_num_rows($res)) return false; return true; } }catch(Exception $e){ // В запросе была ошибка, описываем исключение ????? } } что мне делать то в исключении? Создать в сессии какой то элемент, допустим $_SESSION['query_error'] и присвоить ему значение true? А потом в функции регистрации перед получением результата функции userExists делать еще одно условие на наличие в сессии "query_error"? я просто не понимаю, что мне делать с этим исключением?
неправильно. не надо перехватывать исключение в самой функции. пусть оно улетает куда-то "выше". суть исключения понятно в названии: это исключительная ситуация, неправильная. нет никаких вариантов «если функция вернула признак "всё сломалось", то…» — это невозможно! раз сломалось, значит всё, приплыли! try-catch используется в очень ограниченных случаях и то они все спорные обычно всё, что нужно сделать — выдать прощальное сообщение, записать что-то в логи и сдохнуть. и делать это логично не в каждой подобной функции, а в едином месте. почитай про set_exception_handler() — он регистрирует обработчик неперехваченных исключений.
Код (Text): try { $login_free = checkLoginFree($login); } catch (Exception $e) { echo 'Error!'; var_dump($e); }