Сижу, работаю с фото галереей на своем сайте и вдруг замечаю, что перестали подгружаться фотографии. Откатил все изменения назад, но глюк не исчез – фотографии упорно не хотели подгружаться. Прошелся по ПХП скрипту, который осуществлял выдачу фоток – все в порядке, ошибок нет. Я попытался локализовать проблемную часть внезапно переставшего работать кода и понял, что проблема не в коде а в первой переменной «b» из УРЛа (пример: “http://mysite.com/script.php?b=123&q=456”). Переменная состоит всего из одного символа («Краткость – сестра таланта»). Я решил поменять название этой переменной с «b» на «bg» – хм, просто добавил символ, во всех участках кода, где эта переменная появлялась. И все вновь заработало! Если честно, то я так и не понял, почему первая одно символьная переменная из УРЛа, до этого работавшая нормально, вдруг перестала работать, и почему банальное изменение названия переменной устранило глюк :-\
Октябрь 3, 2008 в 9:50 пп |
Давай смотреть правде в глаза, что ты так и не разобрался в чем проблема. Поэтому твоя рекомендация, мягко говоря не научна. Поэтому чтобы не плодить заповеди, что кошерно, а что некошерно, предлагаю все же разобраться.
Что выдает phpinfo()? (он должен выдать все get-параметры в том числе)
Как ты обращаешься к b? ($_GET['b'] или просто $b)
Октябрь 6, 2008 в 5:54 пп |
2Евгений,
) ). Дело в том, что я ПХП не очень люблю – мне больше нравится С++, но так как почти все хостинги в качестве основного скриптового языка предлагают ПХП, а CGI программы на C++ позволяют использовать лишь единицы, то приходится подстраиваться:-(
Да, я действительно не разобрался, а точнее – не хотел разбираться в чем проблема. Все, что мне было нужно – это локализовать проблемное место и найти обходной путь («настоящие герои всегда идут в обход»
А фишки с ПХП «непонятками» – внешне выглядит как глюк, а копнешь глубже – оказывается это недокументированная фича
Более того, я знаю откуда такие «фичи» – некоторое время тому назад, Hostgator (мой хостер) ломанули через дырку в Контрольной Панели, ломанули глобально – кучу акаунтов. Пострадало очень много клиентов и репутация хостера. Теперь Hostgator довольно таки параноидально относится к безопасности и постоянно что-нибудь «подкручивает», вот из-за это и появляются то ли «баги», то ли «фичи».
Октябрь 8, 2008 в 10:02 дп |
Хочу знать, хотя бы, одну такую недокументированную фичу! До сих пор мануал помогал решить любую проблему.
Октябрь 8, 2008 в 4:37 пп |
По-поводу «фич»/»непоняток» (слово «глюк» не использую, потому что в PHP нельзя быть ни в чем до конца уверенным). Лично для меня странно то, почему один из двух одинаковых скриптов в которые передаются по две переменные, вдруг перестает «понимать» первую переменную. Ни с того ни с сего, вот просто перестал и все (второй скрипт все так же работает нормально). Почему при попытке вывести значение переменной выводится ее название, хотя раньше выводилось значение? Почему этот же скрипт нормально работает на домашнем веб-сервере и не работает на веб-сервере хостера? Я все время использовал переменные из урла напрямую ($var), почему я должен начинать использовать переменные через ассоциированный массив$_GET['var']?
Я не претендую на звание крутого PHP программиста, я всего лишь говорю о том, что пофигизм со стороны тех, кто разрабатывал PHP привел к множественным непонятным реакциям этого интерпретатора и дырам, которые до сих пор не закрыты, хотя о них знаю многие.
А вот очень хорошая обзорная статейка, которая характеризует PHP не с лучшей стороны:
http://www.xakep.ru/magazine/xa/110/068/1.asp
Октябрь 10, 2008 в 12:31 дп |
«Я все время использовал переменные из урла напрямую ($var), почему я должен начинать использовать переменные через ассоциированный массив$_GET['var']?»
Когда, Вы пишете $_GET['var'], то вы четко указываете, что Вас интересует параметр var, переданный методом GET, не через POST, не через COOKIES не каким-либо прочим методом. Если Ваш хостер разрешит сохранять параметры в простых переменных, типа $var, то он подвергнет риску Ваш код. В случае если Вы забудете проинициализировать переменную $var, то хакер через GET-параметр сможет это сделать за Вас любым удобным ему значением. Одно дело когда этот код Ваш и хакеру он недоступен, другое дело, если используется известный движок, наподобие WordPress.
Тут я замечу, что РНР как и любой другой продукт, существующий не один год имеет свою историю проб и ошибок. Даже хваленый С/С++ имеет конструкции, которые считаются устаревшими и нерекомендуемые к использованию. (Если быть чеснее, то первые программы на Си на современных компиляторах вообще не откомпилятся). Поэтому начинать изучать любой инструмент надо с современной литературой (2-3 года, это уже устаревшая).
За ссылку спасибо, кое-что нового из нее узнал. Однако, не ведитесь на то что это «кривой» РНР. Большая часть уязвимостей в статье является причиной криворукости кодера, например неосторожное использование eval.
Октябрь 10, 2008 в 9:37 дп |
А как по мне, так в ПХП удобнее использовать переменные напрямую – это легко.
И это позволяют делать следующие хостинги – Hostpro, Hvosting, Bizhost, Hostgator. А ведь это не неизвестные хостинги-однодневки, каждый из них уже несколько лет предоставляет услуги хостинга. Если они не блокируют возможность прямого доступа к переменным, то значит это оправдано.
Самой яркой застарелой конструкцией (инструкцией) в C++ является «goto». По крайней мере Мэтры программирования вообще не рекомендуют ее использовать так как код превращается в «спагетти». А некоторые вообще считают эту инструкцию гадостью от которой создатели компиляторов должны избавиться как можно быстрее. Но на то и дана людям свобода выбора, чтобы самим решать, что «плохо», а что «хорошо». Лично я увидел в этой архачиной инструкции пришедшей из Ассемблера великолепный инструмент, который я могу использовать в программировании. Инструкция «goto» легко и без лишних телодвижений позволяет выйти из нескольких вложенных циклов. Пара строк кода с «goto» избавляют от необходимости писать десятки, а то и сотни строк кода без «goto».
Октябрь 10, 2008 в 10:25 дп |
«А как по мне, так в ПХП удобнее использовать переменные напрямую – это легко.»
Вы невнимательно прочитали ссылку, которую сами же и привели. Хотите пользоваться так как Вам больше нравится, это Ваше право. А то что известные хостинги позволяют это делать, не значит, что те кто пользуются хостингом не запрещают это делать через .htaccess . Они скорее всего это разрешают, чтобы такие как Вы не кричали, какой у них плохой хостинг.
А мою мысль про устаревшие конструкции Вы не поняли. В РНР есть непродуманные места, но они есть в любом инструменте. Например в С сначало ввели понятие макросов, теперь вместо них рекомендуют использовать inline- и template- функции. Но ещё можно встретить в сети доку в которой будет рассказанно какой мощный инструмент define. Так же как и Вам, очевидно, попалась старая литература по РНР, в которой рассказывалось что переданные параметры можно получить напрямую…
Октябрь 10, 2008 в 10:29 дп |
В защиту goto скажу, что он полезен для автоматических генераторов кода на С. Например для переноса приложений с одной платформы на другую. Машинные коды можно представить в виде простейших команд на Си и перекомпилить на другой платформе (Естественно сэмулировав интерфейс старой платформы).
Октябрь 10, 2008 в 11:54 дп |
1. Каждый уникален и имеет свой стиль программирования. Я сам выбираю инструмент и путь(способ) реализации алгоритма.
2. Я правильно понял инфу по ссылке, которую вам указал. Я получил из нее достаточно необходимой информации, чтобы понять – существует куча-мала всякого разного в ПХП, что не документировано, на что не поставлено ударение о том как это _правильно_ использовать. ПХП выглядит опасным для использования в сколь-нибудь серьезных денежных проектах. Поэтому в таких проектах используется:
C++ – (Yandex, Google, Yahoo Stores), C (Loveplanet), Java/JSP (Nokia).
3. Лишь немногие ЛУЧШИЕ славянские хостинги предоставляют услуги на одинаково низком уровне – где-то чуть выше уровня плинтуса. Все остальные предоставляют услуги на уровне ниже плинтуса. Поэтому «кричать» о том, что хостинг плохой имеет право каждый – они действительно ВСЕ плохие (славянские). Поэтому я и начал переходить на зарубежные. Я не арендую выделенный сервер, я покупаю виртуальный хостинг, следовательно глобальной безопасностью, а точнее ее настройками, должен заниматься хостинг. Если хостинг разрешает что-то – я этим пользуюсь.
4. Инструкция «goto» – это устаревшая конструкция. Она более устаревшая нежели «define». Еще когда «define»-ами пользовались во всю, «goto» уже запрещали использовать.