Странность PHP

By bitonic

Сижу, работаю с фото галереей на своем сайте и вдруг замечаю, что перестали подгружаться фотографии. Откатил все изменения назад, но глюк не исчез – фотографии упорно не хотели подгружаться. Прошелся по ПХП скрипту, который осуществлял выдачу фоток – все в порядке, ошибок нет. Я попытался локализовать проблемную часть внезапно переставшего работать кода и понял, что проблема не в коде а в первой переменной  «b» из УРЛа (пример: “http://mysite.com/script.php?b=123&q=456”). Переменная состоит всего из одного символа («Краткость – сестра таланта»). Я решил поменять название этой переменной с «b» на «bg» – хм, просто добавил символ, во всех участках кода, где эта переменная появлялась. И все вновь заработало! Если честно, то я так и не понял, почему первая одно символьная переменная из УРЛа, до этого работавшая нормально, вдруг перестала работать, и почему банальное изменение названия переменной устранило глюк :-\

Метки: , , , ,

9 коммент. на “Странность PHP”

  1. Евгений:

    Давай смотреть правде в глаза, что ты так и не разобрался в чем проблема. Поэтому твоя рекомендация, мягко говоря не научна. Поэтому чтобы не плодить заповеди, что кошерно, а что некошерно, предлагаю все же разобраться.
    Что выдает phpinfo()? (он должен выдать все get-параметры в том числе)
    Как ты обращаешься к b? ($_GET['b'] или просто $b)

  2. bitonic:

    2Евгений,
    Да, я действительно не разобрался, а точнее – не хотел разбираться в чем проблема. Все, что мне было нужно – это локализовать проблемное место и найти обходной путь («настоящие герои всегда идут в обход» :) ) ). Дело в том, что я ПХП не очень люблю – мне больше нравится С++, но так как почти все хостинги в качестве основного скриптового языка предлагают ПХП, а CGI программы на C++ позволяют использовать лишь единицы, то приходится подстраиваться:-(

    А фишки с ПХП «непонятками» – внешне выглядит как глюк, а копнешь глубже – оказывается это недокументированная фича ;-) Более того, я знаю откуда такие «фичи» – некоторое время тому назад, Hostgator (мой хостер) ломанули через дырку в Контрольной Панели, ломанули глобально – кучу акаунтов. Пострадало очень много клиентов и репутация хостера. Теперь Hostgator довольно таки параноидально относится к безопасности и постоянно что-нибудь «подкручивает», вот из-за это и появляются то ли «баги», то ли «фичи».

  3. Евгений:

    Хочу знать, хотя бы, одну такую недокументированную фичу! До сих пор мануал помогал решить любую проблему.

  4. bitonic:

    По-поводу «фич»/»непоняток» (слово «глюк» не использую, потому что в PHP нельзя быть ни в чем до конца уверенным). Лично для меня странно то, почему один из двух одинаковых скриптов в которые передаются по две переменные, вдруг перестает «понимать» первую переменную. Ни с того ни с сего, вот просто перестал и все (второй скрипт все так же работает нормально). Почему при попытке вывести значение переменной выводится ее название, хотя раньше выводилось значение? Почему этот же скрипт нормально работает на домашнем веб-сервере и не работает на веб-сервере хостера? Я все время использовал переменные из урла напрямую ($var), почему я должен начинать использовать переменные через ассоциированный массив$_GET['var']?

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

    А вот очень хорошая обзорная статейка, которая характеризует PHP не с лучшей стороны:

    http://www.xakep.ru/magazine/xa/110/068/1.asp

  5. Евгений:

    «Я все время использовал переменные из урла напрямую ($var), почему я должен начинать использовать переменные через ассоциированный массив$_GET['var']?»
    Когда, Вы пишете $_GET['var'], то вы четко указываете, что Вас интересует параметр var, переданный методом GET, не через POST, не через COOKIES не каким-либо прочим методом. Если Ваш хостер разрешит сохранять параметры в простых переменных, типа $var, то он подвергнет риску Ваш код. В случае если Вы забудете проинициализировать переменную $var, то хакер через GET-параметр сможет это сделать за Вас любым удобным ему значением. Одно дело когда этот код Ваш и хакеру он недоступен, другое дело, если используется известный движок, наподобие WordPress.

    Тут я замечу, что РНР как и любой другой продукт, существующий не один год имеет свою историю проб и ошибок. Даже хваленый С/С++ имеет конструкции, которые считаются устаревшими и нерекомендуемые к использованию. (Если быть чеснее, то первые программы на Си на современных компиляторах вообще не откомпилятся). Поэтому начинать изучать любой инструмент надо с современной литературой (2-3 года, это уже устаревшая).

    За ссылку спасибо, кое-что нового из нее узнал. Однако, не ведитесь на то что это «кривой» РНР. Большая часть уязвимостей в статье является причиной криворукости кодера, например неосторожное использование eval.

  6. bitonic:

    А как по мне, так в ПХП удобнее использовать переменные напрямую – это легко. :) И это позволяют делать следующие хостинги – Hostpro, Hvosting, Bizhost, Hostgator. А ведь это не неизвестные хостинги-однодневки, каждый из них уже несколько лет предоставляет услуги хостинга. Если они не блокируют возможность прямого доступа к переменным, то значит это оправдано.
    Самой яркой застарелой конструкцией (инструкцией) в C++ является «goto». По крайней мере Мэтры программирования вообще не рекомендуют ее использовать так как код превращается в «спагетти». А некоторые вообще считают эту инструкцию гадостью от которой создатели компиляторов должны избавиться как можно быстрее. Но на то и дана людям свобода выбора, чтобы самим решать, что «плохо», а что «хорошо». Лично я увидел в этой архачиной инструкции пришедшей из Ассемблера великолепный инструмент, который я могу использовать в программировании. Инструкция «goto» легко и без лишних телодвижений позволяет выйти из нескольких вложенных циклов. Пара строк кода с «goto» избавляют от необходимости писать десятки, а то и сотни строк кода без «goto».

  7. Евгений:

    «А как по мне, так в ПХП удобнее использовать переменные напрямую – это легко.»
    Вы невнимательно прочитали ссылку, которую сами же и привели. Хотите пользоваться так как Вам больше нравится, это Ваше право. А то что известные хостинги позволяют это делать, не значит, что те кто пользуются хостингом не запрещают это делать через .htaccess . Они скорее всего это разрешают, чтобы такие как Вы не кричали, какой у них плохой хостинг.
    А мою мысль про устаревшие конструкции Вы не поняли. В РНР есть непродуманные места, но они есть в любом инструменте. Например в С сначало ввели понятие макросов, теперь вместо них рекомендуют использовать inline- и template- функции. Но ещё можно встретить в сети доку в которой будет рассказанно какой мощный инструмент define. Так же как и Вам, очевидно, попалась старая литература по РНР, в которой рассказывалось что переданные параметры можно получить напрямую…

  8. Евгений:

    В защиту goto скажу, что он полезен для автоматических генераторов кода на С. Например для переноса приложений с одной платформы на другую. Машинные коды можно представить в виде простейших команд на Си и перекомпилить на другой платформе (Естественно сэмулировав интерфейс старой платформы).

  9. bitonic:

    1. Каждый уникален и имеет свой стиль программирования. Я сам выбираю инструмент и путь(способ) реализации алгоритма.
    2. Я правильно понял инфу по ссылке, которую вам указал. Я получил из нее достаточно необходимой информации, чтобы понять – существует куча-мала всякого разного в ПХП, что не документировано, на что не поставлено ударение о том как это _правильно_ использовать. ПХП выглядит опасным для использования в сколь-нибудь серьезных денежных проектах. Поэтому в таких проектах используется:
    C++ – (Yandex, Google, Yahoo Stores), C (Loveplanet), Java/JSP (Nokia).
    3. Лишь немногие ЛУЧШИЕ славянские хостинги предоставляют услуги на одинаково низком уровне – где-то чуть выше уровня плинтуса. Все остальные предоставляют услуги на уровне ниже плинтуса. Поэтому «кричать» о том, что хостинг плохой имеет право каждый – они действительно ВСЕ плохие (славянские). Поэтому я и начал переходить на зарубежные. Я не арендую выделенный сервер, я покупаю виртуальный хостинг, следовательно глобальной безопасностью, а точнее ее настройками, должен заниматься хостинг. Если хостинг разрешает что-то – я этим пользуюсь.
    4. Инструкция «goto» – это устаревшая конструкция. Она более устаревшая нежели «define». Еще когда «define»-ами пользовались во всю, «goto» уже запрещали использовать.

Ответить