За последние 24 часа нас посетили 55337 программистов и 1786 роботов. Сейчас ищут 1132 программиста ...

Undefined variable.. Замучал =(

Тема в разделе "PHP для новичков", создана пользователем Invision, 24 фев 2011.

  1. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Код:
    PHP:
    1.    if ( $input[0] == '/' && isset($input[1]) && $input[1] == '/' ) {
    2.       $url = 'http:' . $url;
    3.    }
    Иногда ругается так:

    Это значит $url пустое? Как поправить, проверкой на isset?
     
  2. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    хм , странно конечн
    может символ $ перед url где-то пропустил ?=))
     
  3. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Вообщем у меня анонимайзер и если вводить ссылку так:

    http://site.ru то все ок, если ввести просто site.ru то он поправляет на http://site.ru сам, но в логах пишет такую ошибку..
     
  4. NR55RU

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

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    не скажу про ссылку но вот это
    isset($input[1]) && $input[1] == '/'

    Фактически проверка на существование переменной трата ресурсов.
    Ты ее дальше проверяешь на соответствие символу, фактически две проверки одной переменой .. проверку на существование можно тупо выкинуть вообще.
    Ибо если переменной нет то и соответствовать символу она не будет.
     
  5. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Да. Да.
    Типа
    $url = isset($url) ? 'http://'.$url : '';
     
  6. NR55RU

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

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Да и ты бы привел более полный код как ссылка формируется а то согласной этой строке:

    $url = 'http:' . $url;

    видно что часть формирования ссылки отсутствует. Точнее $url где то еще задействована ибо // тут никак не светятся.
     
  7. NR55RU

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

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    MiksIr

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

    Поправь если я не прав.
     
  8. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    $url = 'http:' . $url;
    Слева до присваивания - не может быть пустая, а вот справа - вполне себе может быть пустая.
     
  9. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Дак это ведь одна переменная) я в 3-м посту написал как возникает
     
  10. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Какая разница, одна или нет. Объясняю на примере

    PHP:
    1.  
    2. if ($_POST['url']) {
    3.   $url = $_POST['url'];
    4. }
    5. ...
    6. $url = 'http://' . $url;
    7.  
    $url справа может быть неопределена, так как эта переменная определяется только в одном месте - внутри if-а, который может и не выполниться.
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Invision
    Написано дословно:
    PHP Notice: Undefined variable: url in /opt/lampp/htdocs/includes/init.php on line 529
    ПЫХЫПЫ ЗАМИЧАНИЙЕ: НЕОПРЕДЕЛЕННАЯ переменная урл

    из чего можно сделать ДВА вывода:
    1 - это не страшно, если ты спишь со спокойной совестью
    2 - определи, блин, уже эту переменнуй.

    Что это значит? В английском языке слово define означает "определять". но в данном контексте требуется не определить, а задать изначальное дефолтное значение исходя из разумной бесопасности кода и его стабильности. Напомнило анекдот про "спили мушку".

    Решение:
    PHP:
    1. <?
    2. $url = '';
    3. if ( $input[0] == '/' && isset($input[1]) && $input[1] == '/' ) {
    4.        $url = 'http:' . $url;
    5. }
    Для спортсменов:
    при задании первого же значения $url происходит обращение к значению $url, которого на данный момент еще нет. Как результат, компилятор жалуется, что мол кто-то косякнул, ибо ему сказано: присвой этой переменной значение той переменной, значение которой НЕ ОПРЕДЕЛЕНО. Он говорит, что в душе не ипет какое у нее значение и по причине того, что за тебя он додумать не может, ляпает туда пустую строку. В нормальном языке программирования компилятор тебя бы просто послал. Однако в среде пхп, где в лог никто не смотрит, а ошибки отключены, такое поведение считается нормальным. А зря =)
     
  12. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    igordata, спасибо тебе, ошибок вроде нет =)
    p.s А если выше переменная $url уже имела значение, она на пустую не поменяется?) Хотя это все в функции находится..
     
  13. Jampire

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

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    В корне неверно. Породит то же предупреждение "PHP Notice: Undefined variable".
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Охохо.... Область видимости внутри функции не позволит быть внешней переменной внутри функции. Т.е. переменная с таким же именем не получит "такого же" значения. Иначе бы все программисты умерли со страху, как же все их несчетные for($i... будут работать. С другой стороны удобно что все одинаковые for($i во всех функциях работают независимо :D

    но в функцию можно засунуть переменную через правильно узкое место () или через жопу