Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PHP обучение на примерах - Кухарчик А..pdf
Скачиваний:
139
Добавлен:
24.05.2014
Размер:
24 Мб
Скачать
☆

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); // разблокировали файл

Если вы забудете снять блокировку, ничего страшного не случится, так как она снимется при закрытии файла. Файл же будет закрыт автоматически при закрытии процесса (когда посетитель закроет окно браузера).

Итак, если вы примените этот способ блокировки, процесс, инициированный другим посетителем сайта, будет ждать того момента, когда блокировка будет снята. И только тогда процесс пойдет дальше.

Стоит заметить, что в последних версиях РНР этот процесс автоматизирован, однако знать слабые стороны нужно.

СОВЕТ

Если у вас стоит ограничение на занимаемое сайтом место, следите за его объемом очень внимательно: если скрипту не

Соседние файлы в предмете Программирование