Создание динамического сайта на 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>';

Получать новые сообщения по Email

19 комментариев на “Создание динамического сайта на PHP”

  1. Велти Раиса пишет:

    Ув. Евгений Владимирович.
    Знаю, что Вы ведете курсы Веб-дизайна в "Контакте". Я начала изучать веб-дизайн и очень бы хотелось учиться у Вас. Если возможны индивидуальные занятия, было бы очень здорово, хотя бы несколько занятий.
    Жду Вашего ответа, заранее спасибо,
    Раиса Велти

  2. Eugene Pikalov пишет:

    Раиса, На данный момент я не веду курсы. Индивидуальные я бы рад, но увы свободного времени совсем нет. Отдельные вопросы я могу консультировать в блоге. Вы можете пройти индивидуальные занятия в центре Контакт с Ризваш Борисом (HTML верстка, PHP) и Шубкой Светланой (дизайн, Photoshop, Flash). (044) 241-72-05 http://www.contact.com.ua

  3. Владимир пишет:

    Ув. Евгений Владимирович.
    Подскажите почему всегда загружается только main.htm,
    вместо того, чтобы при нажатии на одну из ссылок – открывался один из файлов .htm?

    Спасибо.

  4. Владимир пишет:

    продолжение...

    if(array_key_exists ($_GET['page’],$pages))
    readfile('lin/’.$_GET['page’].’.htm’);
    else
    readfile('lin/main.htm’);

  5. Владимир пишет:

    Благодарю за ответ.
    Так это же Ваш код, взятый из "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 "";
    }

    ?>

    Еще раз СПАСИБО!

  6. Eugene Pikalov пишет:

    Ответил по email

  7. Владимир пишет:

    Спасибо Вам за ответ.
    Заработало. Вы предоставили самый понятный код из тех, что мне приходилось видеть за неделю.
    Успехов в работе!

  8. 826712 Blog Verification пишет:

    826712 Blog Verification

    826712

  9. st0rk пишет:

    Добрый день.
    Стал делать как Вы писали – не получаются некоторые моменты – когда использую
    $pages=array(

    'about’=>'О нас’,
    'contacts’=>'Контакты’
    );
    if($_GET['page’]==’') $_GET['page’]=’about’;
    if(array_key_exists ($_GET['page’],$pages)) $_GET['page’]=’404’;?>
    (это все до тега )
    а потом в средине сайта в одной из ячеек таблицы

    то не выводятся эти документы из каталога txt, ежели убираю верхний код с массивом – то все работат – только ругается на array_key_exists – ну потому что массива попросту нет.
    Не могли бы разъяснить ситуацию, а то не очень понимаю в этом моменте 🙁

  10. Татьяна пишет:

    Здравствуйте. Пробую делать все на своем компьютере с помощью помощью Денвера. При вводе первой же записи в файл index.php вс отображается без изменений, так как в самом коде, вот так:
    // Это комментарий который не обрабатывается

    // все данные попадающие в скрипт методом get находятся в массиве $_GET ,
    // если наc интересует переменная page переданная методом GET, то обратиться к ней можно так $_GET['page’]

    // вывод на экран происходит коммандой echo

    echo $_GET['page’];

    Дальше тем более не получается. Буду благодарна за объяснение. С уважением Татьяна.

  11. Дмитрий пишет:

    Та же самая проблема, что и у Владимира – скопировал Ваш пример, и при нажатии на любую ссылку лишь меняется адрес в строке браузера, но в качестве контента выдается страница 404.htm. Не подскажете, в чем причина?

  12. Дмитрий пишет:

    Доброго времени суток. вот какая штука у меня получилаьс.
    Послендней 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’;
    то все работает как нужно. Вопрос почму?

  13. Артем пишет:

    Дмитрий проблема в этой строчке:

    if(array_key_exists ($_GET[‘page’],$pages)) $_GET[‘page’]=’404’;

    замените ее на эту:

    if(!array_key_exists ($_GET['page’],$pages)) $_GET['page’]=’404’;

    и все заработает!

  14. Влад пишет:

    Отличный урок, всё понятно и доступно. Но есть кое что, что не получилось –
    if($_GET['page’]==$value) // пункт меню равен текущей странице, значит его не нужно делать ссылкой

    Вот ни в какую он не хочет быть не ссылкой, всё перепробовал!

  15. ret пишет:

    Спасибо, какраз искал простое пояснение механизма и реализации динамического сайта.

  16. Константин пишет:

    Классный урок, давно такое искал. Вот если бы еще разобрать как делать выборку из БД в место загрузки htm файлов, было бы ваще крутяк !

  17. Константин пишет:

    Плохо что при считывании страницы (файла) на пример about.htm на экран все выводится как текст кроме конечно html. А вот если все htm заменить на php то в таком случае дела обстоят плохо, так как php код считывается тоже как текст, но на экран не выводится просто в исходном коде он (php код) как комментарий, тоже самое и с sql запросами.

  18. Максим пишет:

    проще через switch все сделать...

  19. Олег пишет:

    Если эта тема еще живая, я несколько поздновато сюда зашел 🙂
    Подскажите пожалуйста есть ли возможность запретить запуск ссылок вида сайт/page/about.html вместо нужного мне захода по ссылке вида сайт/index.php?page=about ?

Оставить комментарий