Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Zend выдает ошибку 
V
    Опции темы
mustafallah
Дата 8.7.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.3.2008

Репутация: 1
Всего: 1



Ф-ция выполняется нормально, а Zend при анализе выдает ошибку.
Как ее исправить?
Цитата


  • В функции get_ip() одновременно используются return co значением и без (строка 25)
  • Возвращаемое значение функции get_ip() использовано, но управление доходит до конца функции без возвращения значения в C:\WebServers\home\localhost\www\lp\tests\reg\functions.php(25) (строка 26)



Код

<?
error_reporting(E_ALL);
function get_ip () {
    if (false  !== ($ip = getenv("HTTP_CLIENT_IP"))) {
        return $ip;
    }
    if (false !== ($ip = getenv("HTTP_X_FORWARDED_FOR"))) {
        if ($ip == '' || $ip == "unknown") {
            return $ip;
        }
    }
    if (false !== ($ip = getenv("REMOTE_ADDR"))) {
        return $ip;
    }
}
echo get_ip();
?>

PM MAIL   Вверх
Glip
Дата 8.7.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18



похоже на то, что оно хочет один return 


--------------------
user posted image
PM MAIL   Вверх
gta4kv
Дата 8.7.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Оно хочет return в конце функции.
И возвращаемое значение не может быть пустым.

Это сообщение отредактировал(а) gta4kv - 8.7.2008, 16:12
PM MAIL   Вверх
mustafallah
Дата 8.7.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.3.2008

Репутация: 1
Всего: 1



Ясно, ну и хрен с ним, с этим Zend'ом.
PM MAIL   Вверх
SamDark
Дата 8.7.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 10
Всего: 38



Код

error_reporting(E_ALL);
function get_ip () {
    if (false  !== ($ip = getenv("HTTP_CLIENT_IP"))) {
        return $ip;
    }
    if (false !== ($ip = getenv("HTTP_X_FORWARDED_FOR"))) {
        if ($ip == '' || $ip == "unknown") {
            return $ip;
        }
    }
    if (false !== ($ip = getenv("REMOTE_ADDR"))) {
        return $ip;
    }
    return null;
}
echo get_ip();


Это сообщение отредактировал(а) SamDark - 8.7.2008, 17:09


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Sannis
Дата 8.7.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

Репутация: 6
Всего: 13



В настройках можно указать, какие ситуации будут считаться ошибками и вызывать предупреждения IDE.


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
Feldmarschall
Дата 8.7.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



mustafallah, эта функция сама по себе неправильная.
везде, где она встречается, вместо get_ip() напиши $_SERVER['REMOTE_ADDR']

Это сообщение отредактировал(а) Feldmarschall - 8.7.2008, 17:48
PM   Вверх
sTa1kEr
Дата 8.7.2008, 21:17 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(Feldmarschall @  8.7.2008,  18:46 Найти цитируемый пост)
везде, где она встречается, вместо get_ip() напиши $_SERVER['REMOTE_ADDR']

Иногда ваша уверенность в правоте, без знаний реализации, просто поражает. Или же вы не знаете кто и зачем высылает хидер X-Forwarded-For? Или же считаете, что единственная причина проверки этих заголовков - это определение "подмененного" IP?


Цитата(gta4kv @  8.7.2008,  17:11 Найти цитируемый пост)
Оно хочет return в конце функции.
И возвращаемое значение не может быть пустым.

Не совсем так. Во первых, если в конце функции нету return-а, то это равносильно тому, что в конце стоит стоит return без значения
Код

function a()
{
   // ...
   return;
}

Если функция должна возвращать какое-либо значение (к примеру, какой-либо getter), то любой return должен что либо возвращать. Если же функция ничего не должна возвращать (setter), то любой return должен быть без значения. Об этом и говорит первый ворнинг.

Второй ворнинг говорит о том, что есть логические цепочки при которых return не встретится совсем (если все значения будут равны false), что логически тоже не правильно. Однако именно в конце ставить return не обязательно. Пример
Код

