focuspro
@focuspro

Как исправить 2 ошибки «Undefined offset» и «Only variables» в коде?

Приветствую! Посмотрел в логе есть несколько ошибок, помогите исправить пожалуйста, спасибо!

error.log

[Sun Jan 27 08:42:09.476142 2019] [fcgid:warn] [pid 28535] mod_fcgid: stderr: PHP Notice: Only variables should be passed by reference in /var/www/mysite/data/www/mysite.io/core/Classes/Lang.php on line 90

[Sun Jan 27 08:42:09.476145 2019] [fcgid:warn] [pid 28535] mod_fcgid: stderr: PHP Notice: Undefined offset: 1 in /var/www/mysite/data/www/mysite.io/core/Classes/Router.php on line 97

[Sun Jan 27 08:42:18.984905 2019] [fcgid:warn] [pid 28533] mod_fcgid: stderr: PHP Notice: Undefined offset: 1 in /var/www/mysite/data/www/mysite.io/core/Classes/Router.php on line 29, referer: mysite.io/en/

[Sun Jan 27 08:42:18.984922 2019] [fcgid:warn] [pid 28533] mod_fcgid: stderr: PHP Notice: Undefined offset: 1 in /var/www/mysite/data/www/mysite.io/core/Classes/Router.php on line 97, referer: mysite.io/en/

[Sun Jan 27 08:42:26.384808 2019] [fcgid:warn] [pid 28531] mod_fcgid: stderr: PHP Notice: Undefined offset: 1 in /var/www/mysite/data/www/mysite.io/core/Classes/Router.php on line 29, referer: mysite.io/ru/

[Sun Jan 27 08:42:26.384831 2019] [fcgid:warn] [pid 28531] mod_fcgid: stderr: PHP Notice: Undefined offset: 1 in /var/www/mysite/data/www/mysite.io/core/Classes/Router.php on line 97, referer: mysite.io/ru/

Файл Router.php
protected function prepare()
 {
    $url = trim($this->server->get(static::SERVER_KEY), '/');
    @list($root, $query) = explode('?', $url);

    list($lang, $requestUrl) = explode('/', $root, 2); //line 29

    if($this->server->is('POST')) {
        $requestUrl = $lang;
    } else {
        if(in_array($lang, [Lang::LANG_RU, Lang::LANG_EN]) && $lang == config('language.default')) {
            header('Location: /' . $requestUrl);
            die;
        }

        if(
            !in_array($lang, [Lang::LANG_RU, Lang::LANG_EN])
        ) {
            $requestUrl = $url;
            $lang = config('language.default');
        }

        if(
            in_array($lang, [Lang::LANG_RU, Lang::LANG_EN])
            && $lang != lang()->lang()
        ) {
            lang()->setLanguage($lang);

            if($lang == config('language.default')) {
                header('Location: /' . $requestUrl);
            } else {
                header('Location: /' . lang()->lang() . '/' . $requestUrl);
            }

            die;
        }
    }

    $this->url = $requestUrl;
    $this->full_url = $url;
    $this->query = $query;
    $this->params = $this->parseQuery($query);
    $this->arguments = $this->parseArguments($url);
}



protected function parseArguments($url)
 {
    $segments = explode('/', $url);

    $data = [];
    foreach ($segments as $segment) {
        if(in_array($segment, [Lang::LANG_RU, Lang::LANG_EN])) { //line 97
            continue;
        }

        $data[] = $segment;
    }
    return $data;
}


Файл Lang.php

protected function parseFromRaw($raw)
{
$lang = array_shift(explode(',', $raw)); //line 90

return in_array($lang, array_keys($this->getLanguagesList()))
    ? $lang
    : $this->defaultLanguage();
}
  • Вопрос задан
  • 1301 просмотр
Решения вопроса 1
@Vitsliputsli
"PHP Notice: Only variables should be passed by reference in /var/www/mysite/data/www/mysite.io/core/Classes/Lang.php on line 90"
$lang = array_shift(explode(',', $raw))
исправьте на
$array=explode(',', $raw);
$lang = array_shift($array);
Дело в том, что array_shift не только возвращает элемент массива, но и изменяет оригинальный массив, поэтому данные в эту функцию нужно передавать по ссылке, а если вы не объявляли переменную, то будет передано значение, а не ссылка.

PHP Notice: Undefined offset: 1 in /var/www/mysite/data/www/mysite.io/core/Classes/Router.php on line 29, referer: mysite.io/en/
list($lang, $requestUrl) = explode('/', $root, 2);
Проверяете массив $root, вероятно после explode он имеет только один элемент, а необходио 2.
Пройдите это место дебаггером, и все сразу станет понятно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
amark
@amark
rush less, feel more
Для начала хочу отметить, что Notice — это не ошибка. Это всего лишь предупреждение.
Во вторых, похоже, что 29 строка может давать такую ошибку, если к скрипту обратились не так, как он ожидает.
Видимо, приходить должно "язык/запрос", а приходит "язык/_ничего_". Потому, list($lang, $requestUrl) выбрасывает нотификейшн на переменную $requestUrl.

Выведите себе для дебага содержимое переменной $root перед list'ом и проверьте, то ли приходит, что ожидает скрипт.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы