русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Форум Web-сайта навчального закладу


Дата добавления: 2015-07-09; просмотров: 578; Нарушение авторских прав


Форум {конференція) — це Web-еквівалент телеконференцій, які беруть свій початок від електронних дошок конференцій (bulletin board system, BBS). Ці засоби дають можливість брати участь у дискусіях з іншими «читачами», обговорювати різноманітні питання. Форум може відігравати важливу роль у Web-сайті навчального закладу. Учні зможуть обговорити різноманітні питання, присвячені навчальному процесу школи, позакласній діяльності, задати питання вчителям. Форум буде цікавим для абітурієнтів та випускників навчального закладу.

Ще не так давно створити власний форум було під силу не кожному. Необхідним було глибоке знання технології CGI та мови програмування Perl.

Проте з появою тандему PHP+MySQL програмування форумів стало цікавою і навіть «захоплюючою» задачею, доступною користувачам різної кваліфікації

До програмування форумів існує така кількість підходів, як і кількість сайтів, що включають сторінку форуму. Змінюється кількість файлів, з яких складається форум, форми виведення інформації, методи захисту від повідомлень що можуть містити деструктивний код. Форуми використовують в основному два методи виведення інформації. Перший — це виведення лише тем повідомлень і кількості відповідей на них. До самого повідомлення і відповідей можна перейти шляхом клацання на відповідних гіперпосиланнях. Проте, на нашу думку, така форма у деяких випадках є не зовсім зручною, оскільки користувачу доводиться витрачати додатковий час на завантаження кожного повідомлення і відповіді на нього.

Є шанс пропустити деякі повідомлення з цікавою інформацією, тому для створення нашого форуму було вибрано іншу форму — коли всі повідомлення і відповіді на них виводяться повністю і на спільній сторінці. Вигляд сторінки форуму подано на рис. 2.3.

 



 



Рис. 2.3

 



 



Для збереження записів форуму створимо базу даних inter, таблицю forum з полями, поданими у таблиці 2.6 (верхній рядок подано англійською для простішого створення бази за допомогою РНРМуAdmin).

 




Таблиця 2.6.Поля таблиці forum

 



