Да что ты говоришь! А можно мы продолжим использовать более лаконичные и логичные конструкции, расчитывающие на пусто/не пусто? Или прям обязательно знать количество? PHP: $result = $mysqli->query($query); while ($row = $result->fetch_assoc()) { Вместо while может быть if, если мы знаем что строка будет одна или ни одной.
если ты видишь это так, это действительно смешно. но никто в этом не виноват --- Добавлено --- носок хахаха.
В данном месте больше в тему if. Но маус ухватился за вайл, игнорируя примечание. Потому что так смешнее. --- Добавлено --- Если сформулировать цель проверки по русски, то это "если существует пользователь с таким логином". А теперь выразим это на php + mysqli: По маусу там надо необходимо (!) считать количество строк. А я говорю что достаточно знать что такая строка существует. Мы все в какой-то мере в плену стереотипов и прошлого опыта. Если это признать, то будет легче учиться.
Я согласен, что в конкретном примере нам вообще незачем получать юзера. Но я также понимаю что запрос уже выполнен драйвером mysql и без этого не сработал бы num_rows. Не получится тут сэкономить. Поэтому категоричность "только так и так надо всегда" меня позабавила. Можно по-всякому. Надеюсь топикстартер понял в чём его ошибка, только это важно в нашем обсуждении.
Я отлично осознаю свою ошибку, поэтому промолчу. Но сейчас, когда нужно узнать "был ли найден юзер" стоит использовать подсчет rows
Запрос, кстати можно изменить до "select 1 from `users` where `login`=:login limit 1" что только подчеркнёт, что нам не нужны данные пользователя, а только сам факт наличия такого пользователя. В остальном всё также.
Это уже не велосипед, а пи3дец --- Добавлено --- Есть случай когда идет поиск никнейма или email (в обоих случаях уникальны) и вот тогда тут играет роль уже не подсчет rows PHP: public function validator( array $input, User $user ): array { $input['_username|email'] = $input['_username'] = $input['_email'] = $input['_password'] = true; if ( strcmp ( $model -> getFirstPassword(), $model -> getSecondPassword() ) != 0 ) { $input['_password'] = false; } if ( strcmp ( mb_strtolower ( $user -> getUsername() ), $user -> getEmail() ) == 0 ) { $input['_username|email'] = false; } // Поиск username или email $select = $this -> app -> repository -> get( 'query.database.select.users_username|email' )( $user -> getUsername(), $user -> getEmail() ); foreach ( $select -> getAll() AS $result ) { if ( strcmp ( mb_strtolower ( $user -> getUsername() ), mb_strtolower ( $result -> username ) ) == 0 ) { $input['_username'] = false; } if ( strcmp ( $user -> getEmail(), $result -> email ) == 0 ) { $input['_email'] = false; } } $assertUsername = [ new Assert\Length( [ 'min' => 3, 'max' => 50, 'minMessage' => 'Ваше имя пользователя должно содержать не менее {{ limit }} символов', 'maxMessage' => 'Ваше имя пользователя не может быть длиннее {{ limit }} символов' ] ), new Assert\Regex( [ 'pattern' => '/^\w+$/ui', 'message' => 'Имя пользователя может содержать только [A-Za-z0-9_] символы', ] ) ]; $assertEmail = [ new Assert\Email( [ 'message' => 'Неверный адрес электронной почты' ] ), new Assert\NotBlank( [ 'message' => 'Адрес электронной почты не должен быть пустой' ] ) ]; $assertPassword = new Assert\Length( [ 'min' => 10, 'max' => 100, 'minMessage' => 'Ваш пароль должен содержать не менее {{ limit }} символов', 'maxMessage' => 'Ваш пароль превышает {{ limit }} символов', ] ); /* $assertConfirmPassword = new Assert\Length( [ 'min' => 6, 'minMessage' => 'Ваш проверочный пароль должен содержать не менее {{ limit }} символов', ] ); */ $assert_username = new Assert\IsTrue( [ 'message' => 'Имя пользователя уже используются' ] ); $assert_email = new Assert\IsTrue( [ 'message' => 'Адрес электронной почты уже используются' ] ); $assert_password = new Assert\IsTrue( [ 'message' => 'Ваш пароль не совпадает с паролем для подтверждения' ] ); $assert_username_email = new Assert\IsTrue( [ 'message' => 'Ваше имя пользователя не должно быть одинаковым с эл. почтой' ] ); $constraint = new Assert\Collection( [ 'username' => $assertUsername, 'email' => $assertEmail, 'password' => new Assert\Collection( [ 'first' => $assertPassword, 'second' => [], ] ), 'submit' => [], '_username' => $assert_username, '_email' => $assert_email, '_password' => $assert_password, '_username|email' => $assert_username_email ] ); $groups = new Assert\GroupSequence( [ 'Default', 'custom' ] ); return iterator_to_array ( $this -> app -> validator -> validate( $input, $constraint, $groups ) ); }