Minimal 15.02.2011 19:28
Урок, пишем свой движок блога. — Урок 3: Обзор папки include.
Продолжаем.Опять же хочу обратить внимание на адекватность комментариев, если вы соизволили высказать свое мнение так будьте сказочно любезны его обосновать, а не ляпнуть абы сказать.
Переходим к обзору папки include - тут находятся подключаемые файлы.
Создаем в папке include следующие файлы config.php - отвечает за конфигурацию блога, core.php - ядро блога, filter.php - класс фильтрации данных, function.php - все функции блога, mysql.php - конфигурация базы данных и соединение, tags.php - содержит в себе функции всех служебных тегов, index.html - все тот же и пустой, и папку function - подключает функции блога.
В прошлом уроке был коммент:
Уже второй урок, а рабочего кода всё нет...
Работает совсем чуть-чуть, но работает. Это УЖЕ блог.
Хотите кода? без проблем вот код будет ниже, но отлаживать тогда будем вместе, а то смотрю не терпится.
--------------------------<�скрин>-----------------------------------

---------------------------<�код>------------------------------------
Файл config.php
1 |
<?php
|
define( name, value ); - определяет именованную константу, имя константы задаётся параметром name; значение - параметром value.
$_SERVER - это суперглобальный массив, содержащий такую информацию, как заголовки, пути, размещение скриптов. Данный массив создается веб-сервером.
Файл mysql.php
mysql_connect - Открывает соединение с сервером MySQL
mysql_query - Посылает запрос MySQL
mysql_select_db - Выбирает базу данных MySQL
setlocale - Устанавливает локаль
Файл tags.php
Файл filter.php
Файл core.php
Файл function.php
Файл function/show_list.php
Файл БД
ДОМАШНИЕ ЗАДАНИЕ
По совету exelens я даю домашние задание, раз тут все такие ГУРУ кода.
Задание!
Дописать функцию вывода ключевых слов, и описания для каждого поста.
Кто справится получит уважу от меня и exelens, да и от всех пользователей.
Сколько дать времени?
На все про все вам сутки, если не справитесь тогда я сам напишу.
И будет видно кто тут якается а кто пишет реально.
ПРОДОЛЖЕНИЕ СЛЕДУЕТ!
Урок 1 / Урок 2

