
- •2.1. Загальний огляд технологій створення інтерактивних
- •5.1. Особливості методичної системи вивчення основ
- •1 Розділ
- •1.1. Основні принципи побудови та функціонування мережі Internet
- •1.2. Форматування тексту мовою html
- •1.3. Використання гіперпосилань
- •1.5. Списки і таблиці у html-документах
- •1.6. Використання фреймів
- •1.7. Каскадні таблиці стилів (css)
- •1.8. Введення даних за допомогою форм
- •1.9. Розробка Web-сайтів
- •2 Розділ
- •2.1. Загальний огляд технологій створення інтерактивних Web-документів
- •2.2. Використання скриптів JavaScript
- •2.3. Використання рнр і MySql
- •Додатки Створення шкільної Intranet
2.3. Використання рнр і MySql
Як зазначалось, PHP-сценарії вбудовуються у код HTML-сторінки, але на відміну від JavaScript інтерпретуються і виконуються на сервері. Розглянемо приклад. Нехай, наприклад, броузер звертається до сервера із запитом файла example.php з таким кодом:
Лістинг 2.12
<html>
<head>
<title>EXAMPLE</title>
</head>
<body>
Приклад простої рhр-сторінки<bг>
<?php
echo "Привіт, Я PHP-сценарій!";
?>
</body>
</html>
Розширення файла (.php) послужило для сервера сигналом опрацювати дану сторінку інтерпретатором PHP-коду Опрацювавши PHP-скрипт, включений у цей файл, сервер відішле броузеру сторінку з написом:
Приклад простої РНР-сторінки
Привіт, Я РНР-сценарій!
Згенерований на основі даного скрипту код можна переглянути за допомогою команд броузера «Вигляд-> У вигляді HTML»:
Лістинг 2.13
<html>
<head>
<title>EXAMPLE</title>
</head>
<body>
ПРИКЛАД ПРОСТОЇ РНР-СТОРІНКИ<bг>
Привіт, Я РНР-сценарій!
</body> </html>
У цьому коді немає жодних інструкцій РНР, тобто сервер, опрацювавши PHP-скрипт, відсилає клієнту лише результат його виконання, поміщений у вихідний файл.
Коротка історія РНР
Початком РНР можна вважати 1994 рік, коли Rasmus Lerdorf вирішив розширити можливості своєї домашньої сторінки інструментом для відслідковування читачів його інтерактивного резюме. Новий інструмент отримав назву Personal Home Page Tools. Версія включала простіший набір команд. До середини 1995 року з'явилась друга версія РНР. Хоча назва залишилася така сама, ця технологія могла використовуватись для створення потужних web-серверів, а не тільки домашніх сторінок. Замість розробки численних cgi-програм мовою Perl PHP дозволяє поміщати прості скрипт-програми безпосередньо в HTML-файл. Це підвищує загальну продуктивність web-сторінок, уникаючи запуску на сервері інтерпретатора Perl-а. Вбудована підтримка баз даних робить тривіальною розробку web-сторінок із доступом до баз даних.
За даними NetCraft у 1999 році РНР використовувався в більше, ніж 1 млн. доменах. На сьогодні доступна 4 версія РНР.
Вступ до MySQL
MySQL — компактний багатопоточний сервер баз даних, що характеризується високою швидкодією, надійністю і легкістю використання. MySQL розроблено компанією ТсХ для внутрішніх потреб, пов'язаних з опрацюванням великих баз даних. Компанія стверджує, що використовує MySQL з 1996 року на сервері з більш ніж 40 базами даних, які містять 10000 таблиць, з яких близько 500 мають більше 7 мільйонів рядків.
MySQL зручно використовувати для малих і середніх додатків. Вихідний код сервера компілюється на багатьох платформах. MySQL-сервер є безкоштовним для некомерційного використання. Він підтримує мову запитів SQL в стандарті ANSI 92.
MySQL має такі можливості:
1) підтримується необмежена кількість користувачів, які можуть одночасно працювати з базою;
2) кількість рядків у таблицях може досягати 50 млн.;
3) швидке виконання команд;
4) проста та ефективна система безпеки.
Зазначимо, що для досягнення максимальної швидкості обробки запитів розробники вимушені були відмовитись від реалізації деяких вимог щодо реалізації реляційних СУБД, зокрема, в MySQL відсутні:
1) підтримка вкладених запитів типу SELECT * FROM tablel WHERE id IN (SELECT id FROM table2);
2) не релізована підтримка транзакцій, пропонується використовувати LOCK/ UNLOCK TABLE (така можливість з'явилась у версії 3.23);
3) відсутня підтримка зовнішніх ключів (foreigen key).
Перелічені обмеження не є визначальними при створенні Web-додатків, що у поєднанні з невисокою вартістю дозволило серверу набути великої популярності.
Завантаження та інсталяція РНР і MySQL
Описані раніше приклади можна було тестувати шляхом відкриття записаного на локальному диску HTML-файла в броузері. Робота з РНР та MySQL потребує наявності Web-сервера. Вибір конкретного програмного забезпечення Web-сервера залежить від операційної системи комп'ютера, на якому планується його використання. Для Windo\vs98 ми рекомендуємо використовувати Web-сервер Apache, для WindowsNT, Windows 2000 — Internet Information Server (IIS). Сучасні Linux системи після інсталяції в більшості випадків вже налагоджені для роботи з Apache, PHP і MySQL.
Найновіші версії Apache, PHP і MySQL можна завантажити зі сайтів www. apache, org, www. php. net, www.mysql. com.
Інсталяцію кожного з цих пакетів детально описано у відповідних Readme-файлах і не викликає труднощів. Єдиною проблемою може бути те, що інсталятор РНР не підтримує автоматичного налагодження сервера Apache для роботи із цим пакетом. Тут необхідне «ручне» редагування файла httpd. conf, що знаходиться у підкаталозі Conf сервера Apache. Для правильного його редагування доцільно перш за все прочитати файл Install, txt, що знаходиться у каталозі інстальованого РНР.
У процесі роботи з РНР і базами даних MySQL особливо корисним буде інструмент PHPMyAdmin для візуального створення і редагування баз даних MySQL. Його можна завантажити зі сайта http://www. htmlwizard. net/phpMyAdmin. Крім того, бажано завантажити зі сайта www.php.net довідник із програмування на РНР. Доступні версії у форматах HTML, Windows Help (для нас зручнішою виявилась у форматі Windows Help).
Приклади використання РНР
Синтаксис РНР дуже подібний до синтаксису C++, тому не будемо детально зупинятися на цьому, а перейдемо до опису реалізації найбільш характерних для РНР задач.
Робота з формами
Наведемо приклад опрацювання за допомогою РНР даних, отриманих із HTML-форми.
Зазначимо, що форма повинна містити такі дескриптори й атрибути:
<FORM NAME = "ІМ'Я ФОРМИ" ACTION = "ШЛЯХ ДО ПРОГРАМИ, ЩО ОПРАЦЬОВУЄ ДАНІ" METHOD = "МЕТОД ПЕРЕДАЧІ ДАНИХ">
ДЕЯКІ ПОЛЯ ВВЕДЕННЯ...
</FORM>
В атрибуті ACTION будемо задавати ім'я .php-файла, що опрацьовуватиме дані.
Кожне поле введення має атрибут NAME (наприклад, <INPUT TYPE="text" NAME="first" SIZE="4" MAXLEGTH="4">), значення якого передається у програму, що опрацьовує дані.
Є два методи передачі даних: GET і POST. Під час використання методу GET значення полів приєднуються до URL, вказаного в атрибуті ACTION:
http: //site, domain/action. рпр?ім1=знач1&...ім2=знач2
У випадку використання методу POST значення полів передаються в заголовку запиту до сервера, тобто «непомітно» для користувача. Розглянемо приклад. Створимо наступний HTML- файл:
Лістинг 2.14
<НТМL>
<HEAD>
<TITLE>Запит інформації</ТІТLЕ>
</HEAD>
<BODY>
<CENTER>
ХОЧЕТЕ БІЛЬШЕ ЗНАТИ ПРО НАШ НАВЧАЛЬНИЙ ЗАКЛАД?
<Р>
<TABLE WIDTH = 400>
<TR> <TD align = гіght >
<FORM ACTIОN="email.php3" METHOD="GET">
ВАШЕ ІМ'Я: <BR>
<INPUT TYPE="text" NAME="name" SIZE="20" MAXLENGTH="30">
<P>
ВАШ EMAIL: <BR>
<INPUT TYPE="text" NAME="email" SIZE="20" MAXLENGTH="30">
<P>
МЕНЕ ЦІКАВИТЬ:
<SELECT NAME="preference">
<OPTION value = "ПРИЙОМ">УМОВИ ПРИЙОМУ
<ОPTIОN value = "СПЕЦІАЛЬНОСТІ">ОПИС СПЕЦІАЛЬНОСТЕЙ
</SELECT>
<P>
<INPUT TYPE="submit" VALUE="ВІДПРАВИТИ ЗАПИТ! ">
</FORM>
</TD>
</TR>
</TABLE>
</CENTER>
</BODY>
</HTML>
Назвемо цей файл request, html. У ньому вказано, що дані форми будуть опрацьовуватись файлом email, php. При опрацюванні сервером скрипту на мові РНР створюються змінні з такими самими іменами, як імена полів форми, і цим змінним присвоюються відповідні значення. Наведемо текст файла email. php:
Лістинг 2.15
<HTML>
<HEAD>
<ТІТLЕ>ОПРАЦЮВАННЯ ІНФОРМАЦІЇ</ТІТLЕ>
</HEAD>
<BОDY>
<?рhр
/* ЦЕЙ СКРИПТ ОТРИМУЄ ЗМІННІ З REQUEST.HTML */
PRINT "<CENTER>";
PRINT "Привіт, $name! ";
PRINT "<BR> <BR>";
PRINT "Дякуємо за вашу увагу. <BR> <BR>";
PRINT "Вас цікавлять $preference. Додаткову інформацію ми
перешлемо вам на e-mail: $email.";
PRINT "</CENTER>";
?>
</BОDY>
</HTML>
Тепер, якщо користувач викличе request, html і введе у формі, наприклад, ім'я «Біл», email: bil@microsoft. com і скаже, що його цікавлять умови прийому, а після того натисне «Відправити», то у відповідь викличеться email. php, який виведе на екран приблизно наступне:
Привіт, Біл!
Дякуємо за вашу увагу.
Вас цікавлять Умови прийому.
Інформацію про них ми перешлемо Вам на email: bil@microsoft.com
Для відправлення даних за адресою e-mail в РНР є функція mail, яка має такий синтаксис:
void mail(to, subject, message, addjieaders);
to — e-mail адреса одержувача;
subject —тема листа;
message — текст повідомлення.
add_headers — інші параметри заголовка листа (необов'язковий параметр).
Якщо дописати у кінець файла email. php3 наступний код:
<?php
if $name="Bill" then $text="$name\n
Дякуємо за вашу увагу!\n
Проте ми не хочемо мати з вами справи"
else
$text="$name\n
Дякуємо за вашу увагу!\n"
mail($email, "Запит на інформацію",$text);
?>
то тепер користувачі отримуватимуть листи з детальнішою інформацією про навчальний заклад.
Робота з MySQL (збереження даних у базі)
Роботу з базами даних MySQL проілюструємо на прикладі простої системи, яка заноситиме адресну інформацію про клієнтів у базу даних.
Спочатку створимо нову базу даних і таблицю в ній. Якщо на сервері встановлено PHPMyAdmin, то створювати базу доцільно саме за допомогою цього інструмента. Проте базу і таблиці можна створювати за допомогою самих засобів MySQL. Найбільш загальний спосіб — входимо у командний рядок MySQL і вводимо команди:
mysql> CREATE DATABASE inter;
mysql> CREATE TABLE adresses (
id tinyint(4) NOT NULL auto_increment,
name varchar(30), company varchar(30),
phone varchar(20), adress varchar(40),
PRIMARY KEY (id),UNIQUE id(id));
mysql> exit;
У результаті виконання команд буде створено базу даних inter і таблицю adresses з п'ятьма полями: id (номер запису), name (ім'я), company (назва організації), phone (номер телефону), adress (адреса).
Для доступу до баз даних MySQL у РНР вбудовано такі функції:
int mysql_connect(string hostname, string username, string password)
— створити з'єднання з MySQL.
Параметри:
hostname — ім'я хоста, на якому знаходиться база даних (localhost, якщо сторінка з PHP-скриптом розміщуєься на тому самому сервері що і база даних);
username — ім'я користувача (для експериментів підійде root);
password —пароль користувача.
Функція повертає значення параметра типу int, яке більше 0, якщо з'єднання відбулося успішно, і дорівнює 0 в іншому випадку.
int mysql_select_db(string database_name, int link)
— вибрати базу даних для роботи.
Параметри:
database_name — ім'я бази даних;
link — ID з'єднання, який отримано у функції mysql_connect (параметр необов'язковий, якщо він не вказується, то використовується ID з останнього виклику mysql_connect).
Функція повертає значення true або false.
int mysql_query(string query, int link)
— виконує запит до бази даних.
Параметри:
query — рядок, що містить запит;
link — те саме, що й у попередньої функції.
Функція повертає ID результату або 0, якщо відбулася помилка.
int mysql_num_rows(int result)
— повертає кількість рядків у масиві результату запиту.
Параметри:
result — ID результату, повернутому функцією mysql_query.
int mysql_result(int result, int row, column)
повертає значення поля у рядку row і стовпці column.
Параметри:
result — ID результату, повернутому функцією mysql_query;
row, column — значення рядка і стовпця у таблиці результату.
int mysql_close(int link)
– закриває з'єднання із MySQL.
Параметри:
link —(див. вище).
Функція повертає значення true або false. Створимо файл enter.html для виводу форми.
Лістинг 2.16. Відображення форми
<HTML>
<HEAD>
<ТІТLЕ>Введення даних про oco6y</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE WIDTH = 400>
<TR>
<td> <h2> Заповніть форму </h2> </td>
</tr>
<TR>
<TD align = right>
<FORM ACTION="write.php" METHOD="P0ST">
Ім'я:<BR>
<INPUT TYPE="text" NAME="name" SIZE="20" MAXLENGTH="30">
<P>
Підприємство:<BR>
<INPUT TYPE="text" NAME="company" SIZE="20" MAXLENGTH="30">
<Р>Номер телефону:
<INPUT TYPE="text" NAME="phone" SIZE="20" MAXLENGTH="20">
<P> Адреса:
<INPUT TYPE="text" NAME="adress" SIZE="40" MAXLENGTH="40">
<INPUT TYPE="submit': VALUE="Відправити запит!">
</FORM>
</TD>
</TR>
</TABLE>
</CENTER>
</BODY>
</HTML>
Відображення цього файла броузером та приклад заповнення полів форми подано на рис.2.2.
Рис. 2.2
Створимо файл write.php, що містить наступний код:
Лістинг 2.17 Запис адресної інформації до бази даних
<?php
/* цей скрипт отримує змінні з enter.html */
//деякі змінні, що спрощують модифікацію коду
$hostname = "localhost";
$username = "root";
$password = "";
$dbNanoe = "inter";
//створити з'єднання $db=mysql_connect($hostname,$username,Spassword);
if(!$db)
{ echo "He можу з'єднатись із базою! <br>"; exit; }
//вибрати базу даних
$isOk=mysql_select_db($dbName, $db);
if(!$isOk)
{ echo "He можу вибрати базу ",$dbName,"!<br>"; exit; }
PRINT "<CENTER>";
PRINT "Привіт, $name!";
PRINT "<BR> <BR>";
//Додати інформацію про клієнта до бази даних
$query = "INSERT INTO adresses (name, company, phone, adress)
VALUES ('$name', '$company', '$phone', '$adress')";
$result = mysql_query($query);
PRINT "Інформація про Вас занесена до бази даних.";
//Закрити з'єднання
MYSQL_CLOSE();
?>
Даний скрипт заносить відомості про особу до бази даних. Для того, щоб при перенесенні сторінки на інший сервер її можна було б легко налагодити на роботу з ним, відповідним змінним, що описуються на початку сторінки, присвоюються ім'я хоста, ім'я користувача та пароль до бази MySQL. За допомогою функції mysql_connect() відкривається зв'язок із сервером баз даних MySQL. У результаті виконання цієї функції отримується деяке значення, яке присвоюється змінній $db. Ця змінна називається ідентифікатором з'єднання.
З'єднавшись із сервером, необхідно вибрати потрібну базу даних (один сервер може обслуговувати декілька баз даних). Це робиться за допомогою функції mysql_select_db(). Як параметри передаємо назву необхідної бази даних та ідентифікатор з'єднання, отриманий у процесі виконання попередньої функції.
У результаті виконання функції mysql_select_db() отримуємо значення true або false залежно від того, вибрано базу успішно чи ні. Дане значення аналізується і, якщо воно дорівнює false, виводиться повідомлення про помилку. Більш професійно цю ділянку коду можна подати у вигляді:
mysql_connect($hostname,$username,$password) OR die("He можу створити з'єднання");
@mysql_select_db("$dbName") or die("He можу вибрати базу даних");
Запис до бази даних здійснюється за допомогою запиту мовою SQL, який реалізується функцією mysql_query. Першим її параметром є рядок з SQL-запитом, другим — ідентифікатор з'єднання. Другий параметр є необов'язковим, у вищенаведеній програмі він відсутній.
Нарешті, після повідомлення користувачу про те, що інформацію про нього занесено до бази даних, за допомогою функції mysql_close() закривається з'єднання з сервером баз даних.
Отримання даних з бази MySQL
Створимо скрипт view, php:
Лістинг 2.18 Отримання інформації з адресної бази даних
<?РНР
/* Скрипт відображає адреси клієнтів */
$hostname = "localhost";
$username = "root' ;
$password = "";
$dbName = "inter";
// створити з'єднання
$db=mysql_connect($hostname, $username, $password);
if(!$db)
{ echo "He можу з'єднатись з базою! <br>"; exit; }
// вибрати базу даних //
$isOk=mysql_select_db($dbNanie, $db);
if(!$isOk)
{ echo "He можу вибрати базу ", $dbName,"!<br>"; exit; }
// Вибрати всіх клієнтів, та відсортувати за полем // ім'я
$query = "SELECT * FROM adresses ORDER BY name;
$result = mysql_query($query);
// Скільки таких знайшлось
$number = mysql_numrows($result);
// Відобразити всіх
$i = 0;
WHILE ($1 < $number) {
$name = mysql_result($result, $i,"name");
$company = mysql_result($result, $i,"company");
$phone = mysql_result($result, $i,"phone");
$adress= mysql_result($result, $i,"adress");
print і;
PRINT "<b>$name<BR>";
PRINT "Організація: $company. <BR>";
PRINT "Телефон: $phone. <BR>";
PRINT "Адреса: $adress. <BR>";
PRINT "<BR><BR>";
$i++;
}
PRINT "</CENTER>";
?>
З'єднання з сервером баз даних і вибір конкретної бази даних здійснено аналогічно до попередньої програми. Для вибору всіх клієнтів передаємо серверу баз даних відповідний SQL-запит як параметр функції mysql_query().
У результаті виконання функції mysql_query отримуємо двомірний масив, який присвоюється змінній $result. Рядками цього масиву є рядки таблиці adresses, що відповідають запиту, наприклад:
|
name |
company |
phone |
adress |
$result = |
Bill Gates |
Microsoft |
911 |
Software st, 20 |
Кількість знайдених записів аналізуємо за допомогою функції mysql_numrows(), передавши їй, як параметр, результат виконання попередньої функції.
Якщо кількість знайдених записів більша від нуля, то в циклі за допомогою функції mysql_result() із результатів виконання запиту (тобто змінної $result) отримуємо конкретні значення полів.
Форум Web-сайта навчального закладу
Форум {конференція) — це 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 |
0 |
auto_increment |
номер запису |
name |
varchar(20) |
No |
|
|
ім'я |
subj |
varchar(40) |
No |
|
|
тема повід. |
comments |
text |
No |
|
|
текст повід. |
date |
varchar(20) |
No |
|
|
дата повід. |
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>
Текст повідомлення<sup>*</sup>: <TEXTAREA R0WS="5" NAME="fcomments"
C0LS="43" MAXLENGTH="3000"X/TEXTAREA>
<p>
</FONT>
<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> ";
?>
<!-- Форма для введення пароля та діапазону записів, які підлягають знищенню. Скрипт, що опрацьовує дані з цієї форми, знаходиться у тому самому файлі (форма викликається сама на себе).-->
<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD=P0ST>
Пароль: <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. Чи можна код РНР поділяти на частини?
Практичні завдання
При встановленому Web-сервері та налаштованих РНР та MySQL реалізувати розглянуті в тексті приклади. Проаналізувати одержані результати.