Ваш первый Сайт С использованием РНР-скриптов
ПРОГРАММА ДЛЯ ОЦЕНКИ ПОСЕТИТЕЛЯМИ WEB-СТРАНИЦЫ
Ну и теперь составим программу (ocenka.php) для оценки посетителем вашей страницы по пятибалльной шкале. Эта программа выводит небольшую форму, состоящую из выпадающего списка с оценками (от 1 до 5) и кнопкой «Оценить», при нажатии на которую запускается эта же программа
(ocenka.php), которая высчитывает средний балл и выводит его в окно браузера (рис. 6.6).
^Кездодство ж&нт этой' ет«т»е;'4 Средняяоценка:4Ш ;у - '
{5 (Отличный материал!) "т] Оценить J
Рис. 6.6
В окно браузера мы выведем также и общее количество оценок, т. е. сколько раз эта страница была уже оценена.
Сначала в рабочей папке сервера htdocs создайте подпапку осепка. Там у нас будет храниться текстовый файл (он будет создан программно) с количеством оценок и средней оценкой.
Программа несложная, и если вы разобрались с программой второго варианта счетчика (см. листинг 4.7), то разобраться с приведенным внизу листингом (6.5) не составит труда. Создайте в редакторе новый файл и сохраните его в рабочей папке htdocs под названием ocenka.php.
Листинг 6.5 (файл Ocenka.Php) <?Php
$dir="ocenka";
$ocenka=$ind.".txt";
$way="$dir/$ocenka";
If(!isset($_POST['bair]))
{
If(file_exists($way)==true) {
$file=file($way); $vsego=(int)$file[0]; $srednee=(float)$file[l];
Echo "<B id=lolo2>I^H4ecTBO Оценок Этой Статье: $vsego</Bxbr>";
Echo "<B Id=lolo2>CpeДняя Оценка: $srednee</Bxbr>"; }
Echo "<form method=POST action=ocenka. php> <input name=ind type=HIDDEN value=$ind> <select name=ball>
<option value=5>5 (Отличный материал!)</орйоп>
<option value=4>4 (В общем, хорошо!)</option>
<option value=3>3 (Неплохо, но можно было бы и лучше!)</орйоп> <option value=2>2 (Плохо, зря я только зашел сюда!)</ор1юп>
<option value=l>l (Лучше бы ты землю пахал, чем делал бы сайты!)</орНоп>
</select>
<input name=submut type=SUBMIT Уа1Ие=Оценить>
</form>"; }
Else
{
$ball=$_POST['bair]; $ind=$_POST['ind']; $ocenka=$ind.".txt"; $way="$dir/$ocenka";
If(file_exists($way)!=true) {
$vsego=l; $srednee=$ball; $count=$vsego."n".$srednee; $open=fopen($way, "w+"); fwrite($open, Scount);
Fclose(Sopen);
}
Else {
$file=file($way); $vsego=(int)$file|0); $srednee=(float)$file[lj; $vsego++;
$srednee=($srednee*($vsego-l)+$ball)/$vsego;
$srednee=round($srednee, 2);
$count=$vsego."n".$srednee;
$open=fopen($way, "r+");
Flock($open, LOCK EX);
Fwrite($open, Scount);
Flock($open, LOCK UN);
Fclose($open);
}
Echo "<div Id=,lolo'>БлAГOДApИм Вас За OueHKy</divxbr>";
Echo "<a href=# onClick=^istory. backO'xbutton>BepHyTbCfl</button></a>";
}
?>
Разберем строчки кода. Многие из них вам должны быть уже понятны. <?php
$dir="ocenka"; - присваиваем переменной $dir название папки, где будет храниться текстовый файл с количеством оценок и средней оценкой. Эта папка (осепка) должна быть вами создана заранее;
$ocenka=$ind.".txt"; - переменной Socenka (це путать с названием папки!) присваиваем название текстового файла с количеством оценок и средней оценкой. Переменная $ind у нас определена (пока не нажата кнопка «Оценить») на странице statji.php. Текстовый файл будет иметь такое же название, но, естественно, с расширением txt. Не пропустите точки! В этой строке их две: первая - знак конкатенации или соединения, вторая внутри кавычек (расширение любого файла начинается с точки);
$way="$dir/$ocenka"; - переменной $way присваиваем путь к текстовому файлу. Вообще можно было 3 строчки соединить в одну (Sway="ocenka"/Sind.".txt"), А можно написать так, как я. Выбирать вам;
If(!isset($_POST['ball'])) - проверяется условие, которое истинно, если элемента суперглобального массива SPOSTf'ball'] еще не существует, т. е. кнопка в форме «Оценить» еще не нажата и данные из формы еще не получены. Именем name=ball мы назвали выпадающий список select (сама форма будет выводиться несколькими строчками ниже);
If - итак, код между фигурными скобками под номером 1 будет выполняться, если кнопка «Оценить» еще не нажата;
If(file_exists($way)==true) - внутри первого условия ставим второе, которое истинно, если текстовый файл с количеством оценок и средним баллом уже создан, а создается он при первой же оценке (смотри этот код чуть ниже);
2{ - итак, код между фигурными скобками под номером 2 будет выполняться, если текстовый файл уже был создан;
Sfile=file($way); - функция file, если помните, создает массив строк из содержимого текстового файла (путь к нему находится в переменной Sway). В текстовом файле (он будет создан ниже) будет две строки. В первую строку будет записано общее число оценок, во вторую - средний балл. Таким образом, в переменной Sfile (не путать с функцией file) будет простой массив с двумя элементами;
Svsego=(int)$file[0]; - присваиваем переменной Svsego нулевой элемент массива Sfile. Оператором (int) мы указываем, что нулевой элемент - целочисленное число. Это действительно так, поскольку общее количество оценок не может быть дробным числом;
Ssrednee=(float)S file [1]; - присваиваем переменной Ssrednee первый элемент массива Sfile. Оператором (float) мы указываем, что первый элемент - десятичное число. Это действительно так, поскольку средний балл у нас будет дробным числом;
Echo "<В id=lolo2>Количество оценок этой статье: $vsego</B><br>";
Echo "<В id=lolo2>Средняя оценка: $srednee</B><br>"; - выводим элементы массива в браузер, т. е. общее число оценок и средний балл; 2}
Echo "<form method=POST action=ocenka.php> - создаем форму, данные которой методом POST отсылаем на эту же страницу ocenka.php;
<input name=ind type=HIDDEN value=$ind> - вводим скрытое поле для передачи на эту же страницу после нажатия кнопки «Оценить» значение переменной $ind. Зачем это нужно объяснялось в разборе прошлого листинга 6.4;
<select name=ball> - создаем раскрывающийся список с именем name=ball, Состоящий из пяти элементов, заданных тегом <option>. Каждому элементу списка присваивается свое значение value (от одного до пяти). Текст между тегами <option> и </option> - это то, что увидит посетитель в списке. При нажатии кнопки «Оценить» на страницу, указанную в теге <form>, т. е. на эту же страницу, передастся элемент суперглобального массива $ POST'['ball'], которое будет содержать то значение value (балл), которое выберет посетитель; <option value=5>5 (Отличный материал!)</option> <option value=4>4 (В общем, xopotuo!)</option> <option value=3>3 (Неплохо, но можно было бы и получше!)</option> <option value=2>2 (Плохо, зря я только зашел сюда!)</option> <option value=l>l (Лучше бы ты землю пахал, чем делал бы сайты !)</option>
</select> - окончание раскрывающегося списка;
<input name=submut type=SUBMIT Value=Oцeнumь> - кнопка для отправки данных из этой формы. В данном случае у нас двое данных: выбранная оценка, которая поместится в элемент суперглобального массива $ POST ['ball'] И значение переменной $ind, которое поместится в элемент суперглобального массива $_POST['ind'] </form>";
1} - окончание кода между фигурными скобками под номером 1, который будет выполняться, если кнопка «Оценить» еще не нажата;
Else - если кнопка «Оценить» нажата и данные из формы отправлены, то выполнится код между фигурными скобками под номером 3;
З{
$ball=$ POST['ball']; - переменной $ball присваиваем значение элемента суперглобального массива $ POST ['ball'], т. е. оценку, которую дал посетитель;
$ind=$_POST['ind']; - заново определяем переменную Sind, присваиваем значение элемента суперглобального массива $ POST ['ind']',
$ocenka=$ind. ".txt"; - поскольку прошлую переменную $ind мы определи или заново, так же заново нужно определить переменные Socenka и Sway; Sway ="$dir/Socenka"; '
If(file_exists(Sway)!=true) - если текстовой файл с количеством оценок и средней оценкой еще не создан, то создим его в блоке команд в фигурных скобках под номером 4;
4{ - весь код в фигурных скобках под номером 4 выполнится только один - единственный раз, когда страницу оценят впервые;
Svsego=l; - переменной Svsego присваиваем единицу. Текстовый файл создается только один раз, когда странице впервые дают оценку. Естественно, общее число оценок становится равным единице;
Ssrednee=$ball; - переменной Ssrednee, где потом мы будем хранить средний балл, присваиваем введенный посетителем первый балл. Поскольку у нас только одна оценка, средний балл, естественно, будет равен первой оценке;
$count=Svsego. "п".Ssrednee; - создаем строку, вернее, две строки, разделенные символом «п»;
$open=fopen($way, "w+"); - создаем и открываем, наконец, новый текстовый файл, путь к которому указан в переменной Sway;
Fwrite($open, Scount); - записываем в созданный файл значение переменной Scount. После этой команды в текстовом файле будет две строки. В первой строке будет единица, во второй - средний балл, равный первой оценке;
Fclose(Sopen); - закрываем текстовый файл;
4}
Else - если текстовый файл с количеством оценок и средней оценкой уже создан, т. е. страницу оценивают уже не впервые, то выполнится блок команд в фигурных скобках под номером 5;
(5
Sfile=file($way); - как w раньше (смотри данный код чуть выше), создаем массив строк из текстового файла и присваиваем элементы этого массива переменным Svsego и Ssrednee; Svsego=(int)S fde [0]; Ssrednee=(float) S file [1];
Svsego++; - увеличиваем общее число оценок на единицу, поскольку посетитель сделал очередную оценку;
Ssrednee=($srednee*($vsego-l)+Sball)/$vsego; - здесь вычисляем среднее значение оценок, т. е. средний балл. Постарайтесь разобраться в этой строке сами. Здесь чистая математика. Мы получаем десятичное число с множеством цифр после запятой;
$srednee=round($srednee, 2); - при помощи математической функции round Округляем полученное число Ssrednee до двух знаков после запятой (второй аргумент этой функции - число 2). Думаю, этого достаточно;
$count=$vsego."n".$srednee; - опять создаем две строки с уже новыми данными;
$open=fopen($way, "г+"); - открываем текстовый файл для записи; Flock($open, LOCK EX); - делаем блокировку текстового файла. Зачем это нужно, объяснено в разд. 4.3;
Fwrite($open, Scount); - записываем новые данные в текстовый файл; Flock($open, LOCK UN); - разблокируем текстовый файл; Fclose($open); - закрываем файл;
5} - окончание блока команд, выполняющихся, когда текстовый файл с количеством оценок и средней оценкой был уже создан; Echo "<div id='lolo'>Благодарим вас за оценку</div><br> ";
Echo "<а href=# onClick= 'history.back()'><ЬиПоп>Вернутъся</ЬиПоп></a> "; - Выводим в браузер надпись и кнопку для возврата (аналогично, как и в прошлом листинге 6.4);
3} - окончание блока команд, выполняющихся, если кнопка «Оценить» была
Нажата и данные из формы отправлены.
?>
Поле того, как все правильно будет сделано, запустите программу Statji.php. Вверху у вас должна быть двухколонная таблица с указанием названия статей и их авторов. На рис. 6.7 показана верхняя часть окна браузера, как у меня.
J ; Наз&оние статьи |
| Автор статьи |
|
^крещение вечности |
Цдлк&фт Сгель*ер |
■ |
Стратегический план Вселенной |
|лл№Йрт Стелнюр |
|
(Солнечная Система - пюрение рдаумо? |
Jjdwv. Ввйцвх<лвкйй |
—J |
[Планеты других звёзд |
1|Л КС АИФОМ АЛИТИ |
|
{Судьба планетных систем |
Ijr. М {уйиицки* |
|
[Параллельные вселенные |
- ' ш*ж« Т«гма£к ' « |
Рис. 6.7 |
Данные шесть статей я нашел в Интернете и расположил их по папкам с 1 по 6 и в HTML-страницу каждой статьи вставил meta-теги (см. разд. 6.3, рис. 6.4). При нажатии на ссылку какой-либо из статей она открывается в отдельном окне. Для вывода в таблице ссылки на новую статью вам надо будет только создать папку (в данном случае под номером 7), вставить туда HTML - файл со статьей и не забыть в этом HTML-файле написать пару строк (meta- теги) с указанием названия статьи и его автора.
Flip Ш |
1Ш1111 |
После двухколонной таблицы в браузер выведется одноколонная, с отзывами посетителей, а также текстовые поля для ввода данных посетителя и его нового отзыва (рис. 6.8).
Здесь 8ьх можете оценить подборку и оставить своё сообщение
Н&тр «нмй$г ф^^йга ЦМЛШ
Ошйшт ^«a&fpit /
Адексамдр lolOE^Uvlchpii, Цйб«*вл£Но; 22.08.2007
Iliii |
Алексей «-«tail: Akx@aket. ni Добавлено: 22Я8.2007 Статьи иеяяохие. но хотелось бы побольше
Ваше am Г
Ваш г
Добавить < v • Рис. 6.8 |
Введите вымышленные данные и оставьте отзыв. После нажатия кнопки «Добавить» вы со страницы statji.php попадете на страницу soobshenie.php. Вы можете увидеть сообщение, как на рис. 6.1. Жмите «Отмена». Далее на странице soobshenie.php вы увидите кнопку «Вернуться». После нажатия на нее вы опять должны попасть на страницу statji.php. Ваши введенные данные и отзыв должны появиться в таблице отзывов. Я, например, ввел 3 отзыва (см. рис. 6.8).
Ну, а дальше, внизу в браузере, должен появиться выпадающий список с оценками и кнопка «Оценить», как на рис. 6.6. Правда, сначала вы не уви
дите там надписей о количестве оценок и среднем балле. После нажатия на кнопку вы попадете на страницу ocenka.php с кнопкой «Вернуться». Нажмите на нее, и вы вновь попадете на страницу statji.php, но там уже отобразится и количество оценок, и средний балл. Если у вас все получилось, то прекрасно, однако есть один нюанс. Один и тот же посетитель может оценивать одну и ту же страницу несколько раз и ради прикола наставить вам кучу колов и двоек. Как этого избежать? Предлагаю решить вам эту задачу самостоятельно. Я лишь могу подсказать один из способов. Вам нужно будет в папке осепка создать (программно) еще один текстовый файл, где будут храниться IP-адреса посетителей, которые выставили оценку. Как только посетитель выставил оценку, его ip заносится в этот текстовый файл (если такого ip там еще нет). Если такое ip уже есть, то выводится сообщение типа «Вы уже оценивали», и выполнение программы оценки ocenka.php приостанавливается. Конечно, этот метод крайне неэффективен, поскольку на одном ip может находиться много пользователей. Получается, что другие пользователи с таким же ip уже не смогут поставить оценку. Можно так же просто регистрировать посетителей, сохранять его логин и пароль в каком-нибудь текстовом файле. И если посетитель с парой «логин-пароль» уже ставил оценку, ему будет запрещено снова оценивать страницу.