Вчера еще немного просветился в области php. Надо сказать, что идея заняться своим сайтом уже проносит свои плоды - начинаю ковыряться в очевидных для многих вопросах и находить на них ответы. И, соответственно, пополнять свою копилку знаний и умений.
Вот проблема, которая была на
моем сайте до недавнего: если в качестве параметра публикации в скрипт, формирующий страницу с текстом публикации, передать какой-нибудь несуществующий в базе данных параметр, выводилась страница с ошибкой 404. Но как она выводилась? Сначала шапка сайта, потом снова шапка сайта, потом текст страницы 404 и потом два "подвала" страницы. Причем, счетчик liveinternet тоже выводился два раза, из-за чего совершенно справедливо он перестал считать посетителей сайта - чтобы не было накруток.
Происходило это из-за того, что скрипт public.php пытался встроить внутрь страницы с публикаций фрагмент кода из другого файла, которого, раз параметр был неверным, просто на сайте якобы не существовало. И в целом вполне логично при попытке обратиться к несуществующей публикации выдавать страницу с ошибкой 404, но выводить ее нужно корректно. Для этого я придумал следующую "хитрость": в скрипте public проверяется, существует ли файл, соответствующий переданному параметру. Если файл существует - страница выводится в штатном порядке, если нет - посетитель сайта отправляется на страницу с ошибкой 404.
Собственно, задачей моей вчера было выяснить, как это сделать. Оказывается, делается это все весьма просто. На просторах интернета удалось выяснить, что функция is_file позволяет выяснить, существует ли заданный файл. При этом, судя по документации, эта функция еще позволяет узнать, является ли файл "обычным". Что это значит - я пока, скажу прямо, не совсем понимаю, но постараюсь в ближайшее время с этим разобраться. В этом же интернете удалось найти и способ перенаправления пользователя на другую страницу. Делается это с помощью функции header и обязательного параметра "Location". Хотя сама функция header, судя по описанию, имеет куда более глубокий смысл, чем просто перенаправить пользователя с одной страницы на другую. С этим смыслом тоже еще предстоит разобраться.
В итоге, поправив скопированный с какого-то сайта фрагмент кода, у меня получился вот такой вариант для своего сайта:
$filename="http://www.dabu.ru/rubric/$row[5]/text.php";
if ( is_file( $_SERVER["DOCUMENT_ROOT"]."/rubric/$row[5]/text.php" ) )
{ include ($filename); }
else
{ header("Location: http://www.dabu.ru/er404.html"); }
В переменную $filename я сохраняю путь до файла с публикацией, если такая публикация существует. Идентификация конкретной публикации идет по папке, в которой находятся ее материалы - ее название хранится в переменной $row[5]. В самой папке обязательно должен быть скрипт text.php, который и определяет содержание конкретной публикации. В принципе, эту переменную можно было, мне кажется, и не создавать.
С помощью оператора if как раз я выясняю существования файла. Если функция is_file возвращает значение true, то файл существует и это означает, что нужно в скрипт public.php вставить код из скрипта text.php (строчка include {$filename)). В противном случае я отправляю пользователя на страницу с ошибкой - она на сайте имеет адрес
http://www.dabu.ru/er404.html. В качестве параметра функции is_file использована хитроумная конструкция $_SERVER["DOCUMENT_ROOT"]."/rubric/$row[5]/text.php". Как оказывается, в php существует "суперглобальный массив" (цитирую по
этой статье) $_SERVER , который содержит много полезных для создателей сайта параметров и их значений. Например, в данном случае элемент$_SERVER["DOCUMENT_ROOT"] указывает на путь к корневой директории сервера, что очень важно, если скрипт выполняется на виртуальном хосте, как в моем случае. Ну а остальная часть параметра функции is_file, думаю, в комментариях не нуждается: очевидно, на что она указывает. Таким образом, в целом этот параметр указывает на путь к файлу text.php для той публикации, параметр которой содержится в переменной #row[5]. Если в этой переменной будет что-то иное, что не соответствует действительности, файл найден не будет и, соответственно, значение функции будет "ложь".
Теперь на сайте вполне корректный вывод страницы с ошибкой. Ну а поскольку устранено дублирование счетчика liveinternet на этой странице, то и счетчик стал полноценным образом считать посетителей сайта.