- •Оглавление
- •Что такое интернет
- •Готовимся к созданию Web-страниц
- •Железо, железо и еще раз железо...
- •Домашняя эргономика — безопасность прежде всего!
- •Программное обеспечение для Web-мастера
- •Выбор хостинга
- •Знакомьтесь — РНР
- •История создания РНР
- •Установка РНР
- •Настройка РНР для Apache
- •Виртуальные хосты в Apache
- •Тестирование РНР
- •Установка и настройка дополнительных модулей
- •Переносимость и совместимость
- •Синтаксис РНР
- •Возможности РНР
- •Работа с базами данных
- •HTTP-аутентификация средствами РНР
- •Работа с изображениями
- •Поддержка закачки файлов
- •Поддержка HTTP-cookie
- •Использование регулярных выражений
- •Обработка ошибок
- •Управление электронными письмами
- •Вывод на экран и переменные в РНР
- •Простейшие арифметические операции
- •Простейшие логические операции
- •Циклы
- •Массивы
- •Работа со строками
- •Сессии
- •Программирование на РНР
- •Сравнение чисел
- •Вложение файлов в документ
- •Простейший счетчик посещений
- •Обработка форм
- •Отправление почты
- •Отправление письма в HTML-формате
- •Дата по-русски
- •Счетчик посещений с использованием базы данных
- •Счетчик персональной посещаемости
- •Сохраняем информацию о посещениях
- •Ах, баннеры, баннеры...
- •Счетчик посещений с выводом информации на экран
- •Счетчик сессий
- •Создание динамического меню
- •«Грабим» странички
- •Голосование на сайте
- •Гостевая книга
- •Технология создания
- •Свой чат — это просто
- •Использование специального привата
- •Интернет-магазин
- •Технология создания
- •Сервисы интернет-магазина
- •Архив рассылок
- •Совет первый: а нужно ли вам это?
- •Совет второй: забудьте все советы
- •Пример системы безопасности
- •HTTP-аутентификация в РНР
- •Защита программы
- •РНР в вопросах и ответах
- •Приложения
- •Приложение 3. Некоторые функции РНР
- •Приложение 4. Cookie
- •Приложение 5. Методы передачи данных POST и GET
- •Приложение 6. Время Unix
114 |
Программирование на РНР |
Я не привел весь код скрипта, а по порядку объяснял все действия как можно подробнее, чтобы вы не занимались бездумным копированием, а постарались самостоятельно развить предложенные мной идеи.
Счетчик посещений с выводом информации на экран
В качестве компенсации я предлагаю вам готовый скрипт вывода статистики на экран. Для этого достаточно вызвать в браузере файл stat.phtml.
Вот его код:
<?
$adds = "url.txt"; $txt = file($adds);
$i = 0;
while ($i <= count ($txt)):
$temp = trim(str_replace ("\n","", $txt [$i])) ;
list ($add, $time, $counter) = split ("^", $str); echo $add." - ".$counter." : ".$time."<br>";
$i++; endwhile; ?>
Как видите, еще проще. Единственная трудность — перевести формат времени в разумный вид, но для этого существует масса хороших и не очень алгоритмов. Их вы уже найдите сами — пусть это будет в качестве домашнего задания.
Создание динамического меню |
115 |
Счетчик сессий
Попробуем сделать счетчик сессий:
<?
session_name ("virtualbrest") ;
session_start ();
session_register("counter");
$counter = @$counter +1; ?>
<html><body>Haжмитe кнопку "Обновить",
чтобы увеличить счетчик
<br>Счетчик: <?=$counter?>
</body></html>
В первой строке кода мы инициализируем имя сессии для SID, чтобы в дальнейшем можно было легко различать разные сессии. Если этого не сделать, РНР автоматически откроет сессию с именем PHPSESID. Функция session _ start () инициализирует сессию, а функция session _ register("counter") регистрирует в сессии переменную $counter.
Если запустить данный код и несколько раз обновить окно браузера, мы увидим, как счетчик увеличивается.
Создание динамического меню
Рассмотрим, как легко можно организовать выбор нескольких позиций для отправки формы. Такое часто бывает нужно для навигации по сайту, но конкретную задачу я не ставил, а только описал общие принципы.
В том же каталоге, где будет работать этот скрипт, нужно создать файл logo.txt и внести в него нужное количество строк. Именно на основании информации из него и будет построено меню.
116 |
|
Программирование |
1<?
2$lin = file ("logo.txt");
3$а = count ($lin);
4if ($a < 11)
5{
6$size = $а;
7} else
8{
9$size = 10;
10}
11?>
12<P>
13<select name="D1" size=<? echo $size; ?>
14<? $i = 0;
15while ($i < $a) :
16echo"<optionvalue=".$i.">".$lin[$i]."</option>";
17$i++;
18endwhile; ?>
19</select><br>
20<input type="submit" value="submit" name="B2">
Сначала все данные считываются из файла в массив (строка 2). Далее, после определения размера полученного массива (строка 3), определяем размер меню (строки 4—13). Если количество пунктов менее 11, оно становится размером (строки 4—6). Если больше — размер будет равен 10, а браузер добавит полосу прокрутки (строки 7—10). Если нужно, чтобы меню состояло всего из одного пункта и было выпадающим, нужно переменной $size присвоить значение 1.
Подсчетколичества обращений кпунктамменю |
117 |
Определившись с размером, в цикле выводим весь массив таким образом, чтобы его значения были пунктами меню (строки 15—18). Осталось только добавить кнопку для отправки данных полученной формы (строки 19—20).
Только не забудьте вставить этот код между тегами <form> и </form>, а затем определиться, куда именно будут отправлены данные и каким именно методом (см. приложение 5).
Подсчет количества обращений
к пунктам меню
Рассмотрим, как организовать подсчет обращений к пунктам динамического меню, на примере подсчета скачанных файлов.
Сначала создадим форму:
<form method="POST" action="post.phtml"> <? $slll = file("url . txt"); ?>
<select name="ur" size="l" >
<option value="0"><? echo $slll[0]; ?>: -l</option> <option value="l"><? echo $ slll[l] ; ?>: -2</option> <option value="2"><? echo $ slll[2]; ?>: -3</option> <option value="3"><? echo $ slll[3]; ?>: -4</option> </select>
<input type="submit" value="смотреть" name="Bl" > </form>
В этой форме всего четыре пункта (рис. 21), но вы можете задать больше или меньше в зависимости от того, сколько нужно.
Информация считывается из файла url.txt, соответственно его нужно создать и ввести туда четыре ноля через ввод (перевод строки) и, закачав на сервер, установить права доступа.
Дальше создаем файл для обработки нажатия — post.phtml:
if ($ur == "") { $ur = 0; } $add = "url.txt";
$sl = file($add);
118 |
Программирование на РНР |
Рис. 21. Полученная форма
/* следующие четыре строки — адреса к нашим пунктам меню */
$u[0] = "http://-l"; $u[l] = "http://-2"; $u[2] = "http://-3"; $u[3] = "http://-4";
$i = 0;
while ($i <= count ($u)):
$sl[$i] = trim(str_replace ("\n","", $sl[$i])); if ($ur == $i)
{
$url = $u[$i];
$sl[$i]++;
}
$i++; endwhile;
$sav = ""; $i = 0;
while ($i <= count ($u)):
Блокируемдоступ кфайлу |
119 |
$sav = $sav.$sl[$i]."\n"; $i++;
endwhile;
$sav = str_replace ("\n\n","\n", $sav);
$fp = @fopen ($add, "w+") ; if ($fp) { $fw = @fwrite{$fp, $sav); @fclose($fp); }
header ("Location: ".$url); ?>
В этом коде все очень просто. Сначала считываем два массива: один — из файла, второй формируем в коде путем ввода адресов. Далее обрабатываем все при помощи цикла и, если индексы совпадают, увеличиваем показание нужного счетчика. Потом просто записываем весь массив снова в файл, но уже с новыми данными, и, наконец, перенаправляем посетителя на выбранный им пункт.
Блокируем доступ к файлу
Иногда возникает ситуация, при которой нельзя допустить, чтобы две операции выполнялись одновременно. Рассмотрим это на примере неоднократно описанного уже нами счетчика посещений.
Чтобы записать новое значение показания счетчика в файл, нужно его сначала обнулить, например, так:
$f = fopen("counter.txt","w+"); /* открыли файл на запись и обнулили его */
Параметр w+ указывает, что перед записью в файл его необходимо обнулить (удалить все его содержимое). Это очень удобно, так как позволяет не заботиться о содержимом файла, в который предполагается сделать запись.
Однако как бы быстро после этого ни происходила запись нового значения, нет никакой гарантии, что в это время другой процесс РНР, вызванный действиями другого посетителя, в это время не считает пустой файл и не присвоит переменной счетчика значе-
120 |
Программирование на РН |
ние ноля. После этого второй процесс запишет в файл единицу, так как будет считать, что предыдущее значение равно нолю.
Конечно, для возникновения такой ситуации необходимы специфические условия, но возможное в теории может случиться и на практике.
Решение этого вопроса очень простое. В РНР есть функция flock (descriptor, mode). Используется эта команда именно для блокировки доступа к определенному файлу (он должен быть открыт, например, командой fopen). Параметр mode может принимать такие значения:
•1 — другие процессы могут отрыть этот файл только в режиме чтения;
•2 — блокировать файл, т.е. другие процессы ничего не могут;
•3 — разблокировать файл.
Для нашего примера нужно написать так:
flock($f,2); // заблокировали файл
И когда блокировка перестает быть нужна:
flock($f,3); // разблокировали файл
Если вы забудете снять блокировку, ничего страшного не случится, так как она снимется при закрытии файла. Файл же будет закрыт автоматически при закрытии процесса (когда посетитель закроет окно браузера).
Итак, если вы примените этот способ блокировки, процесс, инициированный другим посетителем сайта, будет ждать того момента, когда блокировка будет снята. И только тогда процесс пойдет дальше.
Стоит заметить, что в последних версиях РНР этот процесс автоматизирован, однако знать слабые стороны нужно.
СОВЕТ
Если у вас стоит ограничение на занимаемое сайтом место, следите за его объемом очень внимательно: если скрипту не