Field Type Null Default Extra Призначення
id tinyint(4) No auto_increment номер запису
name varchar(20) No     ім'я
subj varchar(40) No     тема повід.
comments text No     текст повід.
date varchar(20) No     дата повід.
mail varchar(255 No     email-адреса

 

SQL-запит для створення такої таблиці має вигляд:

CREATE TABLE forum (

id tinyint(4) NOT NULL auto_increment,

name varchar(20) NOT NULL,

subj varchar(20) NOT NULL,

comments text NOT NULL,

date varchar(20) NOT NULL,

mail varchar(255) NOT NULL,

PRIMARY KEY (id));

Відмітимо, що для збереження дат у MySQL є відповідний тип поля — date. Оскільки в даній задачі не передбачається ніяких маніпуляцій з датами, для збереження дати повідомлення обрано символьний тип varchar().

Форум складається з трьох файлів forum.php, writeforum.php i admin.php.

Скрипт forum, php виводить повідомлення з бази даних, а також відображає форму, за допомогою якої користувач може передавати повідомлення. Текст файла forum, php подано в лістингу

 



Лістинг 2.19

 



<HTML>

<HEAD>

<TITLE>Фopyм</TITLE>

<МЕТА content="text/html; charset=windows-1251" http-equiv=Content-Type>

<?php

// ініціалізація змінних

Define("DBName", "inter");

define("HostName", "localhost");

define("UserName", "root");

define("Password", "");

// з'єднання з базою даних

$db=mysql_connect(HostName, UserName, Password);

if(!$db)

{

echo "He можу з'єднатись з сервером MySQL !<br>"; exit; }

if(!mysql_select_db(DBName, $db))

{

echo "He можу з'єднатись з базою ", DBName,"! <br>"; exit;

}

?>

</HEAD>

<BODY aLink=#cc9933 bgColor=white link=#cc9933 vLink=#cc9933>

<CENTER>

<TABLE border=0 cellPadding=0 width=620>

<TR>

<TD align=middle>

<h2>Поспілкуємось! </h2>

</TD>

</TR>

<TR>

<td>

<?php

/*виведення повідомлень з бази даних*/

//вибір усіх записів, сортування за спаданням

$result = mysql_query("SELECT * FROM forum ORDER BY id

DESC",$db);

$numbe r=mysql_numrows( $ result);

$i=0;

while ($i<$number)

{

$name=mysql_result($result,$i,"name");

//отримання імені

$subj=mysql_result($result, $i, "subj");

//отримання теми

$mail=mysql_result($result,$i,"mail");

//отримання email

$comments=mysql_result($result,$i,"comments");

//отримання тексту повідомлення

$date=mysql_result($result,$i,"date");

//отримання дати

//форматоване виведення повідомлення

echo "<h4 align=center>

<font color=\"#637673\">$subj</font></h4>\n";

echo "$comments<br>\n";

echo "<a href=\"mailto:$mail\">$name</a>:

<font color=\"#555555\">$date</font>";

$i++; }

echo "</p>";

echo "<HR>";

mysql_close ($db);

?>

<center>

<FONT C0L0R="#FF8000"><H3>Додати повідомлення</НЗ> </FONT>

 



<!-- виведення форми для відсилання повідомлень-->

<FORM ACTION="writeforum.php" METHOD=P0ST>

<Р ALIGN="center">

<FONT FACE="Arial" SIZE="2">

Teмa<SUP>*</SUP>:<INPUT TYPE="text" NAME="fsubj" SIZe="25"

MAXLENGTH="40"><BR>

Ваше ім'я<SUP>*</SUP>:<INPUT TYPE="text" NAME="fname"

SIZE="12" MAXLENGTH="20">

E-mail:<INPUT TYPE="text" NAME="fmail" SIZE="15">

<P>&nbsp;

Текст повідомлення<sup>*</sup>: <TEXTAREA R0WS="5" NAME="fcomments"

C0LS="43" MAXLENGTH="3000"X/TEXTAREA>

<p>&nbsp;

</FONT>&nbsp;

<INPUT TYPE="submit" NAME= "submit" VALUE="Відправити">

<INPUT TYPE=" reset" VALUE ="Відміна">

</FORM>

<P ALIGN="left"><SUP>*</SUP> - обов'язкові поля

<hr>

</div>

</table>

</center>

</BОDY>

</htrnl>

 



Як бачимо, код PHP можна поділити на частини. Частину, що відповідає за з'єднання з сервером баз даних, для зручності модифікації винесено в голову документа (дескриптор <HEAD></HEAD>). Другу частину, що виводить повідомлення з бази даних, поміщено у відповідне місце таблиці.

Скрипт writeforum. php отримує дані з форми файла forum, php, перевіряє їх та записує до бази даних форуму. Код скрипту подано в лістингу.

Код запису до бази даних дещо складніший, ніж у випадку, який розглянуто в прикладі побудови адресної бази даних. Це пояснюється необхідністю додаткової перевірки наявності даних про ім'я атора, тему та текст повідомлення, правильність введення e-mail-адреси. Крім того, повідомлення можуть містити деструктивний код, наприклад, JavaScript-програму, яка стирає вміст документа і поміщує туди власний код сторінки (deface).

Велику увагу слід приділяти контролю довжини повідомлень. І, хоча такий контроль здійснюється у самій формі введення даних (за допомогою атрибута maxlength), ці обмеження можуть легко обійти зловмисники шляхом підміни форми на власну.

Зазначимо, що розуміння ділянок коду, який використовуються для перевірки адреси, захисту від HTML-дескрипторів, може викликати в початківців деякі труднощі, тому на початку достатньо без заглиблення в суть коду просто переписувати їх у потрібне місце власних проектів.

 



Лістинг 2.20

 



<?php

//ініціалізація змінних

define("DBName", "inter");

defineO'HostName","localhost");

define("UserName","root");

define("Password","");

// функція перевіряє правильність введення email-адреси

function valid_email ($adr)

{

return (ereg('"[-!#$%&\'*+\\./0-9=?A-Z_a-z{|}-']+'.

'@'.

' [-! #$%&\' *+\\ /0-9=?A-Z_a-z{ | }"]+/.'.

' [-! #$%&Y *+\\./0-9=?A-Z"_'a-z{ | }""]+$',

$adr)); >

error_reporting(63); if (!valid_email($fmail) && !empty($fmail))

{ print "<body bgcolor=#3a6ea5 text=#FFFFFFXscript>history.back(-1);

alert('e-mail введено неправильно' )</scriptx/body>"; exit; }

// виводить помилку, якщо не введено ім'я;

error_reporting(63);

if($fname=="")

{ print "<body bgcolor=#3a6ea5 text=#FFFFFF><script>history.back(-1);

alert('He введено ім\'я') </scriptx/body>"; exit; }

// виводить помилку, якщо не введено повідомлення;

error_reporting(63);

if($fcomments=="")

{ print "<body bgcolor=#3a6ea5 text=#FFFFFFxscript>history.back(-1);

alert('He введено повідомлення' )</scriptx/body>"; exit; }

// виводить помилку, якщо не введено теми;

error_reporting(63);

if($fsubj=="")

{ print "<body bgcolor=#3a6ea5 text=#FFFFFF><script>history.back(-1);

alert('He введено теми' )</scriptx/body>"; exit; }

// захист від HTML тегів, заміна символів \п на //<br>.

$fcomments = htmlspecialchars($fcomments);

Sfcomments = nl2br($fcofflments);

Sfcomments = ereg_replace("\n","",$fcomments);

$fname = htmlspecialchars($fname);

$fnane = nl2br($fname);

$fname = ereg_replace("\n","",$fname);

$fname = stripslashes($fname);

$fsubj= htmlspecialchars($fsubj);

$fsubj = nl2br($fsubj):

$fsubj = ereg_replace("\n","",$fsubj);

$fsubj = stripslashes($fsubj);

// $maxmsg задає максимальну довжину повідомлення в

// кількості символів;

$maxmsg = 3000;

$lenmsg = strlen($fcomments);

if ($lenmsg > $maxmsg)

{print "<body bgcolor=#3a6ea5 text=#FFFFFF> <script>history.back(-1);

alert('Перевищена довжина повідомлення')</scriptx/body>"; exit; }

// встановлення з'єднання з базою даних

$db = mysql connect(HostName,UserName,Password);

if(!$db)

{echo "He можу з'єднатися з севером MySQL<br>"; exit;}

if (!mysql_select_db(DBName,$db) )

{ echo "He можу з'єднатися з базою", DBName,"!<br>"; exit; }

//визначення поточної дати в форматі: день місяць: година.хвилина

$data=DATE("d M: Н.і");

// sql-запит, що заносить дані до бази.

$sql = "INSERT INTO forum (name, subj, mail, comments, date) VALUES

('$fname', '$fsubj', '$fmail', '$fcomments', '$data')";

// пересилання запиту серверу

$result = mysql_query($sql);

//закриття з'єднання з MySQL

mysql_close ($db);

//переадресація броузера на сторінку forum.php

Header("Location: forum.php");exit;

?>

У наведеному коді прослідковується важлива функція Header(), яка служить для пересилання Web-серверу рядка HTTP-заголовка. Тут для редиректу (переадресації) на сторінку forum, php серверу пересилається рядок «Location: forum.php».

Для адміністрування форумом служить скрипт admin, php. Відмітимо, що він використовується лише для вилучення записів. Відображення сторінки admin. php у броузері подано на рис.2.4. Форма служить для введення пароля та номерів записів для знищення.

 



 




 



 



Рис. 2.4

 



Код скрипту:

 



Лістинг 2.21

 



<html>

<head>

<title>Forum administrater</title>

<META content="text/html; charset=windows-1251"

http-equiv=Content-Type>

</head>

<body>

<?php

// ініціалізація змінних

define("DBName","inter");

define("HostName","localhost");

define("UserName","root");

define("Password","");

/*функція виводить записи і відображає форму*/

function display_form() {

global $PHP_SELF;

//з'єднання з базою

$db=mysql_connect(HostName, UserName, Password); i

f(!$db)

{ echo "He можу з'єднатися з сервером MySQL!<br>"; exit; }

if(!mysql_select_db(DBName, $db))

{ echo "He можу з'єднатися з базою!<br>"; exit; }

// виведення впорядкованих за спаданням записів

$result = mysql_query("SELECT * FROM forum ORDER BY id DESC",$db);

$number=mysql_numrows($result);

$i=0;

while ($i<$number)

{

$id=mysql_result($result,$i,"id");

$name=mysql_result($result,$i,"name");

$subj=mysql_result($result,$i,"subj");

$mail=mysql_result($result,$i, "mail");

$comments=mysql_result($result,$i,"comments");

$date=mysql_result($result,$i,"date");

printf ("<p><B>%S: %S </B><br>\n",$id, $subj);

printf ("%S <br>\n", $comments);

printf ("%S: %S %S<br> \n", $date, $name, $mail);

$i++;

echo "<p> <HR><p>&nbsp";

?>

<!-- Форма для введення пароля та діапазону записів, які підлягають знищенню. Скрипт, що опрацьовує дані з цієї форми, знаходиться у тому самому файлі (форма викликається сама на себе).-->

<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD=P0ST>

Пароль: &nbsp;<input type="password" name="secret_word" size="12"><BR>

Вилучити записи з :

<input type="text" name="from" size="2" maxlength="2">до:

<input type="text" name="to" size="2" maxlength="2"></br>

<input type="submit" name= "submit" value="Вилучити!">

<input type="reset" value="C6poc">

<hr>

<INPUT TYPE=HIDDEN NAME="stage" VALUE="results'

</FORM>

<?php

}// кінець функції display_form()

/* функція, що опрацьовує дані, отримані з форми*/

function process_form() {

global $from;

global $to;

global $secret_word;

// якщо пароль неправильний, то вивести відповідне повідомлення і вийти

if ($secret_word!="superpuper"){echo"<p> Accees Denied!"; exit;}

//з'єднання з базою MySQL

$db = mysql_connect(HostName, UserName, Password);

if(!$db)

{echo "He можу встановити з'єднання з севером MyS0L<br>"; exit;}

if (!mysql_select_db(DBName,$db) )

{ echo "He можу з'єднатися з базою", DBName,"!<br>"; exit; }

//sql-запит на видалення записів

$sql= "DELETE FROM forum WHERE id BETWEEN $from AND $to";

// передача запиту серверу

$result = mysql_query($sql);

echo "Дані оновлено!\n";

// закриваємо з'єднання

mysql_close ($db);

}//кінець функції process form()

?>

<?phр

/*головна ділянка коду*/

// перевіряємо чи змінна $stage не порожня -

//опрацьовуємо дані, виводимо форму

// в іншому випадку тільки виводимо форму

if (!empty($stage)) { process_form(); display_form(); }

else { display_form(); }

?>

</body>

</html>

При виведенні даних використовується функція printf (), знайома для тих, хто колись працював з мовою С чи Perl. У наведених функціях комбінація %s означає те, що на її місці повинно бути значення змінної, яка знаходиться у другій половині виразу printf, причому приведено до типу «рядок».

У попередніх прикладах форма і php-програма, що опрацьовує дані, знаходились у різних файлах. У цьому прикладі використано цікавий прийом, коли форма і програма, що опрацьовує дані, знаходяться в тому самому файлі. Відбувається так званий «виклик форми самої на себе». Для цього використано такий відкриваючий дескриптор форми:

<FORM ACTION="<?php echo $PHP_SELF; ?>" METHОD=P0ST>

Атрибуту ACTION присвоюється значення, згенерованс php-кодом. У коді використовується змінна $PHP_SELF, значенням якої є ім'я та URL поточної сторінки. Використання цієї змінної гарантує коректну роботу скрипту у випадку перенесення його в інший каталог, або навіть на інший комп'ютер.

Форма має також одне скрите поле:

<INPUT TYPE=HIDDEN NAME="stage" VALUE="results'>

Це поле є невидимим у броузері і служить для створення змінної $stage для ідентифікації стану сторінки: у даний момент сторінка відображає зміст бази , і форму (значення змінної $stage порожнє), чи опрацьовує дані з форми (значення $stage не є порожнім).

Така ідентифікація використовуєтся в глобальній частині PHP-коду (не у тілі функцій):

if (!empty($stage)) { process_form(); display_form(); }

else { display_form(); }

Якщо адміністратор форуму перший раз (в даному сеансі) звертається до сторінки admin, php, то змінна $stage — порожня і тому викликається функція display_form(), яка виводить всі записи, збережені у базі даних, а також відображає форму. Після введення пароля, діапазону записів, що підлягають видаленню, і натискування на кнопці «Вилучити» викликається ця сама сторінка. Але у даному випадку змінна $stage не є порожньою і вищенаведений оператор викликає функцію process_form() — для опрацювання даних, отриманих із форми, тобто власне вилучення записів та display_form() — для виводу модифікованої бази та відображення форми.

Необхідно також звернути увагу на те, що у тілі функцій змінні описуються з директивою global. Вона вказує, що ці змінні є глобальними, тобто областю дії їх є вся сторінка.

Описаний форум можна удосконалювати. Перш за все доцільно зробити так, щоб на одну сторінку виводилось не більше ЗО повідомлень. Доступ до решти повідомлень може здійснюватись за допомогою гіперпосилання, розміщеного внизу сторінки.

 



Контрольні запитання

1.Яке розширення повинен мати файл, в якому міститься РНР-сценарій?

2. Які можливості має MySQL?

3. Як створити базу даних у MySQL?

4. Чи можна код РНР поділяти на частини?

 





<== предыдущая лекция | следующая лекция ==>
Отримання даних з бази MySQL | Створення шкільної Intranet


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.641 сек.