За последние 24 часа нас посетили 22529 программистов и 1040 роботов. Сейчас ищут 615 программистов ...

Пытаюсь сделать проверку на повтор Логина . При этом выдаеться ошибка String offset cast occurred in

Тема в разделе "PHP для новичков", создана пользователем Евгений765, 9 окт 2021.

  1. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    $filter
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Да что ты говоришь! :)

    А можно мы продолжим использовать более лаконичные и логичные конструкции, расчитывающие на пусто/не пусто? Или прям обязательно знать количество?

    PHP:
    1. $result = $mysqli->query($query);
    2. while ($row = $result->fetch_assoc()) {
    Вместо while может быть if, если мы знаем что строка будет одна или ни одной.
     
    #27 artoodetoo, 12 окт 2021
    Последнее редактирование: 12 окт 2021
  3. Sviridov

    Sviridov Новичок

    С нами с:
    22 сен 2021
    Сообщения:
    24
    Симпатии:
    4
    А еще лучше ORM :)
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    Смешно.
    PHP:
    1. $result = запрос на поиск юзера...
    2.  
    3. while ( $result -> fetch_носок )
    4. {
    5.     юзер найден..
    6. }
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    если ты видишь это так, это действительно смешно. но никто в этом не виноват :)
    --- Добавлено ---
    носок хахаха.
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Именно так, если данные пользователя нужны. Только не while, а if, о чем тебе выше написали.
     
  7. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    А чем while не устраиваает?
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    В данном месте больше в тему if. Но маус ухватился за вайл, игнорируя примечание. Потому что так смешнее.
    --- Добавлено ---
    Если сформулировать цель проверки по русски, то это "если существует пользователь с таким логином". А теперь выразим это на php + mysqli:
    По маусу там надо необходимо (!) считать количество строк. А я говорю что достаточно знать что такая строка существует.
    Мы все в какой-то мере в плену стереотипов и прошлого опыта. Если это признать, то будет легче учиться.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Я согласен, что в конкретном примере нам вообще незачем получать юзера. Но я также понимаю что запрос уже выполнен драйвером mysql и без этого не сработал бы num_rows. Не получится тут сэкономить. Поэтому категоричность "только так и так надо всегда" меня позабавила. Можно по-всякому.

    Надеюсь топикстартер понял в чём его ошибка, только это важно в нашем обсуждении.
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    Я отлично осознаю свою ошибку, поэтому промолчу. Но сейчас, когда нужно узнать "был ли найден юзер" стоит использовать подсчет rows
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Запрос, кстати можно изменить до "select 1 from `users` where `login`=:login limit 1" что только подчеркнёт, что нам не нужны данные пользователя, а только сам факт наличия такого пользователя. В остальном всё также.
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    Это уже не велосипед, а пи3дец
    --- Добавлено ---
    Есть случай когда идет поиск никнейма или email (в обоих случаях уникальны) и вот тогда тут играет роль уже не подсчет rows
    PHP:
    1.     public function validator( array $input, User $user ): array
    2.     {
    3.         $input['_username|email'] = $input['_username'] = $input['_email'] = $input['_password'] = true;
    4.      
    5.         if ( strcmp ( $model -> getFirstPassword(), $model -> getSecondPassword() ) != 0 )
    6.         {
    7.             $input['_password'] = false;
    8.         }
    9.      
    10.         if ( strcmp ( mb_strtolower ( $user -> getUsername() ), $user -> getEmail() ) == 0 )
    11.         {
    12.             $input['_username|email'] = false;
    13.         }
    14.      
    15.         // Поиск username или email
    16.         $select = $this -> app -> repository
    17.             -> get( 'query.database.select.users_username|email' )( $user -> getUsername(), $user -> getEmail() );
    18.      
    19.         foreach ( $select -> getAll() AS $result )
    20.         {
    21.             if ( strcmp ( mb_strtolower ( $user -> getUsername() ), mb_strtolower ( $result -> username ) ) == 0 )
    22.             {
    23.                 $input['_username'] = false;
    24.             }
    25.          
    26.             if ( strcmp ( $user -> getEmail(), $result -> email ) == 0 )
    27.             {
    28.                 $input['_email'] = false;
    29.             }
    30.         }
    31.      
    32.         $assertUsername = [
    33.             new Assert\Length( [
    34.                 'min' => 3, 'max' => 50,
    35.                 'minMessage' => 'Ваше имя пользователя должно содержать не менее {{ limit }} символов',
    36.                 'maxMessage' => 'Ваше имя пользователя не может быть длиннее {{ limit }} символов'
    37.             ] ),
    38.             new Assert\Regex( [
    39.                 'pattern' => '/^\w+$/ui',
    40.                 'message' => 'Имя пользователя может содержать только [A-Za-z0-9_] символы',
    41.             ] )
    42.         ];
    43.      
    44.         $assertEmail = [
    45.             new Assert\Email( [ 'message' => 'Неверный адрес электронной почты' ] ),
    46.             new Assert\NotBlank( [ 'message' => 'Адрес электронной почты не должен быть пустой' ] )
    47.         ];
    48.      
    49.         $assertPassword = new Assert\Length( [
    50.             'min' => 10,
    51.             'max' => 100,
    52.             'minMessage' => 'Ваш пароль должен содержать не менее {{ limit }} символов',
    53.             'maxMessage' => 'Ваш пароль превышает {{ limit }} символов',
    54.         ] );
    55.      
    56.         /* $assertConfirmPassword = new Assert\Length( [
    57.             'min' => 6,
    58.             'minMessage' => 'Ваш проверочный пароль должен содержать не менее {{ limit }} символов',
    59.         ] ); */
    60.      
    61.         $assert_username = new Assert\IsTrue( [ 'message' => 'Имя пользователя уже используются' ] );
    62.      
    63.         $assert_email = new Assert\IsTrue( [ 'message' => 'Адрес электронной почты уже используются' ] );
    64.      
    65.         $assert_password = new Assert\IsTrue( [ 'message' => 'Ваш пароль не совпадает с паролем для подтверждения' ] );
    66.      
    67.         $assert_username_email = new Assert\IsTrue( [ 'message' => 'Ваше имя пользователя не должно быть одинаковым с эл. почтой' ] );
    68.      
    69.      
    70.         $constraint = new Assert\Collection( [
    71.             'username' => $assertUsername,
    72.             'email' => $assertEmail,
    73.             'password' => new Assert\Collection( [
    74.                 'first' => $assertPassword,
    75.                 'second' => [],
    76.             ] ),
    77.             'submit' => [],
    78.             '_username' => $assert_username,
    79.             '_email' => $assert_email,
    80.             '_password' => $assert_password,
    81.             '_username|email' => $assert_username_email
    82.         ] );
    83.      
    84.         $groups = new Assert\GroupSequence( [ 'Default', 'custom' ] );
    85.      
    86.         return iterator_to_array ( $this -> app -> validator -> validate( $input, $constraint, $groups ) );
    87.     }