+ 2 -
Для ребят кто не особо шарит, извините, подробное описание кода будет позже.
Константы вы любите использовать, а вот в этом случае вам чем то они не угодили...
Жаль полноценного шаблонизатора нету, интересно как реализовали бы. Можно уж было и пых код в шаблонах явным образом держать в таком случае. А то одна нога <- здесь, другая -> там.
if (stristr($_SERVER<'SCRIPT_FILENAME'>, basename(__FILE__))) exit('Ошибка: Доступ запрещен!');
Жаль полноценного шаблонизатора нету, интересно как реализовали бы. Можно уж было и пых код в шаблонах явным образом держать в таком случае. А то одна нога <- здесь, другая -> там.
да все как то в попыха, да в попыха все ;)
в будущем все реализуем
в будущем все реализуем
Лучше не пыхай, а потерпи и выкладывай сразу готовый пост, а не эти полуфабрикаты.
Если вы насчёт первой строки - в index.php можно задавать константу, и в остальных скриптах если она не определена, делать exit.
А насчёт шаблонизатора одну идею уже описал :) То, чем в большинстве случаев маленькие странички и обходятся... шаблоны, содержащие php код.
Все иные варианты предполагают уже более комплексный подход к разработке, и желательно не структурный.
А насчёт шаблонизатора одну идею уже описал :) То, чем в большинстве случаев маленькие странички и обходятся... шаблоны, содержащие php код.
Все иные варианты предполагают уже более комплексный подход к разработке, и желательно не структурный.
Хотя... как то помню просили на коленке собрать примитивный шаблонизатор, но лишь бы в php коде не было никакого упоминания HTML.
В таком случае для элементов типа ul li отделались загрузкой шаблона элементов li, который пустили по циклу, а потом обернули это всё в шаблон-обёртку ul + шаблон ошибок/не существующих элементов.
В таком случае для элементов типа ul li отделались загрузкой шаблона элементов li, который пустили по циклу, а потом обернули это всё в шаблон-обёртку ul + шаблон ошибок/не существующих элементов.
ну или в .htaccess прописать
<Files *>
Order Deny,Allow
Deny from all
</Files>
Константы вы любите использовать, а вот в этом случае вам чем то они не угодили...
А судя по этому комменту, такой подход вообще лучше не использовать.
if (stristr($_SERVER<'SCRIPT_FILENAME'>, basename(__FILE__))) exit('Ошибка: Доступ запрещен!');
А кто сказал что именно так реализовывать надо? :) Зачем какие то проверки на подключаемые файлы делать, если можно примитивный boolean в константу внести в index.php
да это понятно. Тут Я в какой-то степени согласен, однако лишняя константа на то и лишняя, чтоб попытаться от неё избавиться :)
А в чём она лишняя?
В данном примере вся конфигурация на константах, о них ничего не хотите сказать?
В данном примере вся конфигурация на константах, о них ничего не хотите сказать?
Я думал, наша дискуссия уже вышла за рамки данного примера.
И да, хочу, Я в своём коде вообще избавился от констант при конфигурации в пользу класса-синглтона. Я уже говорил об этом.
И да, хочу, Я в своём коде вообще избавился от констант при конфигурации в пользу класса-синглтона. Я уже говорил об этом.
Простыню из str_replace'ов в файле tags.php можно заменить на один вызов strtr.
Типа как-то так:
Так ты и от лишних переменных избавишься, и чисто визуально, как по мне, такой код проще сопровождать.
А вообще, про шаблонизатор уже сказали.
Также, про фильтры рекомендую почитать, например, на phPRO (если конечно с енглишом всё норм). Всё-таки, если есть в языке такая стандартная плюшка, то зачем её игнорировать?
Типа как-то так:
$html = strtr( $html, array(
'{content}' => $content,
'{page_title}' => $page_title,
// ...
'{menu_category}' => get_menu_category()
) );
Так ты и от лишних переменных избавишься, и чисто визуально, как по мне, такой код проще сопровождать.
А вообще, про шаблонизатор уже сказали.
Также, про фильтры рекомендую почитать, например, на phPRO (если конечно с енглишом всё норм). Всё-таки, если есть в языке такая стандартная плюшка, то зачем её игнорировать?
phPRO... фильтры на пыхе мрачные, к тому же легко осуществимы вручную, что как минимум занимательно. Фильтры все устоены на прегматчах тех же...
Можно узнать, почему выбран strtr, а не str_replace?
Можно узнать, почему выбран strtr, а не str_replace?
фильтры на пыхе мрачные
В топике тоже не слишком весёлые, кстати.
Фильтры все устоены на прегматчах тех же
Каюсь, не знал. Всё-таки языковые фичи, думал, все на Си.
Но... Всё-таки, если есть в языке такая стандартная плюшка, то зачем её игнорировать? Всё равно ведь ничего сложнее использоваться в этой CMS не будет.
Впрочем это всего лишь моё мнение.
Можно узнать, почему выбран strtr, а не str_replace?
В str_replace надо два массива. Или Я ошибаюсь?
strtr предназначен в первую очередь для посимвольной замены. В таком случае работает значительно быстрее.
Документация PHP:
php.net/strtr
php.net/str_replace
Пример str_replace c одним массивом:
Более конкретных цифр по производительности вам не скажу, если вас заинтересует эта тема, поищите в интернетах str_replace vs strtr. Есть сравнение производительности в примерах и даже с графиками :)
Документация PHP:
php.net/strtr
php.net/str_replace
Пример str_replace c одним массивом:
$string = "Line 1\nLine 2\rLine 3\r\nLine 4\n";
$search = array( "\r\n", "\n", "\r" );
$replace = "<br />";
$newString = str_replace( $search, $replace, $string );
echo $newString;
Более конкретных цифр по производительности вам не скажу, если вас заинтересует эта тема, поищите в интернетах str_replace vs strtr. Есть сравнение производительности в примерах и даже с графиками :)
Немного не то понял под фразой "вместо одного массива". Да, необходимо два массива. Но никакой трудности в этом не вижу.
Трудность есть. Трудность восприятия.
Гораздо легче читается
чем
В первом случая явно видно, что на что заменяется, во втором — надо пропарсить глазами два списка и сопоставить их.
Гораздо легче читается
$string = strtr($string, array(
'{one}' => $one,
'{two}' => $two,
'{three}' => $three
));
чем
$string = str_replace(array(
'{one}', '{two}', '{three}'
),
array(
$one, $two, $three
), $string);
В первом случая явно видно, что на что заменяется, во втором — надо пропарсить глазами два списка и сопоставить их.
Не совсем понял, что имеется в виду. Интерполяция типа "${one} or ${two}"?
В данном случае вариантов много. Как один из них:
А в конце проходит обработчик выходящего потока, заменяя ключи на их значения.
$variables = array();
$variables<'one'> = "real one";
$variables<'two'> = $two;
$variables<'three'> = "fifty-five";
addVariable( $variables );
А в конце проходит обработчик выходящего потока, заменяя ключи на их значения.
+ этот массив, например, в будущем можно вообще парсить из ini-файла, где-нибудь рядом с темой
Не так давно где-то натыкался на обсуждение фильтра e-mail адресов. В итоге выясинилось что он не правильно работает.
Согласен, но раз заголовок гласит нам что это "Урок", то я бы не ограничивался в этом плане фильтрами. Лучше про прегматчи те же рассказать как они работают, ещё и ссылки прицепить на объяснение их синтаксиса.
Вот к примеру:
Мы здесь видим режимы i - (case insensitive) и x - (free spacing mode). Вот я лично не понимаю зачем нужен здесь X если regex написан без пробелов и переноса каретки.
Это нужно для регулярок вида:
Но... Всё-таки, если есть в языке такая стандартная плюшка, то зачем её игнорировать? Всё равно ведь ничего сложнее использоваться в этой CMS не будет.
Согласен, но раз заголовок гласит нам что это "Урок", то я бы не ограничивался в этом плане фильтрами. Лучше про прегматчи те же рассказать как они работают, ещё и ссылки прицепить на объяснение их синтаксиса.
Вот к примеру:
$check = '/^+(\.+)*';
$check.= '@(<-a-z0-9>+\.)+({2,3}';
$check.= '|info|aero|name)$/ix';
Мы здесь видим режимы i - (case insensitive) и x - (free spacing mode). Вот я лично не понимаю зачем нужен здесь X если regex написан без пробелов и переноса каретки.
/x активирует режим "free-spacing mode". В данном режиме пробелы в regex игнорируются и не экранированный символ # начинает комментарий.
Это нужно для регулярок вида:
# Match a 20th or 21st century date in yyyy-mm-dd format
$regex = "/^(19|20)\d\d # year
<- /.> # separator
(0<1-9>|1<012>) # month
<- /.> # separator
(0<1-9>|<12><0-9>|3<01>) # day $/ix"
Такое громкое название "Ядро блога", а вы код видели? :) Ну и добавил бы его к index.php? Все равно же на коленке писано :) И еще вопрос по существу: а если я возжелаю (чисто теоретически) две базы данных использовать? Как твой код решит мою задачу?
Повторяю еще раз, для тех кто не понял еще, да там мало кода, но это только сейчас, ведь это еще не блог, это только первый запуск, там еще много что придется дописать.
P/S вот он пример коммента "абы ляпнуть", коммент не несет не какой смысловой нагрузки.
P/S вот он пример коммента "абы ляпнуть", коммент не несет не какой смысловой нагрузки.
Код лучше выложить на какой-нибудь кодохостинг. Вы ведь знакомы с системами контроля версий?
Смотрю я на это всё, и вижу у этого «движка» целый букет детских болезней. Тут отсутствие гибкости, и недостаточность SQL-абстракции (mysql_query() без указания коннекта к базе с захардкоженным SQL), и отсутствие нормальной шаблонизации (упрётесь вот в циклы и условия в шаблонах, упрётесь же, а нормально разделить логику отображения и бизнес-логику при текущей архитектуре очень сложно, если вообще реально)...
Такие поделки писал, наверное, каждый, кто начинал писать сайты на пыхыпе. И как пример движка, написанного новычком, вполне сойдёт. Но учиться писать на этом примере явно не стоит.
Такие поделки писал, наверное, каждый, кто начинал писать сайты на пыхыпе. И как пример движка, написанного новычком, вполне сойдёт. Но учиться писать на этом примере явно не стоит.
Философов тут хватает, лучше что нибудь реальное бы предложил, или идеи подкинул, этот код писан гопом (на коленке), как говорится без всяких ТЗ, много не продумано на 100%.
Я взялся писать это по причине, того что что нечем было заняться вечером.
Предложил вам быстрый код, а вы теперь думайте, а не ждите готовенького идеального блога.
Это бесплатный сыр, а не заказной продукт где надо чтоб были все грани гладкие.
Я взялся писать это по причине, того что что нечем было заняться вечером.
Предложил вам быстрый код, а вы теперь думайте, а не ждите готовенького идеального блога.
Это бесплатный сыр, а не заказной продукт где надо чтоб были все грани гладкие.
Прежде чем писать шедевры самому, предлагаю сперва изучить то, что уже сделано хорошо. Тот же CodeIgniter минималистичный возьми, распечатай и почитай в метро. Или PureMVC какой. Поверь мне, их далеко не дураки писали. Разберись, попробуй несколко идей оттуда. МакКоннела какого почитай для комплекта, он много дельных книг кроме всего прочего советует, так что можешь и по ним потом пройтись. Вот после этого посмотри на свой теперешний код и ты пойм?шь, как его вижу я.
насколько я понимаю они решили изучить основы php... фреймворки это очень хорошо, сам юзаю Yii :) Но для обучения чистого php можно начать и так как они решили :)
они = он :)
они = он :)
Почему вы такии противники классов? шаблонизатор - можно заюзать один класс, хотябы самый элементарный и избавиться от этого мусора:
Защита от SQL inj - это PDO
Фильтр xss лучше сразу заюзать htmlpurifier, если учить новичков, то сразу не забывать учить готовые разработки которые очень хороши в даном вопросе.
это очень плохой вариант, лучше юзать исключения (try{}catch(){})
в function/show_list.php строка
Вот ссылка на говно-шаблонизатор который я писал года 3 назад дет :) хотябы так... если нужно могу дописать, хотя в таком давно не нуждаюсь :)
Подобных конструкций и подавно лучше избегать, так как проще сделать чтот вроде мини шаблонизатор и сделать обработчик, а лучше глобальный try{}catch(){}
В общем думаю на сегодня хватит комментариев :) если что пишите, с удовольствием поучавствую в обучении :)
$html = $html.file_get_contents('themes/'.CONFIG_THEMES.'/function_show_list.tpl');
$html = str_replace('{title_category}', $title_category, $html);
$html = str_replace('{url_category}', $url_category, $html);
...
$html = str_replace('{time_post}', $time_post, $html);
Защита от SQL inj - это PDO
Фильтр xss лучше сразу заюзать htmlpurifier, если учить новичков, то сразу не забывать учить готовые разработки которые очень хороши в даном вопросе.
or die ('Ошибка: ' . mysql_error());
это очень плохой вариант, лучше юзать исключения (try{}catch(){})
в function/show_list.php строка
if (stristr($_SERVER<'SCRIPT_FILENAME'>, basename(__FILE__))) exit('Ошибка: Доступ запрещен!');
бесплезна, потому как внутри функция которая на этой же странице не вызываетсяВот ссылка на говно-шаблонизатор который я писал года 3 назад дет :) хотябы так... если нужно могу дописать, хотя в таком давно не нуждаюсь :)
if ( is_file('themes/'.CONFIG_THEMES.'/main.tpl') )
{
$html = file_get_contents('themes/'.CONFIG_THEMES.'/main.tpl');
} else {
exit('Ошибка: Не найден шаблон main.tpl.');
}
Подобных конструкций и подавно лучше избегать, так как проще сделать чтот вроде мини шаблонизатор и сделать обработчик, а лучше глобальный try{}catch(){}
В общем думаю на сегодня хватит комментариев :) если что пишите, с удовольствием поучавствую в обучении :)
К сожалению конструкция try catch очень сильно проигрывает по скорости в пыхыпе, но для маленьких сайтов без нагрузки конечно пойдёт.
Что за глупости? В ОЧЕНЬ высоконагруженых проектах используют в плодь до фреймворков, не гвооря уже о try{}catch(){}. Если брать реально то и сам по себе php довольно медженный и т. д. :) Уже давно никто на мелочи не смотрит.
http://www.stay.com/ - довольно высоконагруженый, yiiframework, то что смог првиести на вскидку.
А вообще не выдумывайте :) Не стоит себе портить жизнь мелочами...
p.S. это не значит что на оптимизацию не стоит вообще обращать внимание, но такие мелочи...
http://www.stay.com/ - довольно высоконагруженый, yiiframework, то что смог првиести на вскидку.
А вообще не выдумывайте :) Не стоит себе портить жизнь мелочами...
p.S. это не значит что на оптимизацию не стоит вообще обращать внимание, но такие мелочи...
Просто не надо их везде кидать =) в примере, который вы привели в них нету критической необходимости... проверять входящие данные - да, но вот шаблоны никак не выдадут ошибку если мы не меняем файловую систему.