Создание динамического сайта на PHP
Идея: показать как можно создать ОЧЕНЬ простой динамический сайт на PHP 🙂
1. Создадим папку на сервере например, site
Этот пункт не являеться обязательным и его можно опустить. Если Вы планируете создавать страницы на реальном сайте, то нужно все файлы складывать в корневую директорию сайта.
2. Создадим файл index.php, который будет главным файлом и будет выводит на экран не только первую страницу сайта но и все внутренние. Это станет возможным благодаря использованию метода GET, с помощью которого можно в адресной строке передавать параметры файлу index.php. Пример www.site.com/index.php?page=about – page имя переменной переданное методом GET, а about – значение этой переменной. Этот адрес можно сократить до www.site.com/?page=about, index.php являеться файлом по умолчанию и поэтому пример по прежднему будет работать.
NOTE: Сокращать можно и дальше. 🙂
С помощью механизма RewriteRule сервера Apache можно адрес www.site.com/about преобразовывать в www.site.com/index.php?page=about . Т.е. пользователь будет видеть www.site.com/about, а сервер будет воспринимать этот адрес как www.site.com/index.php?page=about .
Это возможно сделать следующим образом (предварительно следует выяснить у администратора сервера поддерживаеться ли работа RewriteRule и файл .htaccess)
1. Создать в корневой директории сайта файл .htaccess
следующего содержания
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9]+) index.php?page=$1
Эти записи дословно означают включить обработку правил модификации адреса и если запрошенного файла или директории на диске нет, то управление передать файлу index.php. В переменную page будет передано имя страницы. При этом сделано ограничение что имя страницы может состоять только из букв и цифр.
3. Полученные знания стоит протестировать на практике
И так создадим файл index.php
// Это комментарий который не обрабатывается // все данные попадающие в скрипт методом get находятся в массиве $_GET , // если наc интересует переменная page переданная методом GET, то обратиться к ней можно так $_GET['page'] // вывод на экран происходит коммандой echo echo $_GET['page'];
Если все сделано правильно и файл закачан в папку site находящуюся например на сайте test.com но набрав test.com/site/?page=about в окне браузера должно отобразиться слово about. Пробуя изменять в адресной строке значения переменной, будем получать разные названия на экране.
NOTE: для отладки, в случае возникновения ошибок, полезно использовать конструкцию, котрая выводит список всех переменных и значений из массива $_GET
print_r($_GET);
4. Далее создадим в папке site подпапку txt (site/txt). Внутри создадим 2 файла about.htm и contacts.htm с произвольным html содержимым.
5. Сделаем динамическое меню и включение файлов из папки txt
Для этого мы будем менять файл index.php. Этот файл в данном примере будет служить своеобразным шаблоном, изменение которого будет приводить к изменению вида всех страниц сайта
/** ** Главный файл сайта **/ // функция readfile читает и выводит на экран содержимое файла 'txt/'.$_GET['page'].'.htm' // имя файла в данном случае динамическое и состоит из пути и значения переменной полученной методом GET readfile('txt/'.$_GET['page'].'.htm'); // !!!!!! Внимание НИКОГДА не используйте данный пример в реальном сайте, т.к. он содержит код ставящий под угрозу безопасность вашего сайта
Протестировав пример с запросами index.php?page=about и index.php?page=contacts можно уловить идею что же все таки происходит.
6. Теперь немного усложним и обезопасим себя
index.php
/** ** Главный файл сайта **/ // массив в котором будем хранить допустимые имена файлов и их русские названия $pages=array( 'about'=>'О нас', 'contacts'=>'Контакты' ); // функция readfile читает и выводит на экран содержимое файла 'txt/'.$_GET['page'].'.htm' // имя файла в данном случае динамическое и состоит из пути и значения переменной полученной методом GET if(array_key_exists ($_GET['page'],$pages)) // проверка на присутствие страницы среди перечисленных в массиве $pages readfile('txt/'.$_GET['page'].'.htm'); else readfile('txt/about.htm'); // если страница не найдена или $_GET['page'] пустая то выводим about.htm
7. Добавим автоматическое отображение меню и html теги
<html> <body> <table border="1"> <tr> <td width="150"> < ?php /** ** Главный файл сайта **/ // массив в котором будем хранить допустимые имена файлов и их русские названия $pages=array( 'about'=>'О нас', 'contacts'=>'Контакты' ); // генерация меню foreach($pages as $key=>$value) // цикл который обходит все пары ключ(индекс)-значение массива $pages, на каждом шаге ключ будет записываться в $key а значение в $value { if($_GET['page']==$value) // пункт меню равен текущей странице, значит его не нужно делать ссылкой { echo $pages[$_GET['page']]; } else { echo '<a href="'.$key.'">'.$value.'</a>'; } echo "<br />"; } ?> </td> <td> < ?php // функция readfile читает и выводит на экран содержимое файла 'txt/'.$_GET['page'].'.htm' // имя файла в данном случае динамическое и состоит из пути и значения переменной полученной методом GET if(array_key_exists ($_GET['page'],$pages)) // проверка на присутствие страницы среди перечисленных в массиве $pages readfile('txt/'.$_GET['page'].'.htm'); else readfile('txt/about.htm'); // если страница не найдена или $_GET['page'] пустая то выводим about.htm ?> </td> </tr> </table> </body> </html>
8. И еще пару штрихов
< ?php /** ** Главный файл сайта **/ // массив в котором будем хранить допустимые имена файлов и их русские названия $pages=array( 'about'=>'О нас', 'contacts'=>'Контакты' ); // определим если $_GET[page] пустая то выведем about if($_GET['page']=='') $_GET['page']='about'; // если такой страницы в меню нет то выведем содержимое файла txt/404.htm (нужно создать) if(!array_key_exists ($_GET['page'],$pages)) $_GET['page']='404'; ?> <html> <title> < ?php echo $pages[$_GET['page']]; // русское название в заголовке ?> </title> <body> <table border="1"> <tr> <td width="150"> < ?php // генерация меню foreach($pages as $key=>$value) // цикл который обходит все пары ключ(индекс)-значение массива $pages, на каждом шаге ключ будет записываться в $key а значение в $value { if($_GET['page']==$value) // пункт меню равен текущей странице, значит его не нужно делать ссылкой { echo $pages[$_GET['page']]; } else { echo '<a href="'.$key.'">'.$value.'</a>'; } echo "<br />"; } ?> </td> <td> <h1> < ?php echo $pages[$_GET['page']]; // русское название в заголовке ?> </h1> < ?php // функция readfile читает и выводит на экран содержимое файла 'txt/'.$_GET['page'].'.htm' // имя файла в данном случае динамическое и состоит из пути и значения переменной полученной методом GET readfile('txt/'.$_GET['page'].'.htm'); ?> </td> </tr> </table> </body> </html>
Остальное по вкусу. Домашенее задание сделать многоязычный сайт.
PS: Если сервер не поддерживает работу с файлом .htaccess или RewriteRule то необходимо в примерах
заменить строку
echo '<a href="'.$key.'">'.$value.'</a>';
на
echo '<a href="index.php?page='.$key.'">'.$value.'</a>';
6 Март 2007 в 15:14
Ув. Евгений Владимирович.
Знаю, что Вы ведете курсы Веб-дизайна в "Контакте". Я начала изучать веб-дизайн и очень бы хотелось учиться у Вас. Если возможны индивидуальные занятия, было бы очень здорово, хотя бы несколько занятий.
Жду Вашего ответа, заранее спасибо,
Раиса Велти
7 Март 2007 в 10:45
Раиса, На данный момент я не веду курсы. Индивидуальные я бы рад, но увы свободного времени совсем нет. Отдельные вопросы я могу консультировать в блоге. Вы можете пройти индивидуальные занятия в центре Контакт с Ризваш Борисом (HTML верстка, PHP) и Шубкой Светланой (дизайн, Photoshop, Flash). (044) 241-72-05 http://www.contact.com.ua
11 Март 2007 в 21:02
Ув. Евгений Владимирович.
Подскажите почему всегда загружается только main.htm,
вместо того, чтобы при нажатии на одну из ссылок – открывался один из файлов .htm?
Спасибо.
11 Март 2007 в 21:06
продолжение...
if(array_key_exists ($_GET['page’],$pages))
readfile('lin/’.$_GET['page’].’.htm’);
else
readfile('lin/main.htm’);
11 Март 2007 в 22:21
Благодарю за ответ.
Так это же Ваш код, взятый из "7. Добавим автоматическое отображение меню и html теги" и "8. И еще пару штрихов".
Видите в чем дело,
при нажатии на ссылки – в адресной строке адрес менятся на site.com/about или site.com/contacts, а информация на странице не меняется.
Хотя весь код был скопирован из Вашего примера.
Я просто хочу разобраться в связи между страницами в php на основе Вашего примера.
По поводу Ваших примеров в последнем комментарии: работать то я вижу что работает, но вы не могли бы написать как добились, потому что код то не показывает браузер...
Можно на e-mail, будьте любезны, помогите...
вот код:
'Главная’,’about’=>'О нас’,’contacts’=>'Контакты’);
if($_GET['page’]==’') $_GET['page’]=’main’;
if(array_key_exists ($_GET['page’],$pages)) $_GET['page’]=’404’;
?>
$value)
{
if($_GET['page’]==$value)
{
echo $pages[$_GET['page’]];
}
else
{
echo ''.$value.’';
}
echo "";
}
?>
Еще раз СПАСИБО!
11 Март 2007 в 22:45
Ответил по email
12 Март 2007 в 07:17
Спасибо Вам за ответ.
Заработало. Вы предоставили самый понятный код из тех, что мне приходилось видеть за неделю.
Успехов в работе!
13 Март 2007 в 14:55
826712 Blog Verification
826712
17 Июнь 2007 в 13:25
Добрый день.
Стал делать как Вы писали – не получаются некоторые моменты – когда использую
$pages=array(
'about’=>'О нас’,
'contacts’=>'Контакты’
);
if($_GET['page’]==’') $_GET['page’]=’about’;
if(array_key_exists ($_GET['page’],$pages)) $_GET['page’]=’404’;?>
(это все до тега )
а потом в средине сайта в одной из ячеек таблицы
то не выводятся эти документы из каталога txt, ежели убираю верхний код с массивом – то все работат – только ругается на array_key_exists – ну потому что массива попросту нет.
Не могли бы разъяснить ситуацию, а то не очень понимаю в этом моменте 🙁
18 Июнь 2009 в 13:18
Здравствуйте. Пробую делать все на своем компьютере с помощью помощью Денвера. При вводе первой же записи в файл index.php вс отображается без изменений, так как в самом коде, вот так:
// Это комментарий который не обрабатывается
// все данные попадающие в скрипт методом get находятся в массиве $_GET ,
// если наc интересует переменная page переданная методом GET, то обратиться к ней можно так $_GET['page’]
// вывод на экран происходит коммандой echo
echo $_GET['page’];
Дальше тем более не получается. Буду благодарна за объяснение. С уважением Татьяна.
29 Сентябрь 2009 в 11:10
Та же самая проблема, что и у Владимира – скопировал Ваш пример, и при нажатии на любую ссылку лишь меняется адрес в строке браузера, но в качестве контента выдается страница 404.htm. Не подскажете, в чем причина?
17 Май 2010 в 10:55
Доброго времени суток. вот какая штука у меня получилаьс.
Послендней 8 пункт если пишу:
// массив в котором будем хранить допустимые имена файлов и их русские названия
$pages=array(
'about’=>'О нас’,
'contacts’=>'Контакты’
);
// определим если $_GET[page] пустая то выведем about
if($_GET['page’]==’') $_GET['page’]=’about’;
// если такой страницы в меню нет то выведем содержимое файла txt/404.htm (нужно создать)
if(array_key_exists ($_GET['page’],$pages)) $_GET['page’]=’404’;
то в адресной строке меняютса значения а в таблице постоянно выводитса текст из 404.htm.
Если же я убиваю строку:
if(array_key_exists ($_GET['page’],$pages)) $_GET['page’]=’404’;
то все работает как нужно. Вопрос почму?
29 Июнь 2010 в 11:18
Дмитрий проблема в этой строчке:
if(array_key_exists ($_GET[‘page’],$pages)) $_GET[‘page’]=’404’;
замените ее на эту:
if(!array_key_exists ($_GET['page’],$pages)) $_GET['page’]=’404’;
и все заработает!
7 Декабрь 2010 в 13:09
Отличный урок, всё понятно и доступно. Но есть кое что, что не получилось –
if($_GET['page’]==$value) // пункт меню равен текущей странице, значит его не нужно делать ссылкой
Вот ни в какую он не хочет быть не ссылкой, всё перепробовал!
16 Сентябрь 2011 в 20:59
Спасибо, какраз искал простое пояснение механизма и реализации динамического сайта.
25 Июнь 2012 в 11:27
Классный урок, давно такое искал. Вот если бы еще разобрать как делать выборку из БД в место загрузки htm файлов, было бы ваще крутяк !
25 Июнь 2012 в 19:57
Плохо что при считывании страницы (файла) на пример about.htm на экран все выводится как текст кроме конечно html. А вот если все htm заменить на php то в таком случае дела обстоят плохо, так как php код считывается тоже как текст, но на экран не выводится просто в исходном коде он (php код) как комментарий, тоже самое и с sql запросами.
17 Декабрь 2012 в 06:20
проще через switch все сделать...
16 Март 2013 в 20:28
Если эта тема еще живая, я несколько поздновато сюда зашел 🙂
Подскажите пожалуйста есть ли возможность запретить запуск ссылок вида сайт/page/about.html вместо нужного мне захода по ссылке вида сайт/index.php?page=about ?