За последние 24 часа нас посетил 22531 программист и 1276 роботов. Сейчас ищут 765 программистов ...

Ошибка при регистрации

Тема в разделе "Laravel", создана пользователем lordconst, 18 апр 2020.

  1. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Прочитал в документации, что доп.поля при регистрации можно добавить в контроллере RegisterController, так и сделал:
    PHP:
    1. protected function create(array $data)
    2.     {
    3.         return User::create([
    4.             'name' => $data['name'],
    5.             'email' => $data['email'],
    6.             'password' => Hash::make($data['password']),
    7.             'IP-address' => $_SERVER['REMOTE_ADDR'],
    8.         ]);
    9.     }
    Конкретно - добавил дополнительное поле IP-address (разумеется, в базе оно тоже есть). Однако почему-то при нажатии кнопки регистрации выдает ошибку: SQLSTATE[HY000]: General error: 1364 Field 'IP-address' doesn't have a default value. Перевести я ее могу, но не понимаю почему не работает добавленная строчка $_SERVER['REOTE_ADDR']
    Что-то не так делаю?
     

    Вложения:

  2. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Ну и вдогонку вопрос: после выполнения команды php artisan make:auth я изменил строку @extends('layouts.app') на @extends('layouts.layout'), чтобы страницы входа и регистрации были внутри контейнера. А теперь смотрю этот файл app и возник вопрос не сломается ли что-нибудь в механизме регистрации и авторизации? Может что-то важное было в app, а я поменял на свой шаблон
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    Ну для начала название для поля диковатое.,..
    Обычно ip_sddres, ipAddres имена..
    У вас поле nullable ?
    Вы уверены что в
    Код (Text):
    1. $_SERVER['REMOTE_ADDR'],
    что то есть? Проверьте
     
  4. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Зачем делать его nullable? У пользователя не может быть айпи вообще?
    А почему там не должно чего-то быть? Это же элемент из суперглобального массива. Или в laravel не действуют общие правила php?
     
  5. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    Laravel тут не при чём. Некоторые элементы суперглобальных массивов создаются из заголовков. А заголовки можно не передать или передать поддельные. Конкретно $_SERVER['REMOTE_ADDR'] может не быть или быть поддельным. А ещё это всё может быть изменено на этапе проксирования между веб-серверами правилами проксирования.
    Для более работающего определения IP используй что-то вроде
    PHP:
    1. function getIp() {
    2.   $keys = [
    3.     'HTTP_CLIENT_IP',
    4.     'HTTP_X_FORWARDED_FOR',
    5.     'REMOTE_ADDR'
    6.   ];
    7.   foreach ($keys as $key) {
    8.     if (!empty($_SERVER[$key])) {
    9.       $ip = trim(end(explode(',', $_SERVER[$key])));
    10.       if (filter_var($ip, FILTER_VALIDATE_IP)) {
    11.         return $ip;
    12.       }
    13.     }
    14.   }
    15. }
    16.  
    17. $ip = getIp();
     
  6. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Такую ошибку выдает на 11 строке: Only variables should be passed by reference
    Итоговый код такой:
    PHP:
    1. protected function create(array $data)
    2.     {
    3.         function getIp() {
    4.             $keys = [
    5.                 'HTTP_CLIENT_IP',
    6.                 'HTTP_X_FORWARDED_FOR',
    7.                 'REMOTE_ADDR'
    8.             ];
    9.             foreach ($keys as $key) {
    10.                 if (!empty($_SERVER[$key])) {
    11.                     $ip = trim(end(explode(',', $_SERVER[$key])));
    12.                     if (filter_var($ip, FILTER_VALIDATE_IP)) {
    13.                         return $ip;
    14.                     }
    15.                 }
    16.             }
    17.         }
    18.         $ip = getIp();
    19.         return User::create([
    20.             'name' => $data['name'],
    21.             'email' => $data['email'],
    22.             'password' => Hash::make($data['password']),
    23.             'IP-address' => $ip,
    24.         ]);
    25.     }
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @lordconst, отладчиком пользуетесь? Посмотрите, в каком поле у вас IP.

    И не называйте так поля, для eloquent лучше, чтоб названия полей были сформированы по правилам идентификаторов PHP
     
  8. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    можно объяснить недалекому, как посмотреть?)
    А как тогда лучше назвать?
     
  9. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    ... что делать-то?)
     
  10. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Означает, что ожидается явным образом заданная переменная, а не промежуточный результат вызова функции.
    Из используемых в 11-й строке - это функция end().
    То есть надо сначала результат выполнения функции explode() присвоить какой-нибудь переменной и уже её использовать в качестве аргумента функции end().