За последние 24 часа нас посетили 22680 программистов и 1043 робота. Сейчас ищут 625 программистов ...

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

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

  1. Евгений765

    Евгений765 Новичок

    С нами с:
    9 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    PHP:
    1. <?
    2. require 'dbconect.php';
    3. $login = filter_var(trim($_POST['login']),FILTER_SANITIZE_STRING);
    4. $pass = filter_var(trim($_POST['pass']),FILTER_SANITIZE_STRING);
    5. $pass2 = filter_var(trim($_POST['pass2']),FILTER_SANITIZE_STRING);
    6. if($pass !== $pass2){
    7.   echo "Пароли не совпалают";
    8.   exit();
    9. }
    10. $sql = "SELECT `login` FROM `users` WHERE `login` = '$login'";
    11. if($sql[`login`] == $login)  {
    12.   echo "Логин занят";
    13.   exit();
    14. }
    15. $pass = md5($pass);
    16. $pass2 = md5($pass2);
    17. $msql = new mysqli($servername, $username, $password, $database);
    18. $msql->query ("INSERT INTO `users` (`login`, `pass`, `pass2`) VALUES ('$login', '$pass', '$pass2')");
    19. echo "Регистрация успешна". " ". '<a href="http://localhost/mg/vhod.php">Войдите в игру</a>';
    20. $msql -> close();
     
    #1 Евгений765, 9 окт 2021
    Последнее редактирование модератором: 9 окт 2021
  2. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    87
    Симпатии:
    16
    В какой строке ошибку пишет? Учитесь корректно вопросы задавать... :eek:
     
  3. Евгений765

    Евгений765 Новичок

    С нами с:
    9 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    Warning: String offset cast occurred in C:\xampp\htdocs\mg\reg.php on line 12
    Регистрация успешна Войдите в игру
     
  4. Евгений765

    Евгений765 Новичок

    С нами с:
    9 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    В данном коде она как 11 считаеться
     
  5. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    856
    Симпатии:
    132
    Подозреваю, что в
    PHP:
    1. if($sql[`login`] == $login)  {
    Но телепаты в отпуске все, да.
     
  6. Евгений765

    Евгений765 Новичок

    С нами с:
    9 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    Да, именно в ней
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.821
    Симпатии:
    736
    Адрес:
    Татарстан
    Во первых, у вас $sql это строка, и пытаться там индексы проверять не надо
    Во вторых, от того что запрос записали в строку $sql, запрос не выполнится волшебным образом
    --- Добавлено ---
    Зачем пароль хранить два раза?????
     
  8. Евгений765

    Евгений765 Новичок

    С нами с:
    9 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    Мне нужно перевести в массив получается?
    По поводу пароля это код с формы регистрации
     
  9. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Что происходит а этом скрипте?

    Файл dbconnect.php вообще существует?
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.821
    Симпатии:
    736
    Адрес:
    Татарстан
    Нужно делать запрос к бд,, а не просто строку формировать. Посмотрите как вы делаете второй запрос на вставку.

    Один и тот же пароль зачем два раза хранить в бд?
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    Ё6аный Ад
    сцуко кавычкиии `
     
  12. Евгений765

    Евгений765 Новичок

    С нами с:
    9 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    да
    --- Добавлено ---
    У меня в регистрации идет пароль и подтверждение пароля
    Это каждый такой запрос нужно делать по форме как у меня на вставку идет?
    --- Добавлено ---
    Такие поставил потому что сравниваю информацию из базы данных с введенным полем
    Поправьте если не так делаю, я совсем не давно начал изучать PHP
     
  13. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.821
    Симпатии:
    736
    Адрес:
    Татарстан
    По большому счету - все не то.
    Прочитайте:
    - какие кавычки в php используются, в чем разница, где конкретно использовать обратный апостроф
    - как делать запросы к бд

    Логически подумайте, зачем хранить подтверждение пароля? Они же с паролем одинаковые!
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    @Евгений765
    Раздел для новичков еще не значит что для полных нулевых в знании синтаксиса.
     
    #14 MouseZver, 10 окт 2021
    Последнее редактирование: 10 окт 2021
  15. Евгений765

    Евгений765 Новичок

    С нами с:
    9 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    спасибо за совет
     
  16. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.821
    Симпатии:
    736
    Адрес:
    Татарстан
    @MouseZver добрее надо быть, терпимое. Ну реально новички же спрашивают...
    Для них пока нет разницы между кавычками...итд. Сам тоже стараюсь терпеть кажущиеся глупыми для нас продвинуты вопросов. Не знаю, насколько получается
     
  17. Евгений765

    Евгений765 Новичок

    С нами с:
    9 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    Да не просто это все , но вроде как решилась проблема и теперь все читается и сохраняется корректно
    Так же прислушался и убрал с БД и кода повтор пароля
    Но не усепл я обрадоваться как здравствуйте новая проблема

    Warning: Trying to access array offset on value of type null in C:\xampp\htdocs\mg\reg.php on line 14

    Почитав в интернете о ней , я кроме как менять версию PHP ничего не нашел , возможно есть какой другой способ.
    Проблема вот в этом куске кода

    Код (Text):
    1. <?
    2.  
    3. $msql = new mysqli($servername, $username, $password, $database);
    4. $result = $msql->query("SELECT * FROM `users` WHERE `login` = '$login'");
    5. $user = $result->fetch_assoc();
    6. if($user['login'] == $login) {
    7.  
    8. А именно ругается на последнюю строку
    9. [B][/B]
     
  18. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    87
    Симпатии:
    16
    Совсем тю-тю версию пхп менять? :eek:
    Ошибку надо устранить и всё.

    Попробуй в отдельном скрипте написать:

    Код (Text):
    1. $a = NULL;
    2. echo $a['somekey'];
    У тебя в $user приходит false, потому что запрос не выполняется или нулевой результат.
     
  19. Евгений765

    Евгений765 Новичок

    С нами с:
    9 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    Написал в отдельном скрипте , выдало такую же ошибку
    Да результат действительно нулевой ,так как в противном случае он не дает зарегистрировать пользователя
    Вот полный код
    Код (Text):
    1. <?
    2. <?php
    3. require 'dbconect.php';
    4. $login = filter_var(trim($_POST['login']),FILTER_SANITIZE_STRING);
    5. $pass = filter_var(trim($_POST['pass']),FILTER_SANITIZE_STRING);
    6. $pass2 = filter_var(trim($_POST['pass2']),FILTER_SANITIZE_STRING);
    7. if($pass !== $pass2){
    8.   echo "Пароли не совпадают";
    9.   exit();
    10. }
    11. $msql = new mysqli($servername, $username, $password, $database);
    12. $result = $msql->query("SELECT * FROM `users` WHERE `login` = '$login'");
    13. $user = $result->fetch_assoc();
    14. if($user['login'] == $login) {
    15.   echo "Логин занят". " ". '<a href="http://localhost/mg/index.php">Назад</a>';
    16.   exit();
    17. }
    18. $pass = md5($pass);
    19. $pass2 = md5($pass2);
    20. $msql = new mysqli($servername, $username, $password, $database);
    21. $msql->query ("INSERT INTO `users` (`login`, `pass`) VALUES ('$login', '$pass')");
    22. echo "Регистрация успешна". " ". '<a href="http://localhost/mg/vhod.php">Войдите в игру</a>';
    23. $msql -> close();
    24. ?>
     
  20. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    856
    Симпатии:
    132
    После
    PHP:
    1. $user = $result->fetch_assoc();
    добавьте
    PHP:
    1. var_dump($user);
    Учитесь уже отлаживать код и при размещении на форуме язык кода указывать )))
    И про ошибки указывайте строку и текст ошибки, почему каждый раз информацию выуживать надо?
     
  21. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.821
    Симпатии:
    736
    Адрес:
    Татарстан
    1. переведи переводчиком - Trying to access array offset on value of type null, запомни что такая ошибка возникает при попытке обратиться в массиве к несуществующему индексу
    2. чтоб не возникало ошибки, обычно применяют такое сравнение
    PHP:
    1. if(isset(($user['login']) && ($user['login'] == $login) )...
    3. в твоем случае, проверку на успешный запрос можно и нужно сделать еще раньше
    PHP:
    1. if ($user = $result->fetch_assoc()) {
    2.    if($user['login'] == $login) {
    3. ....
    P.S. и таки да - filter_var не гарантирует защиту от SQL иньекций, используйте real_escape_string, а еще лучше подготовленные запросы
     
  22. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    здесь ошибка. убери короткий открывающий тег

    Когда пользователь с указанным логином НЕ найден, переменная $user содержит null, а не массив! Так что причина ошибки понятна. Замени условие на if (!empty($user)) { например.
    Или просто if ($user) { :)
    --- Добавлено ---
    Справка по языку содержит всё необходимое.
    https://www.php.net/manual/ru/mysqli-result.fetch-assoc
    --- Добавлено ---
    Пользуйся отладкой. В любом непонятном случае сначала посмотри что именно находится в строке, где происходит ошибка. var_dump() может помочь, а ещё лучше xdebug и пошаговая отладка в PhpStorm или NetBeans.
    --- Добавлено ---
    @MouseZver ты конечно молодец, но пожалуйста, сдерживайся. Ты пугаешь людей.
    --- Добавлено ---
    @Евгений765 Как работает обратная кавычка ` (backtick) в коде PHP: https://www.php.net/manual/ru/language.operators.execution
    Не используй его в коде, только внутри строки!
    --- Добавлено ---
    Был запрос RFC о том чтобы исключить такой оператор из языка. Потому что он потенциально опасен и трудно обнаружим. Возможно RFC даже приняли в новой версии.
     
  23. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    @Евгений765, Запомни этот текст:

    Любой sql "SELECT" запрос после выполнения, перед использованием его результата - нужно проверить кол-во rows (строк):
    • были ли найдены строки на стороне "БД" и возвращены в результат "PHP инструмента Mysql"

    Для этого существует ( в mysqli ):
    PHP:
    1. if ( $result -> num_rows ) { ... }
    https://www.php.net/manual/ru/mysqli-result.num-rows.php#example-1482

    Для PDO инструмента:
    PHP:
    1. if ( $result -> rowCount() ) { ... }
    Советы с использованием isset и т.д. - эти чуваки не исправимы.
     
    KingdaKa нравится это.
  24. KingdaKa

    KingdaKa Новичок

    С нами с:
    7 сен 2021
    Сообщения:
    87
    Симпатии:
    16
    МышЗвэр меня опередил, надо юзать num_rows и только так! Никаких isset.
     
  25. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. //--------------- отдельный файл
    6. $connect = new PDO( 'mysql:host=localhost;dbname=pdo;charset=utf8', 'root', 'password' );
    7. //---------------
    8.  
    9.  
    10. //--------------- отдельный файл functions.php
    11. function getRequestValidation( string $method, array $atributes ): array
    12. {
    13.     $filter_map = [
    14.         'filter_default'        => FILTER_DEFAULT,
    15.         'filter_validate_int'    => FILTER_VALIDATE_INT,
    16.         'filter_validate_float' => FILTER_VALIDATE_FLOAT,
    17.         'filter_validate_email' => FILTER_VALIDATE_EMAIL,
    18.     ];
    19.  
    20.     $method_map = [
    21.         'get' => INPUT_GET,
    22.         'post' => INPUT_POST,
    23.     ];
    24.  
    25.     $method = strtolower ( $method );
    26.  
    27.     if ( ! isset ( $method_map[$method] ) )
    28.     {
    29.         throw new \InvalidArgumentException( "Неизвестный метод '{$method}' запроса" );
    30.     }
    31.  
    32.     if ( empty ( $atributes ) )
    33.     {
    34.         throw new \InvalidArgumentException( 'Второй аргумент функции \'getRequestValidation\' не должен содержать пустой массив' );
    35.     }
    36.  
    37.     $options = [];
    38.  
    39.     foreach ( $atributes AS $row )
    40.     {
    41.         $explode = explode ( '|', $row );
    42.      
    43.         if ( count ( $explode ) != 2 )
    44.         {
    45.             throw new \InvalidArgumentException( "Должно (имя ключа)|(имя фильтра), а получил - " . $row );
    46.         }
    47.      
    48.         [ $key, $filter ] = $explode;
    49.      
    50.         $filter = strtolower ( $filter );
    51.      
    52.         if ( ! isset ( $filter_map[$filter] ) )
    53.         {
    54.             throw new \InvalidArgumentException( "Неизвестный фильтр '{$method}'" );
    55.         }
    56.      
    57.         $options[$key] = $filter_map[$filter];
    58.     }
    59.  
    60.     $input = filter_input_array ( $method_map[$method], $options );
    61.  
    62.     $errors = [];
    63.  
    64.     if ( empty ( $input ) )
    65.     {
    66.         $errors['*']['method'] = "Неудачный запрос";
    67.     }
    68.     else
    69.     {
    70.         foreach ( $input AS $key => $value )
    71.         {
    72.             if ( is_bool ( $value ) )
    73.             {
    74.                 $errors['*'][$key] = $key . ' - No valid value';
    75.             }
    76.          
    77.             if ( is_null ( $value ) )
    78.             {
    79.                 $errors['*'][$key] = $key . ' - Not found';
    80.             }
    81.         }
    82.     }
    83.  
    84.     if ( empty ( $errors ) )
    85.     {
    86.         return $input;
    87.     }
    88.  
    89.     $errors['err'] = true;
    90.  
    91.     return $errors;
    92. }
    93. //---------------
    94.  
    95.  
    96.  
    97. $request = getRequestValidation( 'POST', [
    98.     'login|FILTER_DEFAULT',
    99.     'pass|FILTER_DEFAULT',
    100.     'pass2|FILTER_DEFAULT',
    101. ] );
    102.  
    103. if ( isset ( $request['err'] ) )
    104. {
    105.     echo implode ( '<br>', $request['*'] );
    106.  
    107.     exit;
    108. }
    109.  
    110. if ( $request['pass'] != $request['pass2'] )
    111. {
    112.     echo 'Пароли не совпадают';
    113.  
    114.     exit;
    115. }
    116.  
    117. $stmt = $connect -> prepare( 'SELECT `id` FROM `users` WHERE `login` = ?' );
    118.  
    119. $stmt -> execute( [ $request['login'] ] );
    120.  
    121. if ( $stmt -> rowCount() )
    122. {
    123.     echo 'Логин занят';
    124.  
    125.     exit;
    126. }
    127.  
    128. $stmt = $connect -> prepare( 'INSERT INTO `users` ( `login`, `pass` ) VALUES ( ?,? )' );
    129.  
    130. $stmt -> execute( [ $request['login'], password_hash ( $request['pass'] ) ] );