function get_ip () {
    if (false  !== ($ip = getenv("HTTP_CLIENT_IP"))) {
        return $ip;
    }
    else if (false !== ($ip = getenv("HTTP_X_FORWARDED_FOR"))) {
        if ($ip == '' || $ip == "unknown") {
            return $ip;
        }
    else {
        return getenv("REMOTE_ADDR");
    }
    // Далее до конца функции код ни когда не будет выполнен
    // ...
}

В этом случае ворнига быть не должно, т.к. какое-либо значение будет возвращено в любом случае.

Цитата(mustafallah @  8.7.2008,  17:05 Найти цитируемый пост)
        if ($ip == '' || $ip == "unknown") {
            return $ip;

Вы уверены, что здесь IP должен быть именно равен пустой строке или "unknown"? 
PM MAIL   Вверх
Feldmarschall
Дата 8.7.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Его-то чего спрашивать? Как будто он этот код писал =)

По поводу знаний реализации.  Можно поконкретнее сформулировать претензию?
Я редко пишу на темы, в которых не разбираюсь.
Судя по всему, речь идет о некой гипотетической ситуации, в которой этот анекдотичный код окажется предпочтительнее REMOTE_ADDR. С удовольствием послушаю.

Вообще-то, вопрос определения IP адреса уже несколько набил оскомину. Я прекрасно помню, что на этом форуме есть фееричный топик, в котором лучшие умы несколько лет сочиняли идеальный алгоритм этой нетривиальной операции. И чуть не лопнули от возмущения, когда им сообщили, что все их старания - бессмысленная туфта.
Давайте уже как-нибудь проведем ликбез, напишем фак, и закроем этот вопрос.

Это сообщение отредактировал(а) Feldmarschall - 8.7.2008, 22:19
PM   Вверх
skyboy
Дата 8.7.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



sTa1kEr, можно, я подключусь?
даже если абстрагироваться от того, зачем человеку нужны данные, полученные от клиента. которым по определению верить нельзя ни для авторизации, ни для блокировки(впрочем, возможно, блок по ip в некоторых случаях может быть необходимым решением - например, в случае DoS - но тогда уж лучше на уровне iptables блокировать). даже если абстрагироваться от того, что если отбросить авторизацию, то ip человеку может пригодиться для статистики, но тогда бы человек выбирал не одно из значений заголовков, а все мало-мальски похожее на ip или даже хранил бы весь набор пришедших header'ов. даже если.
в X-Forwarded-For должны быть ip всех узлов-прокси, через которые прошли данные(кстати, не факт, что прокси-таки дописывают собственные адреса). соотвественно, человек своей функцией получает строку с запятыми, а не одно значение.
и потом: в идеальном случае(клиент не подделывает данные, прокси добавляют адреса как надо) часто адресом клиента будет... внутренний адрес в сети(класса А или С). и только вторым - адрес шлюза провайдера, который, в принципе, имело бы смысл учитывать в статистике, если бы могли быть уверены, что адрес шлюза не третий и не четвертый. потому если уж хранить - то все, что похоже на ip. а если уж позарез надо одно-единственное значение, то имеет смысл обращаться к REMOTE_ADDR, молясь встретить там корректный ip последнего пройденного http-прокси или адрес клиента при наличии прямого IP.

PM MAIL   Вверх
sTa1kEr
Дата 9.7.2008, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(Feldmarschall @  8.7.2008,  23:08 Найти цитируемый пост)
Можно поконкретнее сформулировать претензию?

Попробую. Навязывать свое "единственно правильное" решение там, где нету даже малейшего представления что за скрипт, для чего и где он используется. Вы бы уж лучше ссылку кинули на топик с обсуждением. Если человек не глупый, то сам поймет где собака зарыта.
Цитата(Feldmarschall @  8.7.2008,  23:08 Найти цитируемый пост)
Судя по всему, речь идет о некой гипотетической ситуации, в которой этот анекдотичный код окажется предпочтительнее REMOTE_ADDR. С удовольствием послушаю.

Именно этот кусок отдельно? - Вряд-ли, даже если бы в нем не было ошибок.
Заголовок X-Forwarded-For? - Легко. Когда отправитель заголовка известен, либо его надежность подтверждена в достаточной степени для текущей задачи.

Цитата(Feldmarschall @  8.7.2008,  23:08 Найти цитируемый пост)
Вообще-то, вопрос определения IP адреса уже несколько набил оскомину.

Вы не под тем углом смотрите, вопрос не в определении IP адреса.

Цитата(Feldmarschall @  8.7.2008,  23:08 Найти цитируемый пост)
Давайте уже как-нибудь проведем ликбез, напишем фак, и закроем этот вопрос.

Согласен, надо уже поставить все точки над и.

Цитата(skyboy @  8.7.2008,  23:23 Найти цитируемый пост)
которым по определению верить нельзя ни для авторизации, ни для блокировки

Как можно утверждать, что данным нельзя верить по определению, не зная о каком отправителе идет речь? Может я их себе через loopback шлю, тогда им по определению можно верить.

Цитата(skyboy @  8.7.2008,  23:23 Найти цитируемый пост)
в X-Forwarded-For должны быть ip всех узлов-прокси, через которые прошли данные(кстати, не факт, что прокси-таки дописывают собственные адреса). соотвественно, человек своей функцией получает строку с запятыми, а не одно значение.

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

Прошу прощенья, но дальше уже совсем ерундистика пошла, не имеющая отношение к делу. Но все же на пару моментов отвечу.

Цитата(skyboy @  8.7.2008,  23:23 Найти цитируемый пост)
часто адресом клиента будет... внутренний адрес в сети(класса А или С)

В единственном возможном случае, если сам прокси сервер находится в этой же подсети, что и пользователь. 

Цитата(skyboy @  8.7.2008,  23:23 Найти цитируемый пост)
что адрес шлюза не третий и не четвертый

Крайне сомневаюсь, что существуют интернет шлюзы, которые бы использовали NAT маршрутизацию.
PM MAIL   Вверх
skyboy
Дата 9.7.2008, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(sTa1kEr @  9.7.2008,  01:54 Найти цитируемый пост)
Может я их себе через loopback шлю, тогда им по определению можно верить.

для того, чтоб определить "127.0.0.1" надо писать специальную функцию? так что, почему тогда нельзя работать с REMOTE_ADDR?
Цитата(sTa1kEr @  9.7.2008,  01:54 Найти цитируемый пост)
Прошу прощенья, но дальше уже совсем ерундистика пошла

ок. вполне допускаю, что "зажрался", стал "считать себя самым умным" и т.д. но, будь добр, все же укажи на фактически и/или логические ошибки. тебе ведь нетрудно віделить цитатой определенній участок и заявить: "ошибка здесь". не трудно ведь?
Цитата(sTa1kEr @  9.7.2008,  01:54 Найти цитируемый пост)
В единственном возможном случае, если сам прокси сервер находится в этой же подсети, что и пользователь. 

я имел в виду конкретніе диапазоны - те, которые используются для адресации в локальных сетях(10.0.0.0/8 и 192.168.0.0/16). не знаю, как у вас, а у нас практически все провайдеры(кроме варианта с ADSL) используюся вариант с использованием шлюза: от операторов кабельного ТВ до операторов мобильной связи.
Что хотел мне сказать ты, учитывая, что прокси первого уровня просто обязан находиться в одной сети с пользователем(в случае, если не применяется шлюз, но по большому счету - это почти то же прокси, только не HTTP) я не понял.
все же, надеюсь, ты укажешь мне, где я заблуждаюсь.
PM MAIL   Вверх
skyboy
Дата 9.7.2008, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(sTa1kEr @  9.7.2008,  01:54 Найти цитируемый пост)
вопрос не в определении IP адреса

в смысле фунцкия с именем get_ip применяется для чего-то другого?

PM MAIL   Вверх
Feldmarschall
Дата 9.7.2008, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



А. Так это просто придирка в стиле пхп-форумов. 
Жаль.
PM   Вверх
skyboy
Дата 9.7.2008, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(sTa1kEr @  9.7.2008,  01:54 Найти цитируемый пост)
Может я их себе через loopback шлю

кстати, я не говорил только про намеренное искажение и подлог. вот например, данные из формы прийдут:ты сразу возьмешь и без проверки вставишь текстовое значение в поле в БД числового типа? даже без проверки и приведения типа? ну, это ж loopback. данным можно доверять smile или я путаю теплое с мягким и заголовки приходят не от пользователя?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.