Как правильно расставить скобки при ошибке установки плагина?

Ссылка скопирована
PHP
1 ответ

Видимо при переходе на php8, получаю ошибку при установке очередного плагина:

Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)`

Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)`

Ругается на такой код, а именно на первую же строку:

$remote_addr = getenv('HTTP_CLIENT_IP')?getenv('HTTP_CLIENT_IP'): 			getenv('HTTP_X_FORWARDED_FOR')?getenv('HTTP_X_FORWARDED_FOR'): 			getenv('HTTP_X_FORWARDED')?getenv('HTTP_X_FORWARDED'): 			getenv('HTTP_FORWARDED_FOR')?getenv('HTTP_FORWARDED_FOR'): 			getenv('HTTP_FORWARDED')?getenv('HTTP_FORWARDED'):getenv('REMOTE_ADDR');

$remote_addr = getenv('HTTP_CLIENT_IP')?getenv('HTTP_CLIENT_IP'): getenv('HTTP_X_FORWARDED_FOR')?getenv('HTTP_X_FORWARDED_FOR'): getenv('HTTP_X_FORWARDED')?getenv('HTTP_X_FORWARDED'): getenv('HTTP_FORWARDED_FOR')?getenv('HTTP_FORWARDED_FOR'): getenv('HTTP_FORWARDED')?getenv('HTTP_FORWARDED'):getenv('REMOTE_ADDR');

Как правильно расставить скобки?
Сам не разберусь, с php не на «ты».
Спасибо!

Дополнительно:

Что ты хочешь получить? И причём тут ВП?

Ответы:

del
UPD

function some_plugin_name_get_remote_address() {   $remote_addr = getenv('HTTP_CLIENT_IP') ? getenv('HTTP_CLIENT_IP') :       (getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') :       (getenv('HTTP_X_FORWARDED') ? getenv('HTTP_X_FORWARDED') :       (getenv('HTTP_FORWARDED_FOR') ? getenv('HTTP_FORWARDED_FOR') :       (getenv('HTTP_FORWARDED')?getenv('HTTP_FORWARDED'):       getenv('REMOTE_ADDR')       ))));    $remote_addr = str_replace('for=', '', $remote_addr);    return $remote_addr; }

function some_plugin_name_get_remote_address() { $remote_addr = getenv('HTTP_CLIENT_IP') ? getenv('HTTP_CLIENT_IP') : (getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : (getenv('HTTP_X_FORWARDED') ? getenv('HTTP_X_FORWARDED') : (getenv('HTTP_FORWARDED_FOR') ? getenv('HTTP_FORWARDED_FOR') : (getenv('HTTP_FORWARDED')?getenv('HTTP_FORWARDED'): getenv('REMOTE_ADDR') )))); $remote_addr = str_replace('for=', '', $remote_addr); return $remote_addr; }

  • освежил знания с помощью доков. Первый варик не подходит.
  • Можно еще так
    $remote_addr = match(true) {     getenv('HTTP_CLIENT_IP')       => getenv('HTTP_CLIENT_IP'),     getenv('HTTP_X_FORWARDED_FOR') => getenv('HTTP_X_FORWARDED_FOR'),      getenv('HTTP_X_FORWARDED')     => getenv('HTTP_X_FORWARDED')     getenv('HTTP_FORWARDED_FOR')   => getenv('HTTP_FORWARDED_FOR')     getenv('HTTP_FORWARDED')       => getenv('HTTP_FORWARDED')     default                        => getenv('REMOTE_ADDR') };

    $remote_addr = match(true) { getenv('HTTP_CLIENT_IP') => getenv('HTTP_CLIENT_IP'), getenv('HTTP_X_FORWARDED_FOR') => getenv('HTTP_X_FORWARDED_FOR'), getenv('HTTP_X_FORWARDED') => getenv('HTTP_X_FORWARDED') getenv('HTTP_FORWARDED_FOR') => getenv('HTTP_FORWARDED_FOR') getenv('HTTP_FORWARDED') => getenv('HTTP_FORWARDED') default => getenv('REMOTE_ADDR') };

  • Осталось понять глубокий смысл всех этих эротических телодвижений. Независимо от синтаксиса
  • Ипатьев, да смысл-то понять несложно.
    Просто список неполный (а он вообще может быть полным?)

    у меня на одном из серверов ШЗ определяется только так

    function real_ip(): ?string {   if (array_key_exists('HTTP_X_REAL_IP', $_SERVER)) {     return $_SERVER['HTTP_X_REAL_IP'];   } else {     return $_SERVER['REMOTE_ADDR'];   } }

    function real_ip(): ?string { if (array_key_exists('HTTP_X_REAL_IP', $_SERVER)) { return $_SERVER['HTTP_X_REAL_IP']; } else { return $_SERVER['REMOTE_ADDR']; } }

    else добавлен на всякий случай, ip клиента всегда лежит в HTTP_X_REAL_IP.

  • Сергей delphinpro, я немного поторопился: в топике оказался сокращённый вариант функции. Не успел за временем редактирования, виноват.

    В общем, это функция в файле functions.php довольно несвежего плагина. Плагин однако нужен и именно в этой версии. Потому и грешу на изменения в php 8.1, на который был вынужден недавно перейти.

    Полный вариант функции выглядит так:

    function some_plugin_name_get_remote_address() { 	$remote_addr = getenv('HTTP_CLIENT_IP')?getenv('HTTP_CLIENT_IP'): 			getenv('HTTP_X_FORWARDED_FOR')?getenv('HTTP_X_FORWARDED_FOR'): 			getenv('HTTP_X_FORWARDED')?getenv('HTTP_X_FORWARDED'): 			getenv('HTTP_FORWARDED_FOR')?getenv('HTTP_FORWARDED_FOR'): 			getenv('HTTP_FORWARDED')?getenv('HTTP_FORWARDED'):getenv('REMOTE_ADDR');  	$remote_addr = str_replace('for=', '', $remote_addr);  	return $remote_addr; }

    function some_plugin_name_get_remote_address() { $remote_addr = getenv('HTTP_CLIENT_IP')?getenv('HTTP_CLIENT_IP'): getenv('HTTP_X_FORWARDED_FOR')?getenv('HTTP_X_FORWARDED_FOR'): getenv('HTTP_X_FORWARDED')?getenv('HTTP_X_FORWARDED'): getenv('HTTP_FORWARDED_FOR')?getenv('HTTP_FORWARDED_FOR'): getenv('HTTP_FORWARDED')?getenv('HTTP_FORWARDED'):getenv('REMOTE_ADDR'); $remote_addr = str_replace('for=', '', $remote_addr); return $remote_addr; }

    Ругается на строку

    $remote_addr = getenv('HTTP_CLIENT_IP')?getenv('HTTP_CLIENT_IP'):

    $remote_addr = getenv('HTTP_CLIENT_IP')?getenv('HTTP_CLIENT_IP'):

    (

    Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)`

    Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)`

    )

    Я уже адаптировал какое-то количество «старых» плагинов под php8. Опираясь на руководства из интернетов, само собой. Но этот что-то не могу победить. Варианты, предложенные вами, тоже не сработали. Может, судя по ругательству, всё-таки скобки?

  • Шигаев., ну скобки расставить дело нехитрое
    function some_plugin_name_get_remote_address() {   $remote_addr = getenv('HTTP_CLIENT_IP') ? getenv('HTTP_CLIENT_IP') :       (getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') :       (getenv('HTTP_X_FORWARDED') ? getenv('HTTP_X_FORWARDED') :       (getenv('HTTP_FORWARDED_FOR') ? getenv('HTTP_FORWARDED_FOR') :       (getenv('HTTP_FORWARDED')?getenv('HTTP_FORWARDED'):       getenv('REMOTE_ADDR')       ))));    $remote_addr = str_replace('for=', '', $remote_addr);    return $remote_addr; }

    function some_plugin_name_get_remote_address() { $remote_addr = getenv('HTTP_CLIENT_IP') ? getenv('HTTP_CLIENT_IP') : (getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : (getenv('HTTP_X_FORWARDED') ? getenv('HTTP_X_FORWARDED') : (getenv('HTTP_FORWARDED_FOR') ? getenv('HTTP_FORWARDED_FOR') : (getenv('HTTP_FORWARDED')?getenv('HTTP_FORWARDED'): getenv('REMOTE_ADDR') )))); $remote_addr = str_replace('for=', '', $remote_addr); return $remote_addr; }

  • Шигаев., то же самое
    function some_plugin_name_get_remote_address() {   $remote_addr = getenv('HTTP_CLIENT_IP')     ? getenv('HTTP_CLIENT_IP')     : (         getenv('HTTP_X_FORWARDED_FOR')           ? getenv('HTTP_X_FORWARDED_FOR')           : (               getenv('HTTP_X_FORWARDED')                 ? getenv('HTTP_X_FORWARDED')                 : (                     getenv('HTTP_FORWARDED_FOR')                       ? getenv('HTTP_FORWARDED_FOR')                       : (                           getenv('HTTP_FORWARDED')                             ? getenv('HTTP_FORWARDED')                             : getenv('REMOTE_ADDR')                         )                   )             )       );    $remote_addr = str_replace('for=', '', $remote_addr);    return $remote_addr; }

    function some_plugin_name_get_remote_address() { $remote_addr = getenv('HTTP_CLIENT_IP') ? getenv('HTTP_CLIENT_IP') : ( getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : ( getenv('HTTP_X_FORWARDED') ? getenv('HTTP_X_FORWARDED') : ( getenv('HTTP_FORWARDED_FOR') ? getenv('HTTP_FORWARDED_FOR') : ( getenv('HTTP_FORWARDED') ? getenv('HTTP_FORWARDED') : getenv('REMOTE_ADDR') ) ) ) ); $remote_addr = str_replace('for=', '', $remote_addr); return $remote_addr; }

  • вот так немного аккуратнее
    function some_plugin_name_get_remote_address() {   $remote_addr = getenv('HTTP_CLIENT_IP') ?: (     getenv('HTTP_X_FORWARDED_FOR') ?: (       getenv('HTTP_X_FORWARDED') ?: (         getenv('HTTP_FORWARDED_FOR') ?: (           getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR')         )       )     )   );    $remote_addr = str_replace('for=', '', $remote_addr);    return $remote_addr; }

    function some_plugin_name_get_remote_address() { $remote_addr = getenv('HTTP_CLIENT_IP') ?: ( getenv('HTTP_X_FORWARDED_FOR') ?: ( getenv('HTTP_X_FORWARDED') ?: ( getenv('HTTP_FORWARDED_FOR') ?: ( getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR') ) ) ) ); $remote_addr = str_replace('for=', '', $remote_addr); return $remote_addr; }

  • Сергей delphinpro, ура! Скобочки помогли!
    И снова выручаете. Спсибо.

Как правильно расставить скобки при ошибке установки плагина?

Тут надо не скобочьки расставлять, а весь это адов говнокод удалять. И оставить только
$remote_addr = getenv('REMOTE_ADDR');

  • а если getenv('REMOTE_ADDR') всегда возвращает 127.0.0.1?
    Или это не одно и то же, что и $_SERVER['REMOTE_ADDR'] ?
  • Сергей delphinpro, это одно и то же.
    если getenv('REMOTE_ADDR') всегда возвращает 127.0.0.1, то надо или нанять админа с прямыми руками, чтобы пробрасывал IP адрес нормально, или у админа же узнать конкретный заголовок, в который кладется IP клиента.
    А не перебирать все возможные НТТР заголовки, чтобы любой придурок мог вообще без труда подделать IP
  • Ипатьев, ну вот я и узнал конкретный заголовок. методом вардампа.
    то есть в моем случае косяк в том, что у админа кривые руки - либо неправильно пробросил, либо использовал не общепринятый параметр?
    (Админ - хостер)
  • Сергей delphinpro, ну вот так и надо всегда делать, указывать конкретный заголовок, если запрос приходит с конкретного апстрима. А не брать все подряд что попало
    причем лучше это делать сразу в конфиге
    set_real_ip_from  192.168.2.1; real_ip_header    X-Forwarded-For;

    set_real_ip_from 192.168.2.1; real_ip_header X-Forwarded-For;

    там правда специальный модуль почему-то для этого требуется

  • Ипатьев, уже пробовал подобные варианты. Тогда возвращает такое:
    Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($callback) must be a valid callback, function "some_plugin_name_create_folder" not found or invalid function name in site.comwp-includesclass-wp-hook.php:310 Stack trace: #0 site.comwp-includesclass-wp-hook.php(334): WP_Hook->apply_filters() #1 site.comwp-includesplugin.php(517): WP_Hook->do_action() #2 site.comwp-adminplugins.php(194): do_action() #3 {main} thrown in site.comwp-includesclass-wp-hook.php on line 310

    Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($callback) must be a valid callback, function "some_plugin_name_create_folder" not found or invalid function name in site.comwp-includesclass-wp-hook.php:310 Stack trace: #0 site.comwp-includesclass-wp-hook.php(334): WP_Hook->apply_filters() #1 site.comwp-includesplugin.php(517): WP_Hook->do_action() #2 site.comwp-adminplugins.php(194): do_action() #3 {main} thrown in site.comwp-includesclass-wp-hook.php on line 310

  • теперь вам надо исправлять эту ошибку
    хотя лично я бы просто выкинул этот кривой плагин на помойку
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Frontend-редакция Ответ

В PHP 8 нельзя писать цепочку вложенных тернарных операторов без скобок. Ваш код выбирает первый доступный IP из нескольких заголовков. Его можно переписать через нормальные скобки, но лучше вообще заменить на понятный цикл.

Вариант со скобками:

$remote_addr = getenv('HTTP_CLIENT_IP')
    ? getenv('HTTP_CLIENT_IP')
    : (getenv('HTTP_X_FORWARDED_FOR')
        ? getenv('HTTP_X_FORWARDED_FOR')
        : (getenv('HTTP_X_FORWARDED')
            ? getenv('HTTP_X_FORWARDED')
            : (getenv('HTTP_FORWARDED_FOR')
                ? getenv('HTTP_FORWARDED_FOR')
                : (getenv('HTTP_FORWARDED')
                    ? getenv('HTTP_FORWARDED')
                    : getenv('REMOTE_ADDR')))));

$remote_addr = getenv('HTTP_CLIENT_IP') ? getenv('HTTP_CLIENT_IP') : (getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : (getenv('HTTP_X_FORWARDED') ? getenv('HTTP_X_FORWARDED') : (getenv('HTTP_FORWARDED_FOR') ? getenv('HTTP_FORWARDED_FOR') : (getenv('HTTP_FORWARDED') ? getenv('HTTP_FORWARDED') : getenv('REMOTE_ADDR')))));

Но такой код всё равно плохо читается. Лучше так:

$headers = [
    'HTTP_CLIENT_IP',
    'HTTP_X_FORWARDED_FOR',
    'HTTP_X_FORWARDED',
    'HTTP_FORWARDED_FOR',
    'HTTP_FORWARDED',
    'REMOTE_ADDR',
];
 
$remote_addr = '';
 
foreach ($headers as $header) {
    $value = getenv($header);
    if (!empty($value)) {
        $remote_addr = $value;
        break;
    }
}

$headers = [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR', ]; $remote_addr = ''; foreach ($headers as $header) { $value = getenv($header); if (!empty($value)) { $remote_addr = $value; break; } }

Ещё важнее: заголовки HTTP_X_FORWARDED_FOR и похожие легко подделываются пользователем, если сервер не стоит за доверенным proxy. Для безопасности нельзя слепо считать их настоящим IP. Если сайт за Cloudflare/nginx/load balancer, нужно использовать только доверенный заголовок и только после настройки сервера.

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

После такой правки проверьте сайт на PHP 8 ещё раз: если плагин старый, следующая ошибка может быть в другом месте. Включите логирование, откройте страницу, где используется плагин, и посмотрите debug.log. Если ошибок много, дешевле заменить плагин, чем вручную адаптировать десятки устаревших конструкций.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно