Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function process_template() {
extract(); // выводим переменные в область видимости функции!
include (Message.php) // Подключаем вывод компонента
}
Когда хотят добиться патча, обычно пишут не на Хабр, а разработчику — и получают и патч, и благодарности.Это необычный случай. Разработчикам пофиг.
Господа, которые пишут про то, что кучу раз сообщали о куче багов и на них не реагировали — большая просьба примеры в студию — когда, на какой адрес писали, что вам ответили.В тикеты системы поддержки партнерского аккаунта. Если у вас есть доступ в нее (уверен, что есть), то вот:
Ваши багрепорты впечатляют, часть вопросов уже была решена ранее, кое-что вносим в список багов, ожидающих правки. в любом случае спасибо за Вашу активность. Свою активность мы проявим при следующих обновлениях ;)
В скором времени: январе-феврале выйдет совершенно новый модуль форума
Мы в очередной раз купили ваш замечательный продукт, который к счастью хоть и постепенно становиться лучше от версии к версии, но всеже далек от идеала. Количество говнокода зашкаливает. Я хочу чтобы вы прислушались к советам по написанию качественного кода, которые я хочу дать.
Рассмотрим для примера «Суффикс списка объектов» для поставляемого с системой компонента «Публикации: Новости компании»
".opt( !$nc_title,
opt($totRows>$f_RowNum && $cc_settings[ListingStyle]=='fixed', "<div class='nc_pagination'>Страницы: ".browse_messages($cc_env, 5)."</div>" ).
opt($totRows && $cc_settings[ListingStyle]=='day', "Архив по дням: ".listQuery("SELECT DATE_FORMAT(Date,'%Y') AS year, DATE_FORMAT(Date,'%m') AS month, DATE_FORMAT(Date,'%d') AS day FROM Message$classID WHERE Subdivision_ID=$sub AND Sub_Class_ID=$cc AND DATE_FORMAT(Date,'%Y%m')='$year$month' GROUP BY DATE_FORMAT(Date,'%d') ORDER BY Date", '".($i?" | ":NULL).($data[day]=='.$day.'?$data[day]:"<a href='.$SUB_FOLDER.$current_sub[Hidden_URL].'$data[year]/$data[month]/$data[day]/>$data[day]</a>")."' )).
opt($totRows && $cc_settings[ListingStyle]=='month', "Архив по месяцам: ".listQuery("SELECT DATE_FORMAT(Date,'%Y') AS year, DATE_FORMAT(Date,'%m') AS month FROM Message$classID WHERE Subdivision_ID=$sub AND Sub_Class_ID=$cc AND DATE_FORMAT(Date,'%Y')='$year' GROUP BY DATE_FORMAT(Date,'%m') ORDER BY Date", '".($i?" | ":NULL).($data[month]=='.$month.'?$data[month]:"<a href='.$SUB_FOLDER.$current_sub[Hidden_URL].'$data[year]/$data[month]/>$data[month]</a>")."' )).
opt($totRows && $cc_settings[ListingStyle]=='year', "Архив по годам: ".listQuery("SELECT DATE_FORMAT(Date,'%Y') AS year FROM Message$classID WHERE Subdivision_ID=$sub AND Sub_Class_ID=$cc GROUP BY DATE_FORMAT(Date,'%Y') ORDER BY Date", '".($i?" | ":NULL).($data[year]=='.$year.'?$data[year]:"<a href='.$SUB_FOLDER.$current_sub[Hidden_URL].'$data[year]/>$data[year]</a>")."' ))
)."
Первое и самое главное — вы используете чудо-юдо функцию opt вместо языковой конструкции (condition? "": ""). Чем это чревато? Дело в том, что opt, является определенной пользовательской функцией, а функции, как известно принимают параметры. Дело в том, что php не может на этапе вызова функции определить, какие параметры будут в ней использоваться, поэтому для вызова функции, вычисляются все указанные параметры. Т.е. когда вы пишете opt( $error, die() ), то перед тем как выполнится opt, будет выполнен второй аргумент и скрипт закончит свое выполнение вне зависимости значения $error. В приведенном примере это означает, что для вывода каждой страницы, где используется этот компонент будут выполнены 3 очень таких не хилых SQL запроса, с группировочкой там, с преобразованием дат, в то время как если определена переменная $nc_title, ни один из них вообще не пригодится. Это товарищи, просто <мат>.
Второе — Вы везде и всюду используете запись $current_sub[Hidden_URL] вместо $current_sub['Hidden_URL']. Дело в том, что такая запись медленнее обрабатывается, причем значительно. И это помимо того, что в принципе-то это совершенно разные записи. В чем же тут дело? А дело в том, что в PHP ключами массива могут быть только строки и числе. PHP считает Hidden_URL без кавычек константой, и при встрече такой конструкции проверяет глобальный пул констант на наличие там таковой. Если такая константа не найдена — он делает некое послабление и расценивает Hidden_URL как строку, благодаря чему, к сожалению, у вас все работает. На самом деле если определить Hidden_URL как константу через define (скажем 666), то запись $current_sub[Hidden_URL] будет равнозначна $current_sub[666] и будет не равнозначна $current_sub['Hidden_URL'].
Третье. Вы любите вставлять переменные в строки. Это не плохо. Но как вы это делаете — не могу смотреть без слез. Ну нельзя же не экранировать переменную. Пишите вот так: «бла бла {$f_Title}бла бла», не пишите так: «бла бла $f_Titleбла бла», когданибудь вы так нарветесь на неприятности, если не натыкались уже сотню раз. Апофеоз этого беспредела — "$f_Title" — переменная, заключенная в строку, где кроме нее ничего и нет больше.
step-by-step guide для юных «хакеров».Вы его читали? Он просто для стеба разбит на пункты, на самом деле там все так просто, что любой юных «хакер» с большой долей вероятности сам мог наткнуться на него.
Убытки понесут в первую очередь студии и фрилансеры, которые внедряли эту CMS на сайт заказчика, ведь именно к ним будут претензии.Меры очень жестокие и очень к месту, разработчикам насрать уже год на своих клиентов, почему я должен заботиться об их безопасности.
для решения проблем использовали «сталинский» методТолько в самую последнюю очередь.
Дыры в форуме NetCat