Роздрукувати сторінку
Главная \ Методичні вказівки \ Методичні вказівки \ 732 Методичні рекомендації до лабораторних робіт з курсу Web-програмування, НУДПСУ, Національний університет державної податкової служби України

Методичні рекомендації до лабораторних робіт з курсу Web-програмування, НУДПСУ

« Назад

ЛАБОРАТОРНІ РОБОТИ

Лабораторна робота

Тема: Подання інформації в мережі Інтернет

Мета: розібратися в основних етапах створення власну Web- сторінку

Хід роботи:

  1. Відкрити вікно браузера Microsoft Internet Explorer.

  2. Використавши команди браузера "Справка –> О программе" визначити версію браузера.

  3. Налагодити інтерфейс браузера. Для цього можливо використовувати контекстне меню рядка меню або панелі інструментів браузера та команду "Настройка" контекстного меню. Виконання даної команди призводить до появи вікна настройки панелі інструментів браузера.

 

Основні компоненти інтерфейсу браузера Microsoft Internet Explorer

Вікно настройки панелі інструментів браузера.

  1. Використавши команди "Сервис->Свойства обозревателя" відкрити вікно "Свойства обозревателя". Перейти на вкладку "Подключения". За допомогою технічного персоналу встановити з’єднання браузера з мережею Інтернет.

  2. Відвідати Web-сайти Кабінету міністрів України (http://www.kmu.ua), Верховної Ради України (http://www.rada.gov.ua),   пошукових систем Мeta (http://www.meta.ua) та Google (http://www.google.com.ua). Для цього слід ввести в адресному рядку відповідну адресу. Відзначимо, що вводити http:// необов’язково.

  3. За допомогою команди "Файл"->"Создать"->"Окно" створити нове вікно браузера та відкрити в ньому сайт конституційного суду України (http://www.ccu.gov.ua/). 

  4. Ознайомитись з можливостями команди "Вид"->"Кодировка". Після цього встановити автоматичний вибір браузером кодування Web-сторінки.

  5. Ознайомитись з можливостями команди "Вид"->"Размер шрифта". Встановити найбільш зручний для вас розмір шрифту.

  6. Ще раз відвідати згадані сайти за допомогою кнопок "Назад" та "Вперед".

  7. Ознайомитись з призначенням кнопок "Обновить", "Домой" та "Стоп".

  8.  Використавши кнопку "Избранное" записати адреси відвіданих сайтів в теку вибраних адрес.

  9. Використавши кнопку "Журнал" здійснити навігацію по сайтам, що вже були відвідані за допомогою даного браузера.

  10. Використавши команди "Сервис->Свойства обозревателя" відкрити вікно "Свойства обозревателя". Перейти на вкладку "Общие". Це означає, що браузер буде відкриватись з порожньої сторінки, а адреси переглянутих сторінок будуть зберігатись 20 днів.

 

 Настройка загальних параметрів функціонування браузера

  1. Використавши вкладки "Безопасность" та "Конфединциальность" вікна "Свойства обозревателя", ознайомитись з параметрами, що визначають безпечний перегляд різних Web-сайтів.

  2. У вікні вікна "Свойства обозревателя" перейти на вкладку "Содержание" та натиснути кнопку "Включить" в полі "Ограничения доступа". За допомогою нового вікна настройки "Ограничения доступа" обмежити доступ до інформації отриманої з мережі Інтернет.

Визначення обмежень доступу до інформації, що відображається в браузері.

  1. У вікні вікна "Свойства обозревателя" перейти на вкладку "Дополнительно". Знайти розділ "Мультимедиа" (рис.5). Відмінити відображення рисунків в вікні браузера. Відвідати декілька вже переглянутих сайтів. Впевнитись в тому, що час потрібний для відображення сайту в вікні браузера зменшився.

  2. За допомогою контекстного меню в місці призначеному для рисунку відобразити його на екрані.

  3. Відновити відображення рисунків.

  4. Освоїти можливості збереження  Web-сайтів. Для цього можливо використати команди меню "Файл"->"Сохранить как…" Ознайомитись з різними типами файлів, що можуть бути використані при збереженні інформації із Інтернет.

  5. Освоїти можливості збереження фрагментів Web сайтів.

–  Рисунок можливо зберегти за допомогою команди "Сохранить рисунок как…" відповідного контекстного меню.

– Текст зберігаємо за допомогою копіювання виділеного фрагменту в будь-який текстовий редактор.

  1. Записати на свій комп’ютер файл розміщений на FTP-сервері. Для цього:

– Записати в адресному рядку URL визначеного FTP-серверу. Наприклад ftp://ftp.microsoft.com.

– Для збереження файлу необхідно викликати контекстне меню відповідного елемента у вікні браузера та вибрати команду "Копировать в папку".

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

  1. Яке призначення кнопки "Домой"?

  2. Як зберегти тільки текстову частину Web-сторінки?

  3. Як повністю зберегти Web-сторінку?

  4. Як зберегти рисунок на Web-сторінці?

  5. Як зберегти фрагмент тексту на Web-сторінці?

  6. Як відмінити можливість відображення рисунків у вікні браузера?

  7. Назвіть основні параметри безпеки браузера?

  8. Як заборонити доступ до певної інформації, розміщеної в мережі Інтернет?

  9. Як змінити кодування Web-сторінки?

  10. Як реалізувати доступ до FTP-серверу за допомогою браузеру?

 

Лабораторна робота

Тема: Теги, які використовуються в мові гіпертекстової розмітки HTML

Мета: розібратися, коли застосовуються  на практиці ті чи інші теги мови гіпертекстової розмітки HTML

Хід роботи:

1. Підготовчі роботи:

– Створюємо теку де будуть розміщуватись HTML-файли. Наприклад на диску Е створюємо теку  HTML.

–  Встановлюємо настройки для відображення розширень файлів. Для цього заходимо в нашу теку та вибираємо команди меню "Сервис" –> "Свойства папки". У вікні "Свойства папки" переходимо на вкладку "Вид" та знімаємо перемикач у рядку "Скрывать расширения для зарегистрированных типов файлов".

Настройка папки для відображень розширення файлів

2. В теці HTML створюємо текстовий документ з назвою text.html. При цьому повинно з’явитись вікно запиту зміни розширення файлу. В цьому вікні натискаємо на кнопку "Да". Іконка, файлу text.html зміниться на таку, що відповідає браузеру.

Вікно запиту зміни розширення файлу

3. Відкриваємо файл text.html за допомогою браузеру. Відзначимо, що на цей момент файл порожній.

Відображення порожнього файлу text.html у вікно браузера

4. Для запису інформації у файл text.html вибираємо наступні меню браузера, "Вид" –> "Просмотр HTML-кода".  У відповідь на це відкривається вікно текстового редактора "Блокнот" з файлом text.html.

5. В редакторі "Блокнот" записуємо HTML-код, що визначає основні розділи HTML-документу, встановлює кодування Windows-1251 та встановлює назву документу "Лабораторна робота №2". Відзначимо, що назва HTML-документу відображається в рядку заголовку браузера.

<html>

<head>

         <meta http-equiv="Content-Type" content="text/html;

charset=windows-1251">

         <title> Лабораторна робота №2</title>

</head>

<body>

</body>

</html>

6. Зберігаємо в блокноті записаний текст, переходимо в браузер та за допомогою кнопки "Обновить" оновлюємо сторінку text.html.

Відображення назви HTML-документу

7. Для визначення тексту напівжирними символами, курсивом та підкресленими символами в тілі HTML-документу записуємо:

<body>

         <b>напівжирні символи</b>,

          <i>курсив</i>,

         <u>підкреслені символами</u>,

         <b><i><u>комбінація</u></i></b>

</body>

         Зберігаємо документ у "Блокноті" та оновлюємо його в браузері.

Форматування тексту

8. Додамо в HTML-документ формулу  X2+X4 = Yi. Для цього в кінці тіла документу допишемо:

<br>X<sup>2</sup>+X<sup>4</sup>=Y<sub>i</sub>

</body>

Відзначимо, що тег <br> використано для запису формули з нового рядка.

9. Додамо в наш документ HTML-код для відображення тексту у вигляді заголовків:

<h1>Заголовок 1</h1>

<h2 align="center">Заголовок 2. Вирівнювання "по центру"</h2>

<h3 align="right">Заголовок 3. Вирівнювання "по правому краю" </h3>

<h4>Заголовок 4</h4>

<h5>Заголовок 5</h5>

<h6>Заголовок 6</h6>

</body>

Фрагмент вікна браузера з текстом у вигляді заголовків показаний на рис.

10. Додамо в документ три фрагменти тексту, червоного кольору. Перший фрагмент запишемо шрифтом "Arial", розміром 7, другий шрифтом "GothicG" розміром 3, "Verdana" розміром 1. Для цього додамо наступний HTML-код:

<br><font face="Arial" size="7" color="Red">Перший фрагмент

тексту</font>

         <br><font face="GothicG" size="3" color="Red">Другий фрагмент

тексту</font>

         <br><font face="Verdana" size="1" color="Red">Третій фрагмент

тексту</font>

</body>

Відповідний фрагмент вікна браузера показаний на рис.

 

Відображення заголовків

Використання тегу <font>

1. За допомогою тегів абзаців та ліній розділимо наш HTML-документ на окремі частини. До того ж визначимо, що колір фону сторінки сірий, а колір тексту коричневий. Крім того встановимо, що горизонтальні відступи від об’єктів HTML-сторінки до границь вікна браузера дорівнюють 3, а  вертикальні 2 пікселі. Для цього змінимо HTML-код наступним чином:

<body leftmargin=2 topmargin=1 bgcolor="Silver" text="Maroon">

         <p align="right">

         <b>напівжирні символи</b>,       <i>курсив</i>,   <u>підкреслені

символами</u>,

         <b><i><u>комбінація</u></i></b>

         <br>X<sup>2</sup>+X<sup>4</sup>=Y<sub>i</sub>

         </p>

         <hr width="100%" size="2" noshade>

         <h1>Заголовок 1</h1>

         <h2 align="center">Заголовок 2. Вирівнювання "по центру"</h2>

         <h3 align="right">Заголовок 3. Вирівнювання "по правому краю" </h3>

         <h4>Заголовок 4</h4>

         <h5>Заголовок 5</h5>

         <h6>Заголовок 6</h6>

         <hr width="70%" size="3" noshade>

         <p align="center">

         <br><font face="Arial" size="7" color="Red">Перший фрагмент

тексту</font>

         <br><font face="GothicG" size="3" color="Red">Другий фрагмент

тексту</font>

         <br><font face="Verdana" size="1" color="Red">Третій фрагмент

тексту</font>

         </p>

</body>

Відображення даної HTML-сторінки у вікні браузера показане на рис.

Використання форматування текстової частини HTML-документу

2. Копіюємо в теку HTML видані викладачем графічні файли 1.jpg та 1a.gif.

3. В теці HTML створюємо текстовий документ з назвою picture.html, відкриваємо його за допомогою браузеру та переходимо до редагування HTML-коду.

4. Створимо заготовку для HTML-коду Web-сторінки:

<html>

<head>

<title>Рисунки</title>

<META http-equiv=Content-Type content="text/html;

charset=windows-1251">

</head>

<body>

</body>

</html>

5. Додамо HTML-код для відображення на сторінці 4 однакових рисунків з різними розмірами:

<body>

<h2 align=center>Зміна розмірів рисунків</h2>

<img src="1.jpg">

<img src="1.jpg" width="260" height="220">

<img src="1.jpg" width="130" height="110">

<img src="1.jpg" width="300" height="250">

</body>

</html>

6. Перегляд сторінки в браузері повинен відповідати рис.

Рисунки з різними розмірами

7. Розглянемо можливість використання границь навколо рисунків. Для цього додамо наступний HTML-код:

...

<h2 align=center>Границі рисунків</h2>

<img src="1.jpg" width="130" height="110" >

<img src="1.jpg" width="130" height="110" border="1">

<img src="1.jpg" width="130" height="110" border="3">

</body>

8. Відповідне відображення у вікні браузера показане на рис.

9. Розглянемо можливість визначення альтернативного тексту в тегах рисунків. Для цього модифікуємо останній фрагмент HTML-коду:

...

<img src="1.jpg" width="130" height="110" alt="Рисунок. Границь нема">

<img src="1.jpg" width="130" height="110" border="1" alt="Рисунок. Товщина границь 1 піксель">

<img src="1.jpg" width="130" height="110" border="3" alt="Рисунок. Товщина границь 3 пікселі">

</body>

10. Відключимо показ рисунків у вікні браузеру та проведемо оновлення нашої сторінки.

11. Відновимо показ рисунків в браузері та проведемо оновлення нашої HTML-сторінки.

12. Розглянемо можливості вертикального вирівнювання рисунків відносно тексту.

13. Додамо HTML-код для визначення тексту та рисунків вирівняних відносно верхньої межі:

...

<h2 align=center>Вирівнювання рисунків відносно тексту </h2>

<h3 align=center>Вирівнювання рисунків відносно верхнього межі рядка </h3>

<p>

<img src="1.jpg" width="130" height="110" border="3" alt="Вага">

<img src="1.jpg" width="65" height="55" border="3" alt="Вага" align="top">

По верхній  межі найвищого елементу рядка

</p>

<p>

<img src="1.jpg" width="130" height="110" border="3" alt="Вага"> 

<img src="1.jpg" width="65" height="55" border="3" alt="Вага" align="texttop">

По верхній межі найвищого текстового елементу рядка

</p>

</body>

14. Відповідне вікно браузера показане на рис.

15. Додамо HTML-код для визначення тексту та рисунків вирівняних відносно середини рядка:

...

<h3> Вирівнювання рисунків відносно середини рядка </h3>

<p>

<img src="1.jpg" width="130" height="110" border="3" alt="Вага"> 

<img src="1.jpg" width="65" height="55" border="3" alt="Вага" align="middle">

По базовій лінії рядка

</p>

<p>

<img src="1.jpg" width="130" height="110" border="3" alt="Вага"> 

<img src="1.jpg" width="65" height="55" border="3" alt="Вага" align="absmiddle">

По середині рядка

</p>

</body>

16. Відповідне вікно браузера показане на рис.

17. Додамо HTML-код для визначення тексту та рисунків вирівняних відносно нижньої межі:

...

<h3 align=center> Вирівнювання рисунків відносно нижнього краю рядка </h3>

<p>

<img src="1.jpg" width="130" height="110" border="3" alt="Вага"> 

<img src="1.jpg" width="65" height="55" border="3" alt="Вага" align="bottom">

Вирівнювання рисунків по базовій лінії рядка

</p>

<p>

<img src="1.jpg" width="130" height="110" border="3" alt="Вага"> 

<img src="1.jpg" width="65" height="55" border="3" alt="Вага" align="absbottom">

Вирівнювання рисунків по нижній межі рядка

</p>

</body>

19. Відповідне вікно браузера показане на рис.

20. Розглянемо можливість визначення "плаваючих" рисунків, тобто рисунків вирівняних по лівому або правому краю рядка. Для цього додамо HTML-код:

...

<h3 align=center>"Плаваючі" рисунки</h3>

<p>

<img src="1.jpg" width="130" height="110" border="3" alt="Вага" align="left">

По лівому краю рядка

</p>

<br><br><br><br><br>

<p>

<img src="1.jpg" width="130" height="110" border="3" alt="Вага" align="right">

По правому краю рядка

</p>

</body>

21. Відповідне вікно браузера показане на рис.

22. Розглянемо можливості відокремлення тексту від рисунків за рахунок визначення горизонтальних та ввертикальних відступів. Для цього додамо HTML-код:

...

<h2 align="center">Відокремлення рисунків від тексту</h2>

<img src="1.jpg" width="130" height="110" border="3" hspace="20" vspace="20" align="top" alt="Вага">

Відстань до тексту 20 пікселів

<br>

<img src="1.jpg" width="130" height="110" border="3" hspace="1" vspace="1" align="top" alt="Вага">

Відстань до тексту 1 піксель

</body>

23. Відповідне вікно браузера показане на рис.

24. Додамо HTML-код для визначення альтернативного зображення:

...

<h2>Використання мініатюр</h2>

<img src="1.jpg" lowsrc="1a.gif" width="130" height="110" border="3" alt="Вага" >

</body>

25. Розглянемо можливість використаня на сайтах відео зображень. Для цього необхідно в папку HTML вставити файл з відео, наприклад CLOCK.AVI та додати в файл picture.html HTML-код:

...

<h2>Використання відеозображень</h2>

<img width="100" height="100" border="2" dynsrc="CLOCK.AVI">

</body>

26. Моментальний знімок перегляду відео з файлу показано на рис.

27. Модифікуємо HTML-код для того прокрутки відео ролика CLOCK.AVI  два рази:

<img width="100" height="100" border="2" dynsrc="CLOCK.AVI" loop="2">

28. Провести оновлення вікна браузера.

29. Модифікуємо HTML-код для того прокрутки відео ролика CLOCK.AVI  два рази, при цьому показ починався після наведення миші на рисунок:

<img width="100" height="100" border="2" dynsrc="CLOCK.AVI" loop="2" start="mouseover">

30. Провести оновлення вікна браузера.

31. Модифікуємо HTML-код для того, щоб  відео ролик CLOCK.AVI прокручувався постійно:

<img width="100" height="100" border="2" dynsrc="CLOCK.AVI" loop="-1">

32. Провести оновлення вікна браузера.

33. Розглянемо можливість використаня на сайтах звуку. Для цього необхідно в папку HTML вставити звуковий файл, наприклад START.WAV та додати в файл picture.html HTML-код:

...

<embed src="START.WAV" hidden="true" autostart="true" loop="True">

</body>

34. Провести оновлення вікна браузера.

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

  1. Як визначити розмір вертикального відступу від тексту до границі рисунку?

  2. Як визначити розмір горизонтального відступу від тексту до границі рисунку?

  3. В чому полягає специфіка плаваючого вирівнювання рисунків?

  4. Навіщо потрібно записувати альтернативний текст при визначенні рисунків?

  5. Навіщо потрібні мініатюри при визначенні рисунків?

  6. Як вирівняти рисунок по верхньому краю рядка?

  7. В чому полягає різниця між вирівнюванням рисунку bottom та absbottom?

  8. В чому полягає різниця між вирівнюванням рисунку absmiddle та middle?

  9. В чому полягає різниця між вирівнюванням рисунку texttop та top?

  10.  Як визначити товщину границі рисунка?

  11. Як визначити розмір вертикального відступу від тексту до границі браузера?

  12. Як визначити розмір горизонтального відступу від тексту до границі браузера?

  13. Як визначити колір тексту для всього документу?

  14. Як визначити колір фрагменту тексту?

  15. Як визначити шрифт, яким текст буде відображуватись у вікні браузера?

  16. Як записати тег лінії з товщиною в 5 пікселів?

  17. Чи можливо задати лінію товщиною в 200 пікселів?

  18. Як записується тег заголовку 5 розміру з вирівнюванням по центру?

  19. Як записується тег абзацу з вирівнюванням по лівому краю?

  20. Яким чином задати обов’язкове відображення фрагменту тексту з нового рядка?

 

Лабораторна робота

Тема: DHTML: Динамічний HTML

Мета: розібратися, яким чином статична HTML – сторінку можна зробити інтерактивною

Хід роботи

1. Вивчити теоретичну довідку. Порівняйте команди в браузерах.

Internet Exploter 4.0 (IE) і Netscape Communicator 4.0 (NC) по різному інтерпретують HTML 4.0. Тому перш, ніж розглядати принципи створення Динамічних HTML, розглянемо основні відмінності цих браузерів і як з ними боротися.

Відмінності в реалізації

IE представляє шари за допомогою CSS і тэга div, у той час як NC радить використовувати винайдений їм тэг layer.

Наприклад для IE:

<head>

<style type="text/css">

#loading {POSITION: absolute; TOP:0; LEFT:0; Z-INDEX: 80000; WIDTH: 100%; HEIGHT: 100%;}

</style>

</head>

<body>

<div id="loading">

<table width="100%" height="100%">

<tr><td align="center" valign="middle">

</td></tr>

</table>

</div>

</body>

а для NC:

<body>

<layer name="loading" left="0" top="0" z-index="80000" width="100%" height=100%">

<table width="100%" height="100%">

<tr><td align="center" valign="middle">

</td></tr>

</table>

</layer>

</body>

Тэг layer нічим не відрізняється від CSS, за винятком параметра source, за допомогою якого можна вказати зовнішній файл у якім зберігається вміст шару. Якщо Ви не збираєтеся підтримувати IE, краще вибрати синтаксис NC. Це дозволить будувати складні документи й не повторювати у всіх файлах стандартні шари, такі як навигационнфя панель або шапка сторінки.

На цьому проблеми сумісності не закінчуються, а тільки починаються. Класи Javascript в IE і NC також реализованны по різному. Наприклад, щоб показати шар в NC треба сказати:

document.layers["loading"].visibility="visible";

а в IE:

document.all["loading"].style.visibility="visible";

 

2. В Netscape напишить коди і запустіть на виконання.

Слава Netscape, в Javascript є пракрасная функція eval(). Вона параметр у рядок і інтерпретує її так, начебто це рядок програми. Щоб коректно сховати шар як в IE, так і в NC необхідно написати наступний рядок:

eval(layerref+'["loading"]'+styleswitch+'.visibility="visible"');

Тепер усе, що залишається, це правильно инициализовать змінні layerref і styleswitch за допомогою наступного коду:

var layerref="null", styleswitch="null";

function init(){

  if (navigator.appname == "Netscape") {

    layerref="document.layers";

    styleswitch="";

  }else{

    layerref="document.all";

    styleswitch=".style";

  }

}

викликавши його в тэге body:

<body onload="init();">

3. Введіть команди для ховання і відображення шару.

Тепер давайте напишемо код, який ховає зазначений нами шар. Створимо функцію hidelayer з параметром, що містять ім'я шару, трохи змінивши наведений вище eval(...):

function hidelayer(layername){

  eval(layerref+'["'+layername+'"]'+styleswitch+'.visibility="hidden"');

}

За аналогією з нею створюється й функція showlayer:

function showlayer(layername){

  eval(layerref+'["'+layername+'"]'+styleswitch+'.visibility="visible"');

}

Вправа. Попередня загрузка зображень для правильного їхнього показу.

Створимо два шари. Вже відоме нам повідомлення про завантаження (їм може бути яка-небудь новина або цитата)

<style type="text/css">

#loading {POSITION: absolute; TOP:0; LEFT:0; Z-INDEX: 80000; WIDTH: 100%; HEIGHT: 100%;}

</style>

<div id="loading">

<table width="100%" height="100%">

<tr><td align="center" valign="middle">

Почекайте будь ласка...

</td></tr>

</table>

</div>

і невидимий робочий шар

<style type="text/css">

#logo {POSITION: absolute; TOP:50;  LEFT:150; VISIBILITY: hidden; Z-INDEX: 84000; WIDTH: 360px; HEIGHT: 280px;}

</style>

<div id="logo">

<img src="../images/biglogo.gif" width=359 height=279 border=0>

</div>

Тепер у тэге body викличемо функцію прятания шару loading і показу шару logo

<body onload="init();hidelayer('loading');showlayer('logo');">

4. Введіть команди для руху шару по вікну.

Для прикладу розглянемо рух зверху вниз. Потім за аналогією Ви зможете організовувати переміщення в інших напрямках або по більш складних траєкторіях. Для того, щоб здійснити переміщення потрібно знати чотири значення: поточне положення, місце зупинки, крок переміщення, час затримки. Ми обмежимося двома змінними, а крок і затримку задамо константами.

Створимо функцію переміщення

function movelayerdown(layername,currtop,topstop)

У ній спочатку перевіримо, не чи досягся шар кінцевої крапки

if (eval(layerref+'["'+layername+'"]'+styleswitch+'.top != topstop'))

якщо це не відбулося, зрушимо шар униз

currtop+=2;

eval(layerref+'["'+layername+'"]'+styleswitch+'.top = currtop');

і рекурсивно викличемо функцію

settimeout('movelayerdown("'+layername+'",'+currtop+','+topstop+')',50);

От, що в нас вийшло:

function movelayerdown(layername,currtop,topstop){

  if (eval(layerref+'["'+layername+'"]'+styleswitch+'.top != topstop')){

    currtop+=2;

    eval(layerref+'["'+layername+'"]'+styleswitch+'.top = currtop');

    settimeout('movelayerdown("'+layername+'",'+currtop+','+topstop+')',50);

  }     

}

5. Виконайте завдання по згортанню й розгортанню шару

Розглянемо більш складну операцію - згортання й розгортання шару. Будемо виконувати її по горизонталі. По вертикалі ця операція виконується аналогічно. Для її виконання нам потрібно знати ширину шару. Якщо ми прагнемо згорнути шар, ніяких попередніх дій робити не треба, але якщо ми прагнемо його розгорнути, то потрібно встановити область обріза з лівим і правим краями, рівними половині ширини шару. Це можна встановити при визначенні шару, або на початку програми Javascript. При цьому треба не забути попередньо сховати шар для усунення мелькання.

Створіть функцію згортання/розгортання:

 

function curtainwidth(layername,xinc,inctime,stopwidth)

 

другий параметр визначає величину приросту/зменшення ширини, третій - затримку, а четвертий - кінцеву ширину. Якщо ми розгортаємо шар, то кінцева ширина повинна бути дорівнює ширині шару, якщо згортаємо, те нулю.

Змінимо лівий і правий край області обріза:

 

eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.left += -(xinc/2)');

eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.right += (xinc/2)');

 

Якщо ми перестаралися, то підправимо ширину обріза:

 

if (eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.width < 0')) {lyr.clip.width = 0}

 

Тепер перевіримо, чи не досяглися ви кінцевої умови:

 

if (((xinc < 0) && (eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.width > stopwidth'))) ||

    ((xinc > 0) && (eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.width < stopwidth'))))

 

Якщо ні, то рекурсивно викличемо функцію:

 

settimeout('curtainwidth("'+layername+'",'+xinc+','+inctime+','+stopwidth+')',

inctime);

 

Повинно вийти:

function curtainwidth(layername,xinc,inctime,stopwidth) {

eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.left += -(xinc/2)');

eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.right += (xinc/2)');

if (eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.width < 0')){lyr.clip.width = 0}

if (((xinc < 0) && (eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.width > stopwidth'))) ||

    ((xinc > 0) && (eval(layerref+'["'+layername+'"]'+styleswitch+'.clip.width < stopwidth')))) {

  settimeout('curtainwidth("'+layername+'",'+xinc+','+inctime+',

'+stopwidth+')',inctime);

 }

}

Контролні питання:

  1. Що таке DHTML?

  2. Назвіті основні відмінності в браузерах Internet Exploter 4.0 (IE) і Netscape Communicator 4.0 (NC).

  3. Які команди застосовуються для відображенні і ховання зображень.

  4. Які команди застосовуються для руху зображення у вікні?

  5. Як виконати згортанні і розгортання зображень?

 

Лабораторна робота

Тема: Знайомство з мовою РНР

Мета: розібратися в особливостях мови РНР та принципах її функціонування.

1. Виконайте установку і настоювання Apache. 

Останню версію сервера Apache можна скачати з офіційного сайту продукту: www. apache . org. Знайдіть і скачайте останню версію Apache для Windows. Запустите скачанный файл установки. Перед вами з'явиться стандартне вікно установки програми. При установці вас попросять відразу задати деякі настроювання сервера. Коли будете заповнювати поля, можете особливо не хвилюватися — усі ці настроювання можна буде змінити через конфігураційний файл сервера. Зверніть увагу, що можна вибирати, як буде запускатися сервер. Рекомендується, щоб Apache працював як сервіс і запускався автоматично разом з Windows. При бажанні також можна вибрати ручний запуск сервера. Далі будуть запропоновані варіанти установки: Вибірковий(Custom) або Повний (Complete). Якщо ви не прагнете встановлювати деякі компоненти сервера, то вибирайте тип установки Вибірковий і дивитеся, які компоненти сервера для вас є не обов'язковими. Після установки перезавантажите комп'ютер — при завантаженні в трее ви повинні побачити іконку моніторингу сервера у формі лупи із зеленим трикутником усередині. Цей зелений трикутник говорить про те, що сервер включений, але якщо в трее з'явиться червоний квадрат, те це буде означати, що сервер зупинений.

2. Настройте сервер.

Зайдіть у каталог, куди ви встановили сервер, і знайдіть там папку conf. Тут перебувають усі файли, які служать для настроювання сервера. Усі основні настроювання перебувають у файлі httpd.conf. Перед тем як редагувати цей файл, зробіть його копію, щоб вам не довелося переустановлювати сервер потім. Після будь-яких змін файлу настроювання слід перезапустити сервер. Для цього виберіть команду Restart у програмі, яка перебуває в трее й здійснює моніторинг сервера. Якщо ви не коректно відредагуєте файл httpd.conf, те сервер може не запуститися взагалі або буде працювати не так, як вам хотілося б. Щоб довго не шукати помилку, яку ви допустили, після кожної зміни настроювань зберігайте файл і намагайтеся запустити знову сервер.

Настройка сервера Apache

3. Настройте файл конфігурації httpd.conf .

Розберемо основні секції й настроювання файлу конфігурація httpd.conf. Рядка, які починаються із символу "#", є коментарями й ніяк не впливають на роботу сервера. Знайдіть опції Servername і через пробіл укажіть ім'я сервера — зараз там повинне бути значення, яке зазначено при установці. Якщо ім'я сервера відмінно від localhost, необхідно внести деякі зміни у файлі hosts вашої ОС. Якщо у вас установлений Windows 9x, то цей файл перебуває в каталозі С: \windows\, а якщо у вас Windows 2000/ХР, то ви знайдете його в каталозі С: \windows\system32\drivers\etc\. Знайдіть у цьому файлі рядок "127 .0.0.1 localhost" і допишіть через пробіл ім'я  вашого сервера.

Ще одна опція, яку ви вказували при установці, — це адреса електронної пошти адміністратора сервера. Укажіть цей електронний aдpec в опції Serveradim.

В опції Port слід указати, який порт буде прослуховувати сервер. У цьому випадку стандартним значенням є 8 0.

Обов'язково виділите окремий каталог, у якім будуть перебувати всі htmlасторінки сервера. Шлях до цього каталогу вкажіть в опції Documentroot у такий спосіб: Documentroot "D:/Apache/www"

Підставте замість зазначеного каталогу свій шлях до web-сторінкам. Помітьте: для вказівки шляху слід ставити не традиційні для Windows "слэши" (зворотна коса риса), а звичайну косу рису. Часта помилка, коли пишуть D: \Apache\www.

У нашому випадку настроювання сайту будуть записуватися між тэгами <Directory "D:/Apache/www"> і </Directory>. Уведіть наступні оптимальні настроювання каталогу між цими двома тэгами.

Options Indexes Includes

Allowoverride All

Order allow,deny

Allow from all

Опція Indexes означає, що якщо користувач не вкаже в браузері ім'я файлу, яке слід відкрити, то у вікні браузера він побачить список файлів і папок, які перебувають у зазначеному каталозі. Опція includes дозволяє підключення файлів за допомогою SSI (Server Side Includes — Вставки на стороні сервера; механізм, який дозволяє посилатися на змінні середовища й виконувати деякі дії "зсередини" HtmlеДокументів без програмування). Опція Allowoverride All дозволяє використання всіх директив файлу .htaccess. Далі, в опції Order, вказується в якому порядку перевіряти дозволу на доступ до файлів сервера. У зазначеному випадку спочатку зчитуються правила на дозволи (allow), а потім на заборони (deny). В опцииallow from all установлюється дозвіл на всі файли. Нижче знайдіть опцію Directoryindex. Тут слід увести імена файлів, які будуть завантажуватися, коли не зазначене ім'я конкретного файлу. Звичайно це файли index.html, index.htm, index.phtml і т.д. Укажіть імена всіх цих файлів через пробіл.

4. Визначте де будуть перебувати запускні файли.

Тепер визначимо, де будуть перебувати запускные файли. Виділите окремий каталог для CgiйФайлів: у папці D:\Apache створіть нову папку й назвіть її cgi-bin. У файлі httpd.conf знайдіть опцію Scriptalias  і зміните її в такий спосіб:

Scriptalias/cgi-bin/ “D:/Apache/cgi-bin”

Після цього заповните тэги<Directory “D:/Appache/cgi-bin”> і </Directoty> у такий спосіб:

Allowoverride None

Options Execcgi

Order allow,deny

Allow from all

Рядок Options Execcgi дозволяє виконання скриптов у каталозі D:\Apache\cgi-bin. Для того щоб установити стандартне кодування Win-1251, знайдіть рядок Adddefaultcharset і вкажіть кодування, як показано нижче:

Adddefaultcharset WINDOWS-1251

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

Addhandler cgi-script  .cgi.exe.pl

У наведеному рядку зазначене, що файли з розширеннями pi, ехе cgi слід розуміти, що як виконуються. Можна додати сюди люби інші необхідні розширення.

Усі, настроювання Apache повністю завершена. Для перевірки настроювань розмістите в каталозі D:\Apache\www будь-яку webнсторінку з імена index. html. Тепер відкрийте браузер і введіть ім'я вашого сервера, якщо всі вірно настроєне, то ви повинні побачити сторінку index. html.

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

  1. Як встановити Apache?

  2. На якому сайті можна скачати установочну версію?

  3. Як встановлюється Apache? Які параметри вказуються?

  4. Як настроїти файл конфігурації httpd.conf?

  5. Де перебувають запускні файли?

 

Лабораторна робота

Тема: Настройка програмного оточення для використання мови РНР

Мета: розібратися в варіантах настройки Web – оточення.

Хід роботи

1. Вивчити теоретичну довідку.

Всі мови програмування, використовувані при розробці web-сайтов, можна розділити на дві великі групи.

До першої відносяться ті з них, код яких виконується на комп'ютері відвідувача  сайту, тобто в браузере, запущеному на комп'ютері користувача. Це відомі всім Javascript і Vbscript. Програми на цих мовах вбудовуються в код web-страниц або виносяться в окремий файл, звернення до якого здійснюється з web-страницы (в цьому випадку браузер все одно обробляє такі «винесені» програми так само, неначебто вони були вбудовані в код сторінки).

У другу групу включаються ті мови програми на яких виконуються на тому комп'ютері, де розташований web-сервер. Ця група обширніша - річ у тому, що в принципі на web-сервере можуть виконуватися програми на будь-якій мові, навіть командних .bat-файлов MS-DOS, поважно лише, щоб на нім була встановлена програма-інтерпретатор цієї мови, що задовольняє стандарту CGI, якому також повинен задовольняти сам web-сервер.

РНР відноситься до другої групи - програма на РНР виконується на web-сервере. Проте від інших CGI-языков РНР сильно відрізняється в кращу сторону перш за все своєю простотою. При створенні програми на РНР немає необхідності враховувати все ті багаточисельні дрібниці, які отруюють життя програмістам на Perl або C++, - не треба піклуватися про права доступу до файлів сценарію, не треба прописувати точні дороги до різних модулів, немає необхідності стежити за відсутністю у файлі скрипта недопустимих символів. Синтаксис мови РНР допускає його легке освоєння як початкуючим програмістом, так і тим, хто вже використав раніше яка-небудь мова програмування. Можна цілком і повністю зосередитися на вирішуваному завданні і не думати про дрібниці. Саме це і робить РНР відповідним вибором для web-дизайнера, який, почавши його використовувати, може взагалі забути про яких-небудь інших CGI-языках. (Втім, якщо виходити з механізму дії, то РНР правильніше називати не "CGI-языком", а препроцесором - що, власне, відбито навіть в його назві. Тоді як CGI-приложение просто видає якісь дані в браузер відвідувача, препроцесор переглядає все або деякі файли, що видаються web-сервером відвідувачеві, і шукає в них певні команди, які і виконує. Саме такий спосіб роботи і дозволяє вказувати код програм на РНР безпосередньо в тексті web-страниц.)

Одним з найбільш помітних достоїнств РНР є можливість без особливої скрути працювати з серверами баз даних. Раніше, до появи цієї мови, завдання, що висловлюється "приробити базу даних до web-странице", було досить важким і малодоступним для початкуючих web-дизайнеров. Доводилося або самостійно розробляти хитромудрі скрипти, що взаємодіють як з програмою управління базою даних, так і з web-страницами сайту, або купувати їх у фірм-розробників. З допомогою ж РНР використання бази даних на сайті стало чи не елементарним. Для роботи з переважною більшістю типів баз даних в РНР є вбудовані функції, тому тепер досить лише встановити на web-сервере програму роботи з базою даних (найчастіше використовується безкоштовна MYSQL - http://www.mysql.com) і включити в текст PHP-сценария команди роботи з нею (їх список приведений в описі мови разом з прикладами використання).

Можливості РНР можна вельми серйозно розширити за допомогою додаткових модулів, що містять різні функції. Ці модулі при необхідності розміщуються на web-сервере, на якому встановлений PHP-интерпретатор. Велику кількість готових модулів можна завантажити з адреси http://www.php.net, там же в розділі документації приведений і повний їх опис. (У тому web-сервере зі встановленим РНР, який поширюється з сайту http://php.spb.ru, жодних додаткових модулів немає для зменшення розміру дистрибутива.) Наприклад, модуль Zlib дозволяє працювати з програми на РНР з архівами у форматі Gzip, а модуль libswf - з Flash-презентациями, створюючи і редагуючи їх прямо з програми на РНР.

2. Визначте всю інформацію про сервер і інтерпретатор - однією командою phpinfo()

2.1. Зайти на офіційний сайт PHP.

Основним джерелом відомостей по РНР є офіційний сайт його розробників - www.php.net. Саме на цьому сайті представлені дистрибутиви різних версій РНР для різних платформ. Також на www.php.net розміщується керівництво по РНР на різних мовах, а, крім того, - списки сайтів, присвячених програмуванню на РНР.

Проте тим, хто бажає розробити сайт із застосуванням РНР, можливо, краще відвідати перш за все сайт "РНР по-російськи", розташований за адресою http://php.spb.ru, і завантажити з нього два файли - повний опис РНР російською мовою (переведення керівництва по РНР з сайту www.php.net) і web-сервер Apache з Рнр-мо-дулем, конфігурованим для негайного використання.

 

3. Ознайомтесь з сайтами для вивчення і використання мови PHP.

Найосновніші поняття і опис базових команд, за допомогою яких можна створити непогані РНР-программы вам необхідно завантажити потрібні модулі окремо і встановити їх (на сайті http://php.spb.ru описано, як це зробити.

Версію підручника по РНР для версій 4.0 і вище ви можете завантажити як з сайту розробників РНР, так і з деяких російських сайтів, наприклад, з ресурсу Олександра Пірамідіна -http://pyramidin.narod.ru.

Готовий до використання web-сервер разом з інтерпретатором РНР, а також системою управління базами даних MYSQL ви також можете знайти на сайті проекту "Денвер", розташованому за адресою http://dklab.ru/chicken/web. "Денвер" можна порекомендувати тим, хто вважає за краще автоматично отримати на своєму комп'ютері готовий до використання web-сервер в цілях вивчення мови РНР і створення на нім програм, а "РНР по-російськи" сподобається тому, хто звикся все, що йому треба, набудовувати сам. Тим більше що останнє буде вельми легке - досить уважний прочитати коментар Дмитра з сайту і файли Readme з дистрибутива.

Для написання коди на РНР личить будь-який текстовий редактор -от "Блокнота" до "Script Editor" з пакету Microsoft Office, тут вибір залежить від вашого особистого смаку і бажання.

РНР - мова програмування, що виконується на стороні web-сервера, тому виконання його команд навантажує комп'ютер, на якому встановлений інтерпретатор цієї мови. Внаслідок цього на серверах безкоштовного хостингу використання РНР зазвичай неможливе або супроводиться необхідністю установки рекламних банне-ров цього сервера. Проте практично на всіх серверах платного хостингу проблем з використанням РНР не виникає, і при розробці сайту можна повноцінно застосовувати можливості цієї мови.

У Runet'e використовувати РНР дозволяється, наприклад, на таких безкоштовних серверах, як http://www.hl.ru, http://webservis.ru, http://wallst.ru, http://www.hut.ru, http://meridian.tomsk.ru, на іноземних - http://www.saxen.net і багато інших. Проте, при виборі безкоштовного хостингу для розміщення сайту пам'ятаєте, що в переважній більшості випадків вам доведеться в обов'язковому порядку розміщувати на своїх сторінках рекламні банери (за їх показ на вашому сайті рекламодавці платять гроші компанії, що володіє сервером хостингу. Ці гроші, власне, і служать оплатою підтримки розміщених на цьому сервері сайтів). Крім того, вельми часто власники хостінгов з підтримкою РНР і інших CGI-языков забороняють розміщувати на сайтах, розташованих у них, файли zip, rar, ехе, трз. Втім, останню умову можна обійти, використавши для зберігання таких файлів інший безкоштовний сервер, - хай і без підтримки РНР.

На ринку платного хостингу ситуація інша - зараз вже важко знайти хостинг, де б, навпаки, не пропонували використовувати РНР. Тарифні плани, що не передбачають використання РНР, збереглися хіба що у деяких провайдерів послуг доступу в Інтернет, що паралельно надають і послугу розміщення web-сайтов за окрему платню. Отже для побудови сайтів, використовуючих РНР, можна вибирати практично будь-який сервер платного хостингу, оцінюючи його по різних іншим критеріям (ціна, надійність, швидкість і т. д.). Досить важкий рекомендувати яку-небудь певну фірму, проте можете спробувати Valuehost (www.valuehost.ru), www.350mb.ru, www.net.ru та інші.

Іншим великим порталом, присвяченим РНР, є "Клуб РНР-разработчиков" (http://www.phpclub.net). Там ви знайдете безліч прикладів сценаріїв на РНР, зможете завантажити літературу російською мовою. Форум розробників на РНР, розміщений на цьому сайті, дасть вам можливість отримати від професіоналів в web-программировании відповідь на своє питання, взяти участь в якому-небудь обговоренні або поспілкуватися з колегами в чаті. Архів Форуму містить в собі відповіді практично на всі можливі питання по web-программированию на РНР. Також в "Клубі РНР-разработчиков" регулярно публікуються новини світу РНР-программирования, розповідається про нові розробки в цій області, розміщується інформація про вакансії web-дизайнеров і програмістів на ринку праці.

Підрозділом "Клубу PHP-разработчиков" є сайт "РНР в деталях" - http://detail.phpclub.net, на якому представлені готові програми на РНР, а також немало цікавих відомостей по цій мові.

У Мережі є немало і інших сайтів з інформацією про РНР:

http://php.itsoft.ru,

http://virtual.bresttelecom.by/php,

http://www.providerz.ru/articles/php та інші.

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

  1. Як визначити інформацію про сервер і інтерпретатор?

  2. На якрму сайті знаходиться інформація про PHP?

  3. Як отримати допомогу при програмуванні на PHP?

 

  Лабораторна робота

Тема: Настройка програмного оточення для використання мови РНР

Мета: розібратися,  як настроювати власне Web – оточення

Хід роботи

1. Вивчити теоретични довідку.

Синтаксис PHP досить простий. Програми на РНР вбудовуються в текст web-страницы так само, як і сценарії на Javascript, Vbscript, за допомогою кутових дужок, що облямовують, із знаками питань і вказівкою мови:

<?php

 ...

текст програми

...

 ?>

Команди РНР обов'язково розділяються символом крапки з комою - ";" (символ кінця абзацу або кінця рядка не враховується ніяк), після останньої в програмі команди його можна не ставити. Також символ ";'' не ставиться після умовних операторів (if, switch) і операторів циклу (for, while і інших).

Приклад програми на РНР - на рис.

Як і у всіх мовах програмування, в РНР є можливість працювати із змінними - якимись об'єктами, що мають ім'я і що можуть набувати різних значень. Проте робота із змінними в РНР, мабуть, найлегша зі всіх можливих. Змінні не треба заздалегідь оголошувати (якщо не знаєте, що це таке - те доки і не треба), хіба що за винятком використання їх у функціях. Для введення нової змінної досить просто привласнити їй яке-небудь значення, а для приміщення значення змінної в рядок тексту, імені файлу або параметра команди, потрібно просто написати її ім'я в тому місці, де має бути її значення. Щоб РНР міг відрізняти змінні від рядків або команд, ім'я змінної повинне починатися із знаку долара - ("$") і не повинно містити пропусків, знаків апострофа і деяких інших символів. При аналізі програмної коди інтерпретатор РНР вважає ім'ям змінної все, що міститься між $ і найближчим до нього символом, недопустимим в імені змінної.

Як імена змінних можна також використовувати інші змінні - для цього іншу змінну слід просто вказати на місці імені першої: $$а.

Змінні в РНР можуть бути чотирьох типів - число (ціле і дріб), рядок тексту, масив і об'ект1. Інтерпретатор РНР автоматично визначає типа змінної на підставі аналізу її вмісту. Детальніше про типів даних ви можете взнати в керівництві по РНР (наприклад, в тому, що доступно з сайту "РНР по-російськи"), там же розказано і про особливості роботи з масивами (і взагалі пояснено, що це таке, якщо ви ще не знаєте).

Для включення числової або строкової змінної в рядок тексту досить просто помістити змінну туди, де вона повинна стояти в цьому рядку. Наприклад, у результаті виконання коди $а="птица півча"; $b="Дятел - $а"; змінній $b буде привласнено значення "Дятел - птицю півчу".

Пам'ятаєте, що в РНР не можна для складання строкових змінних використовувати символ "+" - він придатний лише для числових виразів. Тому необхідно поміщати змінні в рядки або використовувати команду конкатенації (крапку): $с = $а. $b.

Є ще два типи змінних - PDF-документ і Pdf-інфо, але вони застосовуються лише при роботі з файлами PDF (і при встановленому модулі підтримки PDF).

Досить часто використовуються скорочені позначення арифметичних дій над змінними і дій з привласнення ним яких-небудь значень. Наприклад, команда $а+= 3 означає, що змінну $а треба збільшити на 3, що і буде зроблено, якщо вона має числовий формат. Так само команда $а- = 3 зменшує змінну $ а на 3, а команди $а*=2 і $а/=2 відповідно умножають і ділять на два змінну $а. Команда $а.=" рядок" еквівалентний команді $а="$а рядок".

У РНР застосовуються також операції інкремента і декремента -т.е. зміни значення змінній на 1. Так, команди $а++ і $а-- відповідно збільшують і зменшують значення змінної $а на одиницю. Те ж саме роблять і команди ++$а, --$а, проте, в тому випадку, якщо подібна команда використовується у вираженні, вони, на відміну від попередніх, спочатку змінюють значення змінної, а потім видають його у вираження. Іншими словами, якщо змінна $а рівна 2, то після виконання команди $b=$а++; її значення досягне 3, а $b буде встановлена в 2. В той же час команда $b= + + $а; встановить обидві змінні в 3.

Масив - це сукупність під одним ім'ям перенумерованих змінних. Ім'я кожної змінної в масиві складається з імені цього масиву і індексу змінної - щось начеб номери змінної в масиві або її імені в нім. Індекс змінної може бути цифровим або символьним - тобто бути або номером змінної в масиві, або її ім'ям в нім.

Наприклад, ось масив з числовими індексами (нумерація індексів починається з нуля, а не одиниці!):

 $а[0]=100; $а[1]=101; $а[2]=102;

 а ось з символьними:

 $а['first']=100; $а['second']=101; $а['third']=102;

(Масив з числовими індексами називається ще "скалярним", а з символьними - "асоціативним".)

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

Іншими словами - скажімо, в якісь змінні записали імена клієнтів і тепер бажаний вивести їх. Як це зробити? Природно, лише перебравши всі ці змінні, для чого нам знадобляться імена цих змінних, які доведеться жорстко задати в програмі. А якщо заздалегідь невідомо, скільки буде клієнтів, як тоді бути? Якщо ж імена клієнтів помістити в масив, то все їх можна перебрати спеціальною командою, додати ж нове ім'я теж неважко.

У РНР додавати елементи в масив можна як явно вказуючи індекс елементу (наприклад $а [100] = "Андрій";), так і просто згадуючи, в який масив цей елемент додається - $а [ ] = "Андрей" ;. У останньому випадку елемент, що додається, стає останнім в масиві.

Нижче перераховані деякі основні команди РНР, які сповна вистачить для реалізації нескладних проектів. Для повнішого ознайомлення з командами РНР можна вивчити Керівництво по цій мові, доступне, наприклад, з адреси http://php.spb.ru, або інші публікації.

include "ім'я файлу" - команда для включення вмісту одного файлу в іншій. Вміст файлу, ім'я якого вказується в команді, цілком і повністю вставляється на те місце, де розташовується ця команда, при цьому всі коди РНР, що містяться у файлі, що вставляється, виконуються так само, як якби вони були на місці цієї команди. (Пам'ятаєте, що файл саме вставляється - т. е., наприклад, дороги до картинок, які мають бути присутніми у файлі, що вставляється, слід вказувати від місцезнаходження того файлу, в якому знаходилася команда include.)

Якщо файл, що включається в сторінку за допомогою команди include, відсутній, то замість нього розміщується повідомлення про це, а програма на РНР виконується далі. (При необхідності завершення обробки і видачі web-страницы в разі відсутності файлу, що включається, замість команди include слід використовувати команду require.)

mail ("Кому", "Тема", "Текст повідомлення", "Додаткові заголовки") - відправка поштового повідомлення. При виконанні даної команди на сервері відповідно до вказаних параметрів формується електронний лист і вирушає за допомогою встановленої на сервері поштової програми. Як параметр "Кому" може виступати набір адрес, розділених комами. "Додаткові заголовки" можуть бути будь-які (природно, допустимі поштовими протоколами!), розділятися вони повинні повинні комбінацією символів /п, яка в РНР означає переведення рядка. (Якщо серед "Додаткових заголовків" не вказано поле From, то воно заповнюється за умовчанням поштовою програмою web-сервера, наприклад, ім'ям "Unprivileged User".)

echo ("текст") - вивід на web-страницу якого-небудь тексту. Щоб вивести на web-страницу значення якої-небудь змінної, досить просто написати її ім'я усередині рядка, що виводиться: команда echo "це цифра $а" виведе в web-страницу текст "це цифра 1", якщо раніше змінною $а було привласнено значення, рівне одиниці. У разі потреби використовувати в рядку, що виводиться, лапки або інші спеціальні символи перед цими символами слід ставити символ " \".

if (умова) {...команди, які повинні виконуватися, якщо умова вірна...;} else {...команди, які повинні виконуватися, якщо умова невірна... } -команда, що дозволяє виконати те або інша дія залежно від істинності вірності або помилковості тієї або іншої умови. У фігурних дужках може розташовуватися декілька команд, розділених крапкою з комою. Як умова може бути оператор порівняння "рівно" - ("==") (саме два-знаку рівності!), "більше" -(">"), "менше" - ("<") і їх комбінації, скажімо, "< = " - ("менше або рівно"). Можна використовувати і декілька умов, узявши кожне з них, а також всі разом в дужки і розділяючи знаками "&&" - ("і") або "| |" -("або").

 Для того, щоб виконувати різні команди залежно від умови, яка може приймати три або більше значень, слід використовувати оператора switch (опис дивитеся нижче) - аналог оператора case в VBA і деяких інших мовах.

for (початкове значення лічильника, умова продовження циклу, зміна лічильника на кожному циклі) { . . . команди. . . ;}  - цикл, тобто повторення вказаних в нім команд стільки раз, скільки дозволить умову зміни лічильника циклу (т. с. змінною, спеціально виділеною для підрахунку числа виконань команд циклу). Наприклад цикл for ($i = 1; $i <= 10; $i + +) {echo $i;} виводить в web-страницу числа з 1 до 10, оскільки в нім спочатку встановлюється значення лічильника в 1 - ($i = l), кожен цикл його значення збільшується на 1 - ($i ++), а продовжуватися він буде до тих пір, поки значення лічильника не перевищить 10 (тобто доки $i< = 10).

while (умова) { . . .команди. . . } - цикл з умовою. Команди у фігурних дужках виконуються до тих пір, поки виконується умова в заголовку циклу. Для того, щоб цикл урвався, потрібно, щоб умова виконуватися перестало - тому усередині циклу необхідно передбачити можливість впливати на цю умову. Скажімо, цикл while ($i<= 10) { . . .команди. . . ; $i++; } виконуватиметься до тих пір, поки значення змінної $i не перевищить 10 -еслі спочатку воно дорівнювало 1, то цикл виконається 10 разів.

 Цикл do {. . .команди. . . } while (умова) працює так само, проте команди, вказані у фігурних дужках, будуть виконані щонайменше один раз - навіть якщо умова виконуватися не буде.

 Перервати виконання будь-якого циклу можна оператором break -дальнейшєє виконання програми піде з команди, наступної після закриваючої фігурної дужки. Оператор же continue перериває поточну стадію виконання циклу, тобто після цього оператора подальше виконання програми почнеться з чергової перевірки умови заголовка циклу.

switch (вираження) {case значення: ... команди...; break; case інше значення: ... команди...; break;}

 - оператор вибору. При його роботі вміст, поміщений у фігурні дужки, є видимим зверху вниз. Як тільки буде знайдений оператор case із значенням, співпадаючим із значенням вираження, РНР почне виконувати весь код, наступний за цим оператором case до останньої фігурної дужки оператора switch або до першого оператора break, залежно від того, що з'явиться раніше. (Звернете увагу, що якщо команду break не вказати в кінці коди, що відноситься до одного варіанту значення вираження в заголовку оператора switch, PHP виконуватиме код далі - тобто той, який належить вже наступному операторові case! Це - одна з відмінностей даного оператора від аналогічних в інших мовах програмування.)

 В кінці оператора switch можна вказати оператора default. Код, що стоїть після нього, виконається в тому випадку, якщо значення вираження в заголовку оператора не збіжиться ні з одним із значень після операторів case.

 foreach (змінна as масив) { . . .команди. .. ;} - почергове прочитування всіх елементів масиву. Foreach прочитує у вказану в його параметрах змінну по черзі всі елементи вказаного в них же масиву, виконуючи кожного разу вказаний у фігурних дужках код, в якому може використовуватися вказана змінна. (Значення елементів масиву цим оператором лише прочитуються, їх модифікація за допомогою команди f oreach неможлива.) Оператор f oreach може бути використаний лише в РНР версії 4.0 і вище.

 Програма на РНР може уриватися кодом web-страницы - для цього досить вставити закриваючий тег до цієї коди і що відкриває - після. Все, що знаходиться між ними, видаватиметься в браузер без якої-небудь обробки, розглядаючись як що виводиться за допомогою команди echo. Іншими словами, код

<?php if ($a==l) { ?><р>переменная а рівна 1</p><?php> }?>

 еквівалентний коду

<?php if ($a==l) {echo "<p> Змінна а рівна

 1</p>";}?>

проте, перший варіант менше навантажує процесор комп'ютера, на якому розташований інтерпретатор РНР.

Із сказаного також виходить, що всі програми на РНР, розташовані на одній web-странице, є однією великою програмою, не дивлячись на те, що вони розділяються блоками звичайного тексту сторінки. Саме тому змінна, оголошена в розташованому на початку сторінки коді, зберігає своє значення не лише до її кінця, але і у всіх приєднуваних за допомогою команди include файлах. Приклад - на рис.

 У РНР можна створювати функції - підпрограми, які можна викликати по своїх іменах, при необхідності передаючи їм певну інформацію. Необхідні вони у тому випадку, коли один і той же код потрібно виконувати кілька разів для різних даних, особливо якщо необхідна кількість виконань заздалегідь невідома. Створити функцію на РНР можна, вставивши в програму інструкцію function ім'я (змінні, в які записуються передавані параметри, і їх тип) {...команди функції . . . }, а викликати - простою вказівкою імені цієї функції і параметрів.

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

Пам'ятаєте, що змінні, створені у функції, за умовчанням мають встановлене значення лише усередині функції. Крім того, також за умовчанням змінні, оголошені зовні функції, в ній самій жодного значення не мають, а якщо треба, щоб мали, то спочатку функції їх слід "підключити" командою global <пе-ременная>; - і лише після цього вони стануть доступними у функції. Детальніше про функції і про змінні в них читайте в керівництві по РНР, наприклад, з того ж сайту http://php.spb.ru.

Зазвичай web-сервер набудовується так, що на предмет наявності програм на РНР є видимими файли, що мають розширення .php, .php3, .phtml, останні ж файли передаються в браузер користувача без пошуку в них команд РНР. Робиться так для швидшої роботи сервера, а також для забезпечення можливості установки на сервері різних інтерпретаторів (наприклад, SSI - Server Side Includes, технології, в якійсь мірі передуючої РНР), оскільки тоді кожному з інтерпретаторів призначаються свої розширення для обробки відповідних файлів.

Оскільки РНР-код повністю виконується на web-сервере, то в сторінках, що видаються браузеру, він буде відсутній, і якщо хто зацікавиться вашим досвідом програмування, то вам доведеться відправляти йому цей код поштою, оскільки при перегляді сайту яким-небудь чином взнати вихідний PHP-код його сторінок не можна.

 

Лабораторна робота

Тема: Настройка програмного оточення для використання мови РНР

Мета: розібратися,  як здійснюється тестування РНР

Хід роботи

1. Вивчити теоретичну доводку.

Розглянемо сайт www.harchikov.ru присвячений творчості співця-барда Олександра Харчикова. На сайті мали бути представлені альбоми співця, що вийшли, в кількості 15 шт. і запису пісень кожного альбому в МРЗ-формате. При створенні сайту виникла необхідність забезпечити зручну навігацію. Загальноприйнятий спосіб - заслання на сторінки з описом кожного з альбомів і піснями з нього - мав той недолік, що відвідувач, що бажає проглянути не один альбом, а відразу декілька, був би вимушений постійно переходити із сторінки на сторінку, роблячи зайві зусилля. Крім того, в разі розриву зв'язку під час завантаження якого-небудь файлу відвідувач, що пішов на іншу сторінку, був би вимушений знову повертатися на ту, з якою він цей файл завантажувати почав, витрачаючи час на її пошук. Недолік іншого варіанту - розміщення інформації про всі альбоми на одній сторінці - ясний: розмір цієї сторінки получ'ілся б дуже великим, а цікава відвідувачеві інформація могла б займати лише невелику її частину.

Тому було зроблено так. На головній сторінці розмістилася форма, а в кожної назви альбому - checkbox, внизу ж сторінки -кнопка переходу на список альбомів. Відвідувач міг відзначити альбоми (рис.), що зацікавили його, і після натиснення кнопки переходу PHP-сценарий виводив йому сторінку з описами лише тих альбомів, які відвідувач вибрав (рис.).

Щоб добитися такого результату, всіма checkbox'am заголовної сторінки сайту були привласнені імена: <INPUT name=pan01 type=checkbox> . Все ці checkbox'bi знаходяться у великій формі, параметром action яким є ім'я файлу з програмою на РНР, що виводить описи альбомів відповідно до даних цієї форми, а для передачі даних форми використовується метод get (тобто її заголовок має вигляд <FORM action=albm.php method=get name=forma>). Останнє приводить до того, що в адресі сторінки з виведеними описами альбомів присутні змінні (див. рис.), тобто якщо відвідувач занесе цю адресу в "Вибране", то при подальших поверненнях на сайт по цьому засланню (наприклад, для подальшого завантаження пісень вибраних альбомів) йому не доведеться знов вибирати альбоми на заголовній сторінці, як це було б в разі використання методу post, що не поміщає імена змінних і їх значення в рядок адреси (що, втім, виглядає красивішим).

Рис. Щоб переглянути лише вибрані альбоми, достатнє їх вибрати...

Кнопка, що викликає перехід на сторінку, вказану в параметрі action заголовка форми, повинна мати типа submit, наприклад:

<input type=submit value="вивесті зміст відмічених альбомів">.

Завантаживши заголовну сторінку сайту www.harchikov.ru, можна легко вивчити структуру розташованої на ній форми, що ви і зробіть, якщо опис вам незрозуміло.

У файлі ж albm.php (адреса саме цього файлу вказана в заголовку форми заголовної сторінки) поміщена проста програма, яка виглядає так:

<?php

 if ($bar01==True) {include ( "bar01.php"); }

 if ($bar02==True) {include ('bar02.php"); }

 ... по рядку на кожен альбом...

 ?>

У файлах bar01.php, bar02.php і так далі знаходяться описи альбомів і заслання на МРЗ-файлы пісень. Якщо checkbox з відповідним ім'ям був відмічений на заголовній сторінці, то змінна його імені виявляється рівною True - саме це і перевіряється в сценарії.

Дивно, що цей простий прийом в даний час практично не застосовується на сайтах Мережі - використовується традиційна схема розміщення інформації з безліччю заслань на окремі розділи. Адже як зручно - наприклад, на сайті Харчикова можна вибрати альбоми, згенерувати собі сторінку із засланнями на пісні з них і, заходивши на неї, поступово завантажувати пісні або передати весь список заслань на файли в яку-небудь з программ-"качалок". Або, скажімо, на сайті фірми "Экон-профи" (http://www.econprofi.ru) так само зроблений розділ "Питання і відповіді" (рис.) - відзначивши питання, що цікавлять, на сторінці розділу, можна отримати детальні консультації виключно по вибраних темах. Отримана сторінка і завантажиться швидшим, та і при її роздруку зайвого паперу витрачати не потрібно буде.

Дану схему, зрозуміло, можна допрацювати. Досвід показує, що відвідувачі найчастіше вважають за краще проглянути або два-три вибрані розділи, або всі розділи відразу. У останньому випадку їм доведеться відзначати всі checkbox'bi сторінки, що займає час і сили. Тому варто помістити на сторінку ще і кнопку виводу відразу всіх розділів - "Проглянути все". Їй можна призначити гіперпосилання з адресним рядком, що містить всі змінні в значенні on, а можна трохи допрацювати код РНР на сторінці-обробнику запиту, просто додавши у всі умови перевірку значення ще одній, загальною для всіх умов змінної: if (($bar02==True) || ($all==True)) {... (нагадую, що знак || означає "або"), і тоді гіперпосилання може вести всього лише на адресу albm.php?all=True.

Можна для вирішення того ж завдання помістити на сторінку пару сценаріїв на Javascript, що виконують відповідно відмітку всіх checkbox'oв і, навпаки, їх очищення. Отже простір для творчості є, і чималий.

Лабораторна робота

Тема: «Настройка РНР для написання сценаріїв загального призначення».

Мета: розібратися в використанні спеціальних засобів створення РНР- сценаріїв.

Хід роботи

Додаткову інформацію можна отримати на сайті:

http://www.ibm.com/developerworks/ru/library/l-php_mysql_9/

Для створення сценарію для реєстрації й аутентификації користувачів, управляти їхніми паролями й персоналізувати вміст вигаданого Web-Сайту необхідно створити:

1. Код для створення бази даних проекта

create database bookmarks;

use bookmarks;

create table user  (

  username varchar(16) primary key,

  passwd char(40) not null,

  email varchar(100) not null

);

create table bookmark (

  username varchar(16) not null,

  bm_URL varchar(255) not null,

  index (username),

  index (bm_URL)

);

grant select, insert, update, delete

on bookmarks.*

to bm_user@localhost identified by 'password';

У базі даних будуть зберігатися імена користувачів, їх адреси електронної пошти й паролі. Також передбачається зберігання Url-Адрес закладок. Наведений вище лістинг уже містить одного користувача для підключення в базі через Web. Для адаптації коду до реального проекту рекомендується перемінити це ім'я й наведений пароль.

2. Висновок титульної сторінки

<?php

 require_once('bookmark_fns.php');

 do_html_header('');

 display_site_info();

 display_login_form();

 do_html_footer();

?>

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

3. Функції, що підключаються,

 <?php

  // Цей файл можна включати у всіх інших файлах. У результаті

  // кожний файл буде містити всі необхідні функції й виключення.

  require_once('data_valid_fns.php');

  require_once('db_fns.php');

  require_once('user_auth_fns.php');

  require_once('output_fns.php');

  require_once('url_fns.php');

?>

Код, по суті, описує контейнер для інших файлів, що підключаються, використовуваних у даному додатку. Усі функції розбиті на логічні групи й містяться в окремі файли. Розгляд абсолютний усіх функцій виходить за рамки даної статті, але вона має на увазі описуваний функціонал і докладно коментує основну, саму складну частину проекту.

4. Висновок стандартного заголовка

function do_html_header($title)

{

  // Вивести заголовок HTML

?>

  <html>

  <head>

    <title><?php echo $title;?></title>

    <style>

      body { font-family: Arial, Helvetica, sans-serif; font-size: 13px }

      li, td { font-family: Arial, Helvetica, sans-serif; font-size: 13px }

      hr { color: #3333cc; width=300; text-align=left}

      a { color: #000000 }

    </style>

  </head>

  <body>

  <img src='bookmark.gif' alt='Логотип Phpbookmark' border=0

       align=left valign=bottom height = 55 width = 57 />

  <h1>&nbsp;Кращий сайт із закладками!</h1>

  <hr />

<?php

  if($title)

    do_html_heading($title);

}

Даний код додає заголовки й логотип до сторінки – текстовий опис сайту, відображення вхідної реєстраційної форми й нижній Html-Колонтитул.

5. Реєстрація користувачів

<?php

 require_once('bookmark_fns.php');

 do_html_header('Реєстрація користувачів');

 display_registration_form();

 do_html_footer();

?>

Код виконує реєстрацію користувачів з виставою відповідної форми. Форма витягає дані й, передаючи їх на вхід відповідному скрипту, поміщає їх у базу даних.

6. Запис інформації в СУБД

<?php

   // Включити файли функцій для даного додатка

   require_once('bookmark_fns.php');

  // Створити короткі імена змінних

  $email=$_POST['email'];

  $username=$_POST['username'];

  $passwd=$_POST['passwd'];

  $passwd2=$_POST['passwd2'];

   // Запустити сеанс, який може знадобитися пізніше.

   // Його слід запустити зараз, оскільки він повинен

   // перебувати перед заголовками.

   session_start();

   try

   {

     // Перевірити, чи заповнені поля форми

     if (!filled_out($_POST))

     {

throw new Exception('Ви не заповнили коректно форму. Будь ласка, '

.'поверніться на форму й повторите спробу.');

     }

     // Неприпустима адреса електронної пошти

     if (!valid_email($email))

     {

throw new Exception('Неприпустима адреса електронної пошти. Будь ласка, '

.'поверніться на форму й повторите спробу.');

     }

     // Незбіжні паролі

     if ($passwd != $passwd2)

     {

        throw new Exception('Уведені паролі не збігаються. Будь ласка, '

.'поверніться на форму й повторите спробу.');

     }

     // Перевірити довжину пароля.

     if (strlen($passwd) < 6)

     {

throw new Exception('Пароль повинен мати не менш 6 символів. '

.' Будь ласка, поверніться на форму й повторите спробу.');

     }

     // Перевірити довжину імені користувача.

     if (strlen($username) > 16)

     {

throw new Exception('Ім'я користувача повинне мати не більш 16 символів.'

.' Будь ласка, поверніться на форму й повторите спробу.');

     }

     // Почати спробу реєстрації. Ця функція також може

     // згенерувати виключення

     register($username, $email, $passwd);

     // Зареєструвати змінну сеансу

     $_SESSION['valid_user'] = $username;

     // Вивести посилання на сторінку, призначену для

     // зареєстрованих користувачів

     do_html_header('Успішна реєстрація');

     echo 'Ваша реєстрація пройшла успішно. Переходите на сторінку '

          .' для зареєстрованих користувачів '

          .'і приступайте до створення закладок!';

     do_html_url('member.php',

'Перейти на сторінку для зареєстрованих користувачів');

     // Кінець сторінки

     do_html_footer();

   }

   catch(Exception $e)

   {

     do_html_header('Проблема:');

     echo $e->getmessage();

     do_html_footer();

     exit;

   }

?>

Даний сценарій запускає потрібні функції й генерує сеанс. Використовується блок try і блок catch при численних перевірках умов, у тому числі й даних, що вводяться користувачем.

7. Перевірка форми на заповнювання полей

function filled_out($form_vars)

{

  // Переконатися, що кожна змінна має значення

  foreach ($form_vars as $key => $value)

  {

     if (!isset($key) || ($value == ''))

        return false;

  }

  return true;

}

Цей код ухвалює масив змінних і, якщо він заповнений, повертає значення true, а якщо ні, то false.

7. Перевірка припустимого адреси e-mail

function valid_email($address)

{

    // Перевірити допустимість адреси електронної пошти

  if (ereg('[a-za-z0-9_\.\-]+@[a-za-z0-9\-]+\.[a-za-z0-9\-\.]+$', $address))

    return true;

  else

    return false;

}

?>

Здійснюється перевірка допустимості введеного користувачем адреси електронної пошти, у тому числі перевірка на порожню адресу.

8. Уведення інформації в СУБД про нового користувача

function register($username, $email, $password)

// Реєструє нового користувача в базі даних.

// Повертає або true, або повідомлення про помилку.

{

 // Підключитися до бази даних

  $conn = db_connect();

  // Перевірити, чи унікально ім'я користувача

  $result = $conn->query("select * from user where username='$username'");

  if (!$result)

     throw new Exception('Неможливо виконати запит до БД');

  if ($result->num_rows > 0)

     throw new Exception('Це ім'я користувача вже зайняте - поверніться '

                         .'на форму реєстрації й виберіть інше ім'я.');

  // Якщо все в порядку, зберегти інформацію в БД

  $result = $conn->query("insert into user values

                         ('$username', sha1('$password'), '$email')");

  if (!$result)

    throw new Exception('Неможливе збереження в БД - будь ласка, '

                        .'спробуйте пізніше.');

  return true;

}

Даний код виконує підключення до СУБД і, якщо користувач із наявним іменем уже існує, генерується виключення.

9. Центральний керуючий сценарій

<?php

// Включити файли функцій для даного додатка

require_once('bookmark_fns.php');

session_start();

// Створити короткі імена змінних

$username = $_POST['username'];

$passwd = $_POST['passwd'];

if ($username && $passwd)

// Користувач тільки що спробував увійти в систему

{

    try

    {

      login($username, $passwd);

      // Якщо користувач записаний у базі даних,

      // зареєструвати його ідентифікатор

      $_SESSION['valid_user'] = $username;

    } 

    catch (Exception $e)

    {

      // Невдалий вхід у систему

      do_html_header('Проблема:');

      echo 'Вхід у систему неможливий. '

           .' Для перегляду цієї сторінки необхідно ввійти в систему.';

      do_html_url('login.php', 'Вхід');

      do_html_footer();

      exit;

    }     

}

do_html_header('Домашня сторінка');

check_valid_user();

// Витягти всі закладки, збережені цим користувачем

if ($url_array = get_user_urls($_SESSION['valid_user']));

  display_user_urls($url_array);

// Вивести меню опцій

display_user_menu();

 

do_html_footer();

?>

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

10. Перевірка відомостей про користувача в Субд

function login($username, $password)

// Перевіряє наявність імені користувача й пароля в базі даних.

// Якщо вони там утримуються, вертається значення true,

// а якщо ні, то генерується виключення.

{

  // Підключитися до бази даних

  $conn = db_connect();

  // Перевірити унікальність імені користувача

  $result = $conn->query("select * from user

                     where username='$username'

                     and passwd = sha1('$password')");

  if (!$result)

     throw new Exception('Вхід у систему неможливий');

  if ($result->num_rows > 0)

     return true;

  else

     throw new Exception('Вхід у систему неможливий');

}

Перевіряється наявність пропонованого користувача серед зареєстрованих у базі даних шляхом звірення комбінації введених імені й пароля.

11. Перевірка зв'язку користувача із припустимим сеансом

function check_valid_user()   

// Визначає, чи ввійшов користувач у систему й,

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

{

  global $valid_user;

  if (isset($_SESSION['valid_user']))

  {

      echo 'Ви ввійшли в систему під іменем '

           .stripslashes($_SESSION['valid_user']).'.';

      echo "<br />";

  }

  else

  {

     // Користувач не ввійшов у систему

     do_html_heading("Проблема:");

     echo "Ви не ввійшли всистему.<br />";

     do_html_url('login.php', 'Вхід');

     do_html_footer();

     exit;

  }

}

Якщо користувач не в системі, то йому пропонується потрібна сторінка для входу.

12. Завершення сеансу користувача

<?php

// Включити файли функцій для цього додатка

require_once('bookmark_fns.php');

session_start();

$old_user = $_SESSION['valid_user']; 

// Зберегти для перевірки, якщо хтось увійшов у систему *раніше*

unset($_SESSION['valid_user']);

$result_dest = session_destroy();

// Почати висновок htmlиумісту

do_html_header('Вихід');

if (!empty($old_user))

{

  if ($result_dest)

  {

    // Якщо користувач увійшов у систему й тепер виходить із неї

    echo 'Успішний вихід із системи<br />';

    do_html_url('login.php', 'Вхід');

  }

  else

  {

   // Користувач увійшов у систему й не може вийти з неї

    echo 'Вихід із системи неможливий<br />';

  }

}

else

{

  // Якщо користувач не входив у систему, але якимсь образом потрапив на цю сторінку

  echo 'Ви не входили в систему, тому й виходити з неї не потрібне<br />';

  do_html_url('login.php', 'Вхід');

}

do_html_footer();

?>

13. Зміна паролів користувачів

  <?php

  require_once('bookmark_fns.php');

  session_start();

  do_html_header('Зміна пароля');

  // Створити короткі імена змінних

  $old_passwd = $_POST['old_passwd'];

  $new_passwd = $_POST['new_passwd'];

  $new_passwd2 = $_POST['new_passwd2'];

  try

  {

    check_valid_user();

    if (!filled_out($_POST))

      throw new Exception('Ви не заповнили коректно форму. '

.' Будь ласка, спробуйте ще раз.';

    if ($new_passwd != $new_passwd2)

       throw new Exception('Уведені паролі не збігаються. '

.'Зміна неможлива.';

    if (strlen($new_passwd) < 6)

       throw new Exception('Новий пароль повинен мати довжину, як мінімум, '

.'6 символів. Повторите спробу.';

     // Спроба обновити БД

change_password($_SESSION['valid_user'], $old_passwd, $new_passwd);

     echo 'Пароль змінений.';

  }

  catch (Exception $e)

  {

    echo $e->getmessage();

  }

  display_user_menu();

  do_html_footer();

?>

При виникненні бажання перемінити пароль користувачеві пропонується відповідна форма з потрібним функціоналом.

14. Відновлення паролів у Субд

function change_password($username, $old_password, $new_password)

// Заміняє старий пароль новим.

// Повертає значення true або генерує виключення

{

  // Якщо колишній пароль уведений правильно,

  // він заміняється новим і вертається значення true,

  // а якщо ні, то генерується виключення

  login($username, $old_password);

  $conn = db_connect();

  $result = $conn->query( "update user

set passwd = password('$new_password')

where username = '$username'");

  if (!$result)

    throw new Exception('Пароль не може бути змінений.');

  else

    return true;      // Пароль успішно змінений

}

Перевіряється правильність уведення колишнього пароля й, якщо умови дотримані, відбувається з'єднання з базою даних і пароль обновляється новим значенням.

15. Переустановка паролів

<?php

  require_once('bookmark_fns.php');

  do_html_header('Переустановка пароля');

  // Створити короткі імена змінних

  $username = $_POST['username'];

  try

  {

    $password = reset_password($username);

    notify_password($username, $password);

    echo 'Новий пароль відправлений за адресою електронної пошти, '

         .'який ви вказали при реєстрації.';

  }

  catch (Exception $e)

  {

      echo 'Пароль не може бути перевстановлений. '

           .' Будь ласка, повторите спробу пізніше.';

  }

  do_html_url('login.php', 'Вхід');

  do_html_footer();

?>

Якщо користувач забув або втратив свій пароль, то при виборі потрібного посилання на сторінці виводиться форма переустановки пароля й відправлення його по електронній пошті.

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

  1. Як підготувати СУБД для створення базового варіанта сайту? Реєстрація користувачів.

  2. Які необхідні етапи для створення сценарію?

  3. Як зімінити паролі?

  4. Як вийти з сценарію?

 

Лабораторна робота

Тема: Створення сценарію РНР

Мета: розібратися, як використовуються найбільш популярні оператори мови РНР та як уникнути помилок при їх застосуванні

Хід роботи

1. Створимо сценарії обробки Html-форм

В основному для передачі параметрів використовуються методи POST і GET. Головна відмінність методів POST і GET полягає в способі передачі інформації. У методі GET параметри передаються через адресний рядок (URL), тобто в http-Заголовку запиту, у той час як у методі POST параметри передаються через тіло http-Запиту й ніяк не відбиваються в адресному рядку.

Кнопки - Тег <BUTTON>

Тег <BUTTON> створює на веб-сторінці кнопки й по своїй дії нагадує результат, одержуваний за допомогою тегу <INPUT> (з параметром type="button | reset | submit"). На відміну від цього тегу, <BUTTON> пропонує розширені можливості по створенню кнопок. Наприклад, на подібній кнопці можна розміщати будь-які елементи HTML, у тому числі зображення. Використовуючи стилі можна визначити вид кнопки шляхом зміни шрифту, кольору тла, розмірів і інших параметрів.

Теоретично, тег <BUTTON> повинен розташовуватися усередині форми, установлюваної елементом <FORM>. Проте, браузери не виводять повідомлення про помилку й коректно працюють із тегом <BUTTON>, якщо він зустрічається самостійно. Однак, якщо необхідно результат натискання на кнопку відправити на сервер, поміщати <BUTTON> у контейнер <FORM> обов'язково. Закриваючий тег </BUTTON> обов'язковий.

Параметри:

• disabled - блокує доступ і зміна елемента.

• type - тип кнопки

• value - Значення кнопки, яке буде відправлено на сервер або прочитане за допомогою сприптов.

<button>Кнопка з текстом</button>

Параметр DISABLED Блокує доступ і зміна кнопки. Вона в такому випадку відображається сіркою й недоступної для активації користувачем. Крім того, така кнопка не може одержати фокус шляхом натискання на клавішу Tab, мишею або іншим способом. Проте, такий стан кнопки можна змінювати через скрипти.

<form>

 <p><button>Активна кнопка</button>

 <button disabled>Неактивна кнопка</button></p>

</form>

Параметр TYPE Визначає тип кнопки, який установлює її поведінка у формі. По зовнішньому вигляду кнопки різного типу ніяк не різняться, але в кожної такої кнопки свої функції. Значення за замовчуванням: button.

Аргументи:

button - Звичайна кнопка.

reset - Кнопка для очищення введених даних форми й повернення значень у первісний стан.

Submit - Кнопка для відправлення даних форми на сервер.

<form method='post'>

 <p><input type="text" name="user"></p>

 <p><button type="reset">Очистити форму</button>

 <button type="submit">Відправити форму</button></p>

</form>

<?php

  echo $_POST['user']; // Якщо обраний хоч 1 елемент

?>

Параметр VALUE Визначає значення кнопки, яке буде відправлено на сервер. На сервер відправляється пара «ім'я=значення», де ім'я задається параметром name тегу <BUTTON>, а значення — параметром value. Значення може, як збігатися з текстом на кнопці, так бути й самостійним. Також параметр value застосовується для доступу до даних через скрипти.

<form action="/html/example/handler.php">

 <p><input type="text" name="user"></p>

 <p><button value="11111010101" name="hidden" type="submit">

 Відправити форму</button></p>

</form>

Кнопка (input type=button)

<form>

 <input type=button name="save" value="Привіт!">

</form>

1.2. Кнопка із зображенням (input type=image)

<button>

<img src="/images/umbrella.gif" alt="Парасолька" style="vertical-align: middle">

Кнопка з малюнком

</button></p>

Кнопки із зображеннями аналогічні по дії кнопці Submit, але являють собою малюнок. Для цього задаємо type=image і src="image.gif".

<form>

 <input type="image" src="image.gif" name="sub" />

</form>

Коли користувач клацне де-небудь на зображенні форма, що відповідає, буде передана на сервер із двома додатковими змінними - sub_x і sub_y. Вони містять координати натискання користувача на зображення. Досвідчені програмісти можуть помітити, що насправді імена змінних, відправлених браузером, містять крапку, а не підкреслення, але PHP автоматично конвертує крапку в підкреслення.

Кнопка відправлення форми (input type=submit)

Служить для відправлення форми сценарію. При створенні кнопки для відправлення форми необхідно вказати 2 атрибута: type="submit" і value="Текст кнопки". Атрибут name необхідний, якщо кнопка не одна, а трохи й усі вони створені для різних операцій, наприклад кнопки "Зберегти", "Вилучити", "Редагувати" і т.д. Після натискання на кнопку сценарію передається рядок ім'я=текст кнопки.

<input type="submit" name="Submit" value='Відправити'>

Масив кнопок (submit) для вибору варіанта дій

<form method='post'>

 <input type=submit name="save" value="first">

 <input type=submit name="save" value="pref">

 <input type=submit name="save" value="next">

 <input type=submit name="save" value="last">

</form>

<?php

$action = $_POST['save'];

switch ($action)

 {

  case 'first': echo 'Перший';      break;

  case 'pref' : echo 'Попередній'; break;

  case 'next' : echo 'Наступний';  break;

  case 'last' : echo 'Останній';  break;

 }

?>

Кнопка очистки форми (Reset)

При натисканні на кнопку очистки (reset), усі елементи форми будуть установлені в той стан, який був задан в атрибутах за замовчуванням, причому відправлення форми не проводитися.

<input type="reset" name="Reset" value="Очистити форму">

Прапорець (checkbox)

Прапорці checkbox пропонують користувачеві ряд варіантів, і дозволяє довільний вибір ( жодного, одного або декількох з них).

<form method='post'>

 <input type='checkbox' name='chb[0]' value="white">Білий<br>

 <input type='checkbox' name='chb[1]' value="green">Зелений<br>

 <input type='checkbox' name='chb[2]' value="blue">Синій<br>

 <input type='checkbox' name='chb[3]' value="red">Червоний<br>

 <input type='checkbox' name='chb[4]' value="black">Чорний<br>

 <input type='submit' name="Submit" value='Відправити'>

</form>

<?php

if (!empty($_POST['chb']))

 {

  $chb = $_POST['chb'];

  foreach($chb as $index => $go)

   {

    echo $index." - > ".$go."<br>";

   };

 };

Перемикач(radio)

Перемикачі radio пропонують користувачеві ряд варіантів, але дозволяє вибрати тільки один з них.

Виконайте приклади:

Приклад1.

<form method='post'>

 <input name="mycolor" type="radio" value="white">Білий<br>

 <input name="mycolor" type="radio" value="green" checked>Зелений<br>

 <input name="mycolor" type="radio" value="blue">Синій<br>

 <input name="mycolor" type="radio" value="red">Червоний<br>

 <input name="mycolor" type="radio" value="black">Чорний<br>

 <input type='submit' name="Submit" value='Відправити'>

</form>

<?php echo $_POST['mycolor']; ?>

Приклад 2.

<form method=GET>

 // перший набір кнопок

 <input type='radio' name='rdi[0]' value='1'>

 <input type='radio' name='rdi[0]' value='2'>

 <input type='radio' name='rdi[0]' value='3'><br>

 // другий набір кнопок

 <input type='radio' name='rdi[1]' value='1'>

 <input type='radio' name='rdi[1]' value='2'>

 <input type='radio' name='rdi[1]' value='3'><br>

 // третій набір кнопок

 <input type='radio' name='rdi[2]' value='1'>

 <input type='radio' name='rdi[2]' value='2'>

 <input type='radio' name='rdi[2]' value='3'><br>

 <input type='submit' value='Відправити'>

</form>

<?php

$rdi = $_GET['rdi'];

while(list($key,$val) = @each($rdi))

 echo "ключ - $key, значення - $val<br>\n";

?>

Текстове поле (text)

При створенні звичайного текстового поля розміром size і максимальної припустимої довжини maxlength символів, атрибут type ухвалює значення text. Якщо зазначений параметр value, то поле буде відображати зазначений у змінній value. При створенні поля не забувайте вказувати ім'я поля, тому що цей атрибут є обов'язковим.

<form method='post'>

 <input type="text" name="txtname" size="40" maxlength="35" value="Текст за замовчуванням">

 <input type='submit' name="Submit" value='Відправити'>

</form>

<?php echo $_POST['txtname']; ?>

Поле для введення пароля (password)

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

<form method='post'>

 <input type="password" name="txtname" size="40" maxlength="35">

 <input name="Submit" type='submit' value='Відправити'>

</form>

<?php echo $_POST['txtname']; ?>

Сховане текстове поле (hidden)

Дозволяє передавати сценарію яку те службову інформацію, не відображаючи її на сторінці.

<form method='post'>

 <input type="hidden" name="txtname" value="Це схований текст">

 <input name="Submit" type='submit' value='Відправити'>

</form>

<?php echo $_POST['txtname']; ?>

Список, що розкривається (select)

Тэг <select> являє собою розкритий список, при цьому одночасно можуть бути обрано одна або кілька рядків. Але буде передане значення останьої обраної кнопці.

Список починається з парних тегів <select></select>. Теги <option></option> дозволяють визначити вміст списку, а параметр value визначає значення рядка. Якщо в тегу <option> зазначений параметр selected, то рядок буде споконвічно обраним. Параметр size задає, скільки рядків буде займати список. Якщо size рівний 1, то список буде, що випадає. Якщо зазначений атрибут multiple, то дозволено вибирати кілька елементів зі списку. Але ця схема практично не використовується, а при size = 1 не має змісту.

<form method='post'>

 <select name="color"> <!-- список, що випадає, -->

 <!--<select name="color" size=3> <!--список із прокручуванням-->

 <option value="white">Білий</option>

 <option value="green">Зелений</option>

 <option value="blue">Синій</option>

 <option value="red">Червоний</option>

 <option value="black">Чорний</option>

 </select>

 <input name="Submit" type='submit' value='Відправити'>

</form>

<?php

f (!empty($_POST['color'])) { echo $_POST['color']; };

?>

Якщо необхідно створити список, що випадає з передбачуваною послідовністю. Наприклад, список з роками з 2000 по 2050. То використовується наступна програма.

<form method='post'>

 <select name=years>

<?php

$year = 2000;

for ($i = 0; $i <= 50; $i++) // Цикл від 0 до 50

 {

  $new_years = $year + $i; // Формуємо нове значення

  echo '<option value='.$new_years.'>'.$new_years.'</option>'; //рядок

 }

?>

 </select>

 <input name="Submit" type='submit' value='Відправити'>

</form>

<?php

if (!empty($_POST['years']))

 {

  echo $_POST['years'];

 };

?>

Багаторядкове поле введення тексту (textarea)

Багаторядкове поле введення тексту дозволяє відправляти не один рядок, а відразу трохи. При необхідності можна вказати атрибут readonly, який забороняє редагувати, видаляти й змінювати текст, тобто текст буде призначений тільки для читання. Якщо необхідно щоб текст був споконвічно відображений у багаторядковім полі введення, то його необхідно помістити між тэгами <textarea></textarea>.

Існує параметр wrap – завдання переносу рядків. Можливі значення:

off - відключає перенос рядків;

virtuals - показує переноси рядків, але відправляє текст як він уведений;

physical - переноси рядків залишаються у вихідному виді.

За замовчуванням тег <textarea> створює порожнє поле шириною в 20 символів, що й полягає з 2 рядків.

<form method='post'>

 <textarea name="text" cols="40" rows="5">

 Спочатку вставлений текст

 </textarea>

 <br>

 <!--

 <textarea name="text" cols="40" rows="5" readonly>

 Спочатку вставлений текст

 </textarea>

 <br>

 -->

 <input name="Submit" type='submit' value='Відправити'>

</form>

<?php echo $_POST['text']; ?>

Для того, щоб у багаторядковім текстовім полі дотримувалося html-форматування (перенос рядків відповідно тегу <br> або <br \>), то використовуйте функцію nl2br():

<form method='post'>

 <textarea name="text" cols="40" rows="5">

 Спочатку вставлений рядок 1

 Спочатку вставлений рядок 2

 Спочатку вставлений рядок 3

 </textarea>

 <input name="Submit" type='submit' value='Відправити'>

</form>

<?php echo nl2br($_POST['text']); ?>

Кнопка для завантаження файлів (browse)

Служить для реалізації завантаження файлів на сервер. При створенні текстового поля також необхідно вказати тип поля type як "file".

<form method="post">

 Завантажити файл:<br>

 <input name="filename" type="file"><br>

 <input type="submit" value="Відправити">

</form>

<?php echo ($_POST['filename']); ?>

СПОСОБИ СПІЛКУВАННЯ БРАУЗЕРА ІЗ СЕРВЕРОМ

Способів, наданих протоколом HTTP, небагато. Це важлива інформація. Ніяких інших способів немає. На практиці використовуються два: GET - це коли дані передаються в адресному рядку, наприклад, коли користувач тисне посилання. POST - коли він натискає кнопку у формі.

Метод GET

Щоб передати дані методом GET не треба створювати на Html-Сторінці форму - досить посилання на документ із додаванням рядка запиту яка може виглядати як змінна=значення пари поєднуються за допомогою амперсанда & а до URL сторінки рядок приєднується за допомогою знаку питання «?».

Але можна не використовувати пари ключ=значення якщо треба передати всього одну змінну для цього треба послу знака питання написати ЗНАЧЕННЯ (не ім'я) змінної.

Перевага передачі параметрів таким способом полягає в тому що клієнти які не можуть використовувати метод POST (наприклад, пошукові машини) все-таки зможуть просто пройшовши по посиланню передати параметри скрипту й одержати вміст.

Недолік у тому, що просто змінивши параметри в адресному рядку користувач може повернути хід сценарію непередбаченим образом, це створює величезну діру в безпеці в комбінації з невизначеними змінними й register_globals on або хто-небудь може довідатися значення важливої змінної (наприклад IdсСеcсии) просто подивившись на екран монітора.

Для чого слід використовувати:

- для доступу до загальнодоступних сторінок з передачею параметрів (підвищення функціональності)

- передача інформації, що не впливає на рівень безпеки

Для чого не слід використовувати:

- для доступу до захищених сторінок з передачею параметрів

- для передачі інформації, що впливає на рівень безпеки

- для передачі інформації не підлягаючої модифікуванню користувачем (деякі передають текст SqlоЗапитів.

Метод POST

Передати дані методом POST можна тільки за допомогою форми на HTML сторінці. Основна відмінність POST від GET у тому, що дані передаються не в заголовку запиту а в тілі, отже користувач їх не бачить. Модифікувати може тільки змінивши саму форму.

Перевага:

- більша безпека й функціональність запитів за допомогою форм методом POST.

Недолік:

- менша доступність.

Для чого слід використовувати:

- для передачі великого обсягу інформації (текст, файли..);

- для передачі будь-якої важливої інформації;

- для обмеження доступу (наприклад, використовувати для навігації тільки форму - можливість доступна не всім програмаммроботам або грабберам-контента).

Для чого не слід використовувати:

- немає обмежень.

Завантаження файлів методом POST

PHP здатний ухвалювати файл, що завантажується за допомогою будь-якого браузера,. Це дає можливість завантажувати як текстові, так і бінарні файли. Разом з PhpцАутентификацией і функціями для роботи з файловою системою ви одержуєте повний контроль над тем, кому дозволено завантажувати файли, і над тим, що робити з файлом після його завантаження.

Сторінка для завантаження файлів може бути реалізована за допомогою спеціальної форми, яка виглядає приблизно так:

//Форма для завантаження файлів

<form enctype="multipart/form-data" action="_URL_" method="post">

 <input type="hidden" name="MAX_FILE_SIZE" value="30000" />

 Відправити цей файл: <input name="userfile" type="file" />

 <input type="submit" value="Send File" />

</form>

У наведеному вище прикладі "_URL_" необхідно замінити посиланням на Php-Скрипт. Сховане поле MAX_FILE_SIZE (значення необхідно вказувати в байтах) повинне передувати полю для вибору файлу, і його значення є максимально припустимим розміром прийнятого файлу. Також слід переконатися, що в атрибутах форми ви вказали enctype="multipart/form-data", а якщо ні, то завантаження файлів на сервер виконуватися не буде.

Увага

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

Як визначити метод запиту?

Прямо:

getenv('REQUEST_METHOD');

поверне GET або POST.

Який спосіб слід застосовувати?

• Якщо форма служить для запиту якоїсь інформації, наприклад - при пошуку, то її слід відправляти методом GET. Щоб можна було обновляти сторінку, можна було поставити закладку й або послати посилання другові.

• Якщо ж у результаті відправлення форми дані записуються або змінюються на сервері, то слід їх відправляти методом POST, причому обов'язково після обробки форми треба перенаправляти браузер методом GET. Так само, POST може знадобитися, якщо на сервер треба передати великий обсяг даних (в GET він сильно обмежений), а так само, якщо не випливає "світити" передані дані в адресному рядку ( при введенні логіна й пароля, наприклад).

У кожному разі, після обробки POST треба завжди перенаправляти браузер на яку-небудь сторінку, нехай ту ж саму, але вже без даних форми, щоб при відновленні сторінки вони не записувалися повторно.

Як передати дані в інший файл безпосередньо з тіла PhpаПрограми методом GET і POST?

Виконайте приклад, для демонстрації відправлення даних методом POST і GET одночасно й одержання відповіді від сервера.

<?

$url = "http://test.ru/patch/file.php?var=23&var2=54";

$parse_url = parse_url($url);

$path = $parse_url["path"]; // шлях до файлу (/patch/file.php)

if($parse_url["query"]) // якщо є список параметрів

$path .= "?" . $parse_url["query"]; // додаємо (?var=23&var2=54)

$host= $parse_url["host"]; // отут одержуємо хост (test.ru)

$data = "var3=test&var4=".urlencode("ще тест");

$fp = fsockopen($host, 80, $errno, $errstr, 10);

if ($fp)

{

  $out = "POST ".$path." HTTP/1.1\n";

  $out .= "Host: ".$host."\n";

  $out .= "Referer: ".$url."/\n";

  $out .= "User-Agent: Opera\n";

  $out .= "Content-Type: application/x-www-form-urlencoded\n";

  $out .= "Content-Length: ".strlen($data)."\n\n";

  $out .= $data."\n\n";

  fputs($fp, $out); // відправляємо дані

  while($gets=fgets($fp,2048)) // читаємо дані построчно й виводимо їх.

  {

    print $gets;

  }

  fclose($fp);

}

?>

 У цьому прикладі файл file.php одержав змінні:

 GET var="23" і var2="54"

 POST var3="test" і var4="ще тест"

Увага, дані передані через POST або GET завжди передаються рядком (string), незалежно від того, через форму вони передаються або через скрипт. Тому передаючи число, помніть, що в скрипт воно потрапить як string.

Як перейти на іншу сторінку сайту з тіла програми?

Через HTML:

 На нову сторінку

<html><head>

<meta http-equiv="refresh" content="0; url=<?php echo $url ?>">

</head></html>';

 На попередню з відновленням:

<html><head>

<meta http-equiv="refresh" content="0; url=<?php echo $_SERVER['HTTP_REFERER'] ?>">

</head></html>';

Через генерацію JavascriptsКоду:

 На попередню з відновленням:

echo "<script language='javascript'>\n";

echo "window.location.href=".$_SERVER['HTTP_REFERER'];

echo "</script>\n";

 На попередню без відновлення:

echo "<script language='javascript'>\n";

echo "window.history.back()"; // повернення

echo "</script>\n";

 Перезавантажити поточну сторінку:

echo "<script language='javascript'>\n";

echo "window.location.reload()"; //перезавантаження

echo "</script>\n";

Через Php-Функцію:

 На нову

header("Location: http://”.$url);

exit;

 На попередню сторінку з відновленням:

header("Location: ".$_SERVER['HTTP_REFERER']);

exit;

 На поточну сторінку з відновленням і генерацією повного urlрадреси:

header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);

exit;

Найголовніше, що треба пам'ятати: сервер зі своєї ініціативи звернутися до клієнта не може. Ми можемо тільки за фактом запиту видати щось браузеру - або сторінку, або команду запросити інший ресурс.

ПРИКЛАДИ НЕЗВИЧАЙНОГО ВИКОРИСТАННЯ ФОРМ

Ці приклади показують, що Php-Програму обробки введення можна відокремити від Html-Тексту розташувавши на одній сторінці.

Виконайте приклади.

Приклад 1. Завдання номера картки.

<?php

if (!isset($cardnumber)) $m = "Уведіть номер картки";

 elseif ($cardnumber == "" )  $m = "Ваш номер порожній!";

 else $m = "Ваш номер: $cardnumber";

?>

<html>

<head>

<title>Приклад обробки введення</title>

</head>

<body>

<h1><?php echo $m ?></h1>

<form name='form1' action='<?php echo $PHP_SELF ?>' method='post'>

 <p>Номер картки:

 <input name='cardnumber' type='text' size='20'>

</form>

</body>

</html>

Тут відсутня кнопка передачі даних, тому що форма, що полягає з одного поля, передається автоматично при натисканні клавіші Enter.

Приклад 2. Навігація по масиву (списку) по засобом форми.

<?php

$array = array('нуль','один','два','три','чотири','п'ять','шість','cемь');

$first = 0; # задаємо номер першого елемента в масиві

$last = count($array)-1; # опрелеяем номер останнього елемент у масиві

if (!isset($index)) $index = @key($array);

switch ($action) # Вибір дії залежно від натиснутої кнопки

 {

  case 'first': $index = $first; break;

  case 'pref': if($index != $first) {$index--;} break;

  case 'next': if($index != $last) {$index++;} break;

  case 'last': $index = $last; break;

 };

echo 'Обраний <b>елемент['.$index.'] = '.$array[$index].'</b>';

switch ($index)

 {

  case $first: echo ' lt;font color=red>

   <b><i>(перший)</i></b></font>'; break;

  case $last: echo ' <font color=red>

   <b><i>(останній)</i></b></font>'; break;

 };

?>

<form action='<?php echo $PHP_SELF ?>' method='post'>

 <input type=submit name=action value="first">

 <input type=submit name=action value="pref">

 <input type=submit name=action value="next">

 <input type=submit name=action value="last">

 <input type="hidden" name=index value="<?php echo $index; ?>">

</form>

У цьому прикладі здійснюється переміщення за списком (масиву) елементів з відбиттям його номера (ключа) і значення елемента в масиві за допомогою кнопок і схованого рядка з передачею навігаційного параметра.

ПЕРЕВІРКА КОРЕКТНОСТІ ДАНИХ АБО ДОПУСТИМОСТІ ДАНИХ, ЩО ВВОДЯТЬСЯ

На будь-якому сучасному сайті використовуються всілякі HtmlфФорми, які користувач повинен заповнити й відправити дані на сервер. Це може бути гостьова книга, форум, форма зворотному зв'язка, передплата на розсилання і т.д.

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

• Перевірити, що поле, у яке заноситься електронну адресу непусте (оскільки користувач може просто забути ввести адресу, і, якщо цей випадок необроблений, виникне помилкова ситуація);

• Перевірити відповідність уведеного адреси за допомогою регулярного вираження.

Email обов'язково повинен містити символ @, бути по довжині не менш 8 символів, є також регулярне вираження, по якім можна перевірити дані на предмет відповідності адресі електронної пошти.

Встає питання, як проінформувати користувача про те, що він неправильно ввів дані? Один з варіантів рішення цієї проблеми - через сесійні змінні.

Нехай є сторінка form.php, на якій розташована наша форма, і є файл send.php, який є оброблювачем даних форми у файлі form.php.

В обох файлах повинна бути запущена сесія функцією session_start() на початку сценарію до відправлення заголовків документа.

Нехай відправляється змінна email методом POST у файлі send.php, те робимо:

Перевірку на довжину:

if(strlen($_POST["email"])<8)

 {

  $_SESSION["error"]="Коротка адреса електронної пошти";

  header("Location: form.php");

  exit;

 }

 

Перевірку коректності адреси електронної пошти

Така перевірка здійснюється найчастіше за допомогою виразів. Як відомо, в адресі дві складові - ім'я користувача й ім'я домена, які розділені знайомий @. В імені користувача можуть бути присутнім заголовні й прописні букви цифри, знаки підкреслення й мінуса, крапки. Для перевірки роздільника між іменем користувача й іменем домена у виразах потрібно додати +@.

Також не забувайте, що електронний ящик може перебувати на піддомене xxx@xxx.xxx.com, або навіть на домене четвертого, п'ятого рівня ( як варіант, реально ця ситуація вкрай рідка, але відкидати ці адреси не варто). Тому в виразі не забувайте використовувати крапку (екрановану "\.") для вказівки того, що частина адреси після "@" може містити крапку як роздільник доменних імен.

Таким чином, стандартний вираз, що перевіряє ім'я користувача й наявність роздільника має такий вигляд:

"/[-A-za-z0-9_\.]+@[-A-za-z0-9\.]

Для перевірки доменного імені першого рівня враховуємо, що його довжина вже становить не тільки 2 символу (.ru) або 3 символа (.com), але й 4 символа - .info, і навіть 6 символів. Тому додаємо такий вираз:

"\.[a-z]{2,6}$/i"

Поєднуючи ці кроки, одержуємо наступний стандартний вираз для перевірки адрес електронної пошти:

"/[-A-za-z0-9_\.]+@[-A-za-z0-9\.]+\.[a-z]{2,6}$/i"

Перевірка здійснюється по цьому шаблонові із застосуванням функції preg_match():

function check_email ($email) // Перевірка коректності адреси e-mail

 {

if(!preg_match('|[-0-9A-za-z_\.]+@[-0-9A-za-z\.]+\.[a-z]{2,6}$|i',$email))

{ return false; }

  return true;

 }

Ця користувацька функція check_email повертає true, якщо передане значення змінної $email відповідає шаблону й false а якщо ні, то.

У підсумку перевірка на коректність буде виглядати так:

if(!check_email ($_POST["email"]))

 {

  $_SESSION["error"]="Не вірна адреса електронної пошти";

  header("Location: form.php");

  exit;

 }

Відповідно у файлі form.php перед формою прописуємо наступне:

if(!empty($_SESSION["error"]))

 {

  $error=$_SESSION["error"];

  unset($_SESSION["error"]);

 }

 else {  $error=""; }

echo $error;

Відповідно, якщо помилка була, то вона буде надрукована користувачеві перед формою. Таким же методом можна зберігати дані в заповнених полях форми, щоб користувач по кілька раз не вводив те саме.

 

ІНШІ ПЕРЕВІРКИ НА КОРЕКТНІСТЬ УВЕДЕНИХ ДАНИХ

Кожний web-майстер повинен уміти не тільки писати скрипти, але й грамотно організовувати захист своїх створінь. Одним з найважливіших навичок є вміння правильне фільтрувати всю інформацію, що надходить від користувача.

Крім чистих помилок користувача, необхідно також виключити ситуації, у яких можливо зловмисне введення некоректних даних, приміром, різних скриптов. Для цього текст, що вводиться користувачем, необхідно обробити функціями видалення HtmlтТегів ( для виключення можливості написання скриптов на Javascript і Visual Basic) і зворотних слешей ( для виключення можливості написання скриптов на Perl). Т. о. мінімальний набір дій, необхідний для перевірки коректності даних, що вводяться користувачем, включає наступні етапи:

• перевірка того, що користувач увів дані

• перевірка допустимості, що вводяться користувачем даних ( як правило, здійснюється за допомогою регулярних виражень)

• обробка тексту, уведеного користувачем функцією htmlspecialchars для видалення Html-Тегів

• обробка тексту, уведеного користувачем функцією stripslashes для видалення зворотних слешей

ФІЛЬТРАЦІЯ ДАНИХ

Насамперед, слід фільтрувати дані, які передає користувач усвідомлено - в основному, це дані різних форм. Це може бути пари логінппароль для входу, пункт голосування й т.п. Наприклад, така форма

<form action="index.php" method="GET">

 <input type="text" name="login">

 <input type="text" name "pass">

 <input type="submit" value="OK">

</form>

Після натискання кнопки "OK" передасть скрипту index.php два значення - $login і $pass. Як їх можна отфильтровать? Приклад для змінної $login:

текст, що вводиться користувачем, необхідно обробити функціями видалення Html-Тегів ( для виключення можливості написання скриптов на Javascript і Visual Basic) і зворотних слешей ( для виключення можливості написання скриптов на Perl). Приміром, якщо змінна $login містить текст із іменем користувача, то обробка цього тексту виглядає так:

if($login)

 {

  $login = htmlspecialchars((stripslashes($login)), ENT_QUOTES);

  $login = str_replace("/","",$login);

  $login = str_replace(".","",$login);

  $login = str_replace("`","",$login);

 }

 else { echo "Логін не введений!"; }

У першому рядку ми перевіряємо існування змінної $login, якщо вона існує - ідемо далі, якщо немає - виводимо повідомлення про помилку. Потім за допомогою функції htmlspecialchars заміняємо в цієї змінної спецсимволы на них HtmlоМнемоніки. Функція stripslashes вирізує знак зворотного слеша '\'. Далі за допомогою str_replace вирізуємо знак прямого слеша, крапку (іноді буває корисно) і зворотні лапки.

Якщо знайомі з регулярними виразами, то попередній приклад можна записати набагато коротше:

if($login)

 {

  if (preg_match("/[0-9a-z_]/i", $login))

   { /* … дії над логіном … */}

   else { echo "Логін уведений невірно!";  }

 }

 else { echo "Логін не введений!"; }

Цей фрагмент коду буде перевіряти введений логін на відповідність регулярному виразу '/[0-9a-z_]/i', яке означає: усі цифри + усі латинські букви в будь-якому регістрі + знак підкреслення. Якщо логін містить інші символи, то буде показане повідомлення про помилку.

Аналогічно фільтруються змінні, одержувані скриптом через URL. У движках сайтів можна зустріти щось начебто таких посилань:

http://www.site.com/index.php?module=news

Якщо не фільтрувати змінну $module (або $_GET[`module`], якщо register_globals відключений), то над сайтом можуть витворятися не дуже гарні речі, начебто XSS. Потрібно застосовувати скрипттчистильник, зрозуміло, забравши повідомлення про помилки.

 

ПЕРЕВІРКА НА ПОРОЖНЕЧУ ПОЛЯ

Перевірка того, що користувач увів дані, може здійснюватися, приміром, за допомогою функції isset:

<?

$name = $HTTP_POST_VARS['name'];

if (!isset($name))

{ // якщо змінна $name не існує просимо повторити введення імені

?>

<h1> Ви забули ввести ваше ім'я </h1>

<!-- далі випливає HtmllКод форми, у якій уводиться ім'я -->

<?  }

else  { … }

?>

 Для цієї ж мети можна використовувати функцію empty:

<?

 $name = $HTTP_POST_VARS['name'];

 if (empty($name))

  {  // якщо поле порожнє, знову просимо ввести ім'я

?>

<h1> Ви забули ввести ваше ім'я <h1>

<!-- далі випливає HtmllКод форми, у якій уводиться ім'я -->

<?  }

  else  { … }

?>

На практиці зручно спочатку перевірити, не порожній чи action форми, а потім уже перевіряти різні його складові: поле ім'я, e-mail і т.д. Наприклад:

<?

$action = $HTTP_POST_VARS["action"];

if (!empty($action))

 {

  if (empty($name))

   {

    // код, для випадку, коли не введене ім'я

   }

  if (!empty($email))

   {

    // код, для випадку, коли не введений e-mail

   }

  // подальший код скрипта

 }

if (empty($action))

  {

?>

  <!-- тут пишемо HtmllКод форми, у якій уводиться інформація -->

<? } ?>

ТАБЛИЦЯ ПОРІВНЯННЯ ТИПІВ В PHP

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

Зауваження: Html-Форми не передають тип змінної: вони завжди передають рядки. Для перевірки чи є рядок числом, використовуйте функцію is_numeric().

Зауваження: Використання if ($x) поки $x не визначена згенерує помилку E_NOTICE. Замість цього використовуйте функцію empty() або isset() і/або инициализируйте змінну.

Таблиця. Порівняння типів змінної $x і результатів функцій PHP, пов'язаних з типами

Вираження          gettype()     empty()      is_null()      isset()                  логічне : if($x)

$x = "";      рядок                  TRUE         FALSE       TRUE                  FALSE

$x =NULL  NULL         TRUE         TRUE         FALSE                FALSE

var $x;        NULL         TRUE         TRUE         FALSE                FALSE

$x невизначенаNULL  TRUE         TRUE         FALSE                FALSE

$x = array();масив        TRUE         FALSE       TRUE                  FALSE

$x = false;  логічне       TRUE         FALSE       TRUE                  FALSE

$x = true;   логічне       FALSE       FALSE       TRUE                  TRUE

$x = 1;        ціле            FALSE       FALSE       TRUE                  TRUE

$x = 42;      ціле            FALSE       FALSE       TRUE                  TRUE

$x = 0;        ціле            TRUE         FALSE       TRUE                  FALSE

$x = -1;      ціле            FALSE       FALSE       TRUE                  TRUE

$x = "1";    рядок                  FALSE       FALSE       TRUE                  TRUE

$x = "0";    рядок                  TRUE         FALSE       TRUE                  FALSE

$x = "-1";   рядок                  FALSE       FALSE       TRUE                  TRUE

$x = "php";         рядок                  FALSE       FALSE       TRUE                  TRUE

$x = "true";          рядок                  FALSE       FALSE       TRUE                  TRUE

$x = "false";         рядок                  FALSE       FALSE       TRUE                  TRUE

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

  1. Які команди застосовуються для створення кнопок? Які параметри вони мають?

  2. Як перевірити введення даних? Які команди застосовуються?

  3. Як перевіряється коректність даних?

  4. Які методи застосовують для перевірки даних?

 

Лабораторної робота

Тема: Змінні в сценаріях РНР

Мета: розібратися, як створюються змінні та сценарій з ними

Хід роботи

1. Розглянемо зміни в сценаріях на прикладі закачування файлів. Ознайомтесь з теоретичною довідкою.

 Зазвичай в створенні сайту провідна роль належить його web-мастеру. Відвідувачам залишається лише можливість переглядати сайт (для чого він, власне, і робиться) і присилати його адміністраторові свої побажання по поліпшенню. Ну і інколи - свої матеріали для розміщення на сайті.

 Проте часто виникає бажання надати відвідувачам більше можливостей - скажімо, дозволити їм поміщати свої файли на сайт. Скажімо, ви є адміністратором сайту "Про комп'ютери і Інтернет" і призначили одного зі своїх товаришів ведучим того або іншого розділу. Оскільки параметри доступу до аккаунту сайту (логін і пароль) у вас одні (майже всі провайдери хостингу виділяють на це лише одну пару параметрів), то виникає необхідність вибору: або ви ділитеся з товаришем логіном і паролем на доступ до аккаунту і тим самим різко знижуєте його безпеку (хіба мало куди ці дані від товариша можуть попасти...), або берете на себе обов'язок самостійно закачувати файли, що присилаються товаришем, на сервер. І те, і те вельми і вельми незручно.

Але є третій вихід з положення. Слід виділити під статті товариша окрему теку і дозволити йому завантажувати свої матеріали туди і лише туди. Як же це зробити?

Вдатися до допомоги РНР.

2.Створення каталогів для розміщення файлів.

Спершу слід створити теку, куди поміщатимуться закачувані відвідувачами файли - скажімо, user - в тому прикладі, що розглядатиметься нижче, і привласнити їй атрибут 772, що означає надання відвідувачам сайту можливість записувати в неї файли. Для привласнення атрибуту вистачає, зайшовши за допомогою, скажімо, CUTEFTP на аккаунт, вибрати з контекстного меню цієї теки (тобто з меню правої кнопки миші) пункт CHMOD (рис.) і вказати, що користувачам Public дозволяється в цю теку що-небудь записувати.

У інших програмах для роботи по протоколу FTP права доступу набудовуються аналогічно.

Щоб користувач міг завантажити файл на сервер з web-страницы, на цій сторінці має бути присутньою форма з параметром заголовка enctype, рівному "multipart/form-data", а також із спеціальним полем типа file (виглядає як поле введення імені файлу з кнопкою "Огляд", натискує на яку, можна відображувати вікно вибору файлу) і кнопкою submit (див., наприклад, ріс.7.3). Як тільки ця кнопка натискуватиме, браузер почне передавати файл, вказаний в полі типа file, на сервер. У заголовку форми також слід вказати параметр action, значенням якого має бути ім'я сторінки з оброблювальним завантажений файл сценарієм.

Завантаження файлу на сервер уміють здійснювати практично всі браузери (лише найстаріші моделі Microsoft Internet Explorer і Netscape Navigator цього не можуть), а сприйняти її можуть всі web-серверы (окрім CERN і деяких найпростіших), у тому числі і найпоширеніший - Apache.

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

Сторінці, вказаній в параметрі action заголовка форми, передаються декілька змінних ( Якщо в конфігураційному файлі РНР - php.ini - параметр regis-ter_globals встановлений в on) тих, що містять інформацію про завантажений файл. Саме на їх основі сценарій на ній зможе працювати із завантаженим файлом. Крім того, ці ж самі змінні поміщаються в масив $HTTP_POST_FILES ( Якщо в конфігураційному файлі РНР -php.ini - параметр track_varsустановлен в on), а в РНР версій 4.1 і вище -і в масив SFILES (на відміну від змінних і масиву SHTTPPOSTFILES цей масив за умовчанням доступний і у всіх функціях, розміщених на сторінці з програмою-обробником завантажених файлів).

Ось ці змінні:

1. Змінна, що має те ж ім'я, що і поле з типом file у вихідній формі. Якщо воно виглядало як < input name= "Uploadf ile" type= " f ile">, то змінна матиме ім'я $uploadfile (і відповідно ще $HTTP_POST_FILES['uploadfile']['tmp_name'], $_FILES [ ' uploadf ile ' ] [ ' tmp_name ' ]). У цю змінну записується те ім'я (тимчасове, таке, що створюється автоматично), яке завантажений файл має в теці тимчасових файлів. Саме з ним працюватимуть команди копіювання файлу.

Якщо у вихідній формі присутнє декілька полів типа file з різними іменами, то для кожного з них створюється своя змінна із значенням, що відноситься до відповідного файлу.

2. Змінна, що має ім'я "Змінна 1 jiame", - тобто до імені першої змінної просто приписується горизонтальна риска і слово name, наприклад, для вищезгаданого прикладу її ім'я виглядатиме як $uploadf ile_name (ну і, зрозуміло, те ж саме значення набудуть елементи вищезазначених масивів $HTTP_POST_FILES['uploadfile']['name'], $_FILES ['uploadf ile ' ] ['name ' ]). Її значенням є вихідне ім'я файлу в системі відправника.

3. Змінна, що має ім'я "Змінна 1_size". Її значення -размер завантаженого файлу в байтах.

4. Змінна, що має ім'я "Змінна 1_type". Її значення -тіп завантаженого файлу згідно специфікації MIME (наприклад, "image/gif").

Всі ці змінні можна використовувати в PHP-сценарии, розташованому на вказаній в параметрі action заголовка форми, належній передавальній файл сторінці. Для копіювання файлу використовується команда сміттю ("ім'я копійованого файлу (і дорога до нього)", "дорога до теки, в яку потрібно файл скопіювати і його нове ім'я там"). Дорога до файлу в тимчасовій теці можна не вказувати (вона використовується за умовчанням), а дорога до теки, куди файл має бути поміщений, повинна вказуватися відносний від того каталога, в якому знаходиться сторінка з оброблювальним завантажений файл сценарієм.

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

2. Створення форми для користувача.

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

На сторінці, з якою повинне вироблятися закачування файлів, слід поставити форму (рис.):

Ось її код.

Заголовок форми:

<FORM Enctype="multipart/form-data" ACTION "up . php" Method=post>

 (Т. е. програма, оброблювальна завантажений файл, поміщатиметься у файлі up.php.)

Тепер - поле введення пароля. Його значення при передачі форми запишеться в змінну з тим же ім'ям, що і в цього поля (в даному випадку - в змінну $pass), а також буде доступне в масиві $HTTP_POST_VARS, у елементі $HTTP_POST_VARS ['pass'] (починаючи з РНР версії 4.1 - в елементі $_POST['pass']). Її ви зможете використовувати в сценарії на сторінці, вказаній в параметрі action заголовка форми. Якщо ви вкажете в параметрі type цього поля значення "text", то символи, що вводяться користувачем, відображуватимуться на екрані, якщо "password" - те замістяться зірочками (як на рис.).

Ваш пароль: <INPUT Name="pass" Type="password">

І поле введення імені файлу:

Закачати файл:<INPUT Name="zak" Type="file">

Кнопка початку завантаження:

<INPUT Type="submit" Value="закачать">

 Власне, і все... Для завантаження досить.

</form>

3. Створення сценарію обробки.

Тепер не менш важлива частина - сценарій обробки завантаженого файлу.

На сторінці, ім'я якої вказане в параметрі action заголовка форми завантаження файлу, в будь-якому її місці слід помістити такий код:

<?php

 Якщо в полі введення імені файлу нічого не було, то виконання сценарію припиняємо (з виведенням повідомлення користувача - наприклад, як на рис.), якщо ж немає - те виконується наступна за даною умовою команда elseif:

 if ($zak=="none")

 {echo ("Ви забули вказати файл...");}

Примітка:

 Команда elseif використовується в операторові if для того, щоб проводити перевірку якої-небудь умови у тому випадку, коли та умова, яка вказана в заголовку оператора if, невірно. Вона ідентична конструкції:

 }

 else

 {

 if (вираження) {

 } }

 і введена в РНР для спрощення синтаксису програм.

Якщо введений користувачем пароль не відповідає тому, що вказаний в даному сценарії (звернете увагу, що правильний пароль для завантаження файлів вказується саме тут!), то виконання сценарію припиняємо (з виведенням повідомлення користувача - як на рис.), якщо ж немає - те виконується наступна за даною умовою команда elseif.

Якщо ви бажаєте призначити різним користувачам окремі паролі (щоб, скажімо, мати можливість заборонити завантажувати файли лише одному з них, не торкнувшись інтересів останніх), то просто вкажіть тут відповідну умову (може виглядати так: "elseif ( ($pass!="paroll")&&($pass! = "parol2") )"):

 elseif ($pass!="parol")

{ echo ("Ваш пароль невірний!");}

І нарешті, само копіювання - допустимий, в теку user. Після його закінчення користувачеві видається відповідне повідомлення (рис.).

У умові elseif в нижче наведеній строчці перевіряється, чи видає команда сміттю значення True - що повинне відбуватися при успішному копіюванні. (Якщо не можете розібратися в синтаксисі -смотріте Опис РНР.)

 elseif (сміттю($zak, "user/$zak_name"))

{echo("Файл $zak_name розміром $zak_size байт успішно завантажений на сайт.");}

Примітка:

Команда сміттю виконує копіювання файлу з того місця, яке вказане в її першому параметрі, на те, яке вказане в другому. За наявності в місці призначення файлу з тим же ім'ям, що і в копійованого, новий файл пишеться поверх старого. Команда повертає True, якщо копіювання проходіт вдало, і False, якщо немає, виводячи в останньому випадку також повідомлення на ту сторінку, в сценарії на якій вона розташована. (Якщо останнє небажано, то заблокуйте виведення повідомлень про помилку, поставивши перед командою знак @.)

В тому випадку, якщо з якоїсь причини копіювання здійснити не удається, то про це видається повідомлення. В принципі це і необов'язково - невдача копіювання є помилкою РНР, і про це інформація все одно виводиться (рис.), проте все ж варто ясно вказати користувачеві, через що виникла проблема. До того ж не всі зможуть зрозуміти фразу про помилку англійською мовою.

 else

 { echo("He удалося скопіювати $zak_name");}

 Кінець скрипта:

 ?>

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

Якщо замість імен, що містять інформацію про завантажуваний файл і передаваних через форму змінних, використовувати імена відповідних елементів масивів $HTTP_POST_FILES і $HTTP_POST_VARS, то код обробника виглядатиме так:

<?php

 if ($HTTP_POST_FILES['zak']['name']=="none") {echo ("Ви забули вказати файл...");}

 elseif ($HTTP_POST_VARS['pass']!="parol") { echo ("Ваш пароль невірний!");}

 elseif

(сміттю($HTTP_POST_FILES['zak']['tmp_name'], "user/".$HTTP_POST_FILES['zak']['name']))

{echo ("Файл ".$HTTP_POST_FILES['zak1] ['name'] ." розміром ".$HTTP_POST_FILES['zak']['size']." байт успішно завантажений на сайт.");}

 else

 echo("Hfe удалося скопіювати ".

 $HTTP_POST_FILES['zak']['name']);} ?>

Звернете увагу, що при формуванні кінцевого імені файлу (у команді сміттю), а також в рядках, що виводяться командою echo, писати просто імена елементів масиву не можна - видаватиметься помилка! Необхідно використовувати оператора конкатенації - крапку:

Неправильно:

 echo ("Ім'я файлу: $HTTP_POST_FILES['zak']['name']")

Правильно:

 echo ("Ім'я файлу:". $HTTP_POST_FILES t'zak'] ['name'])

Можливе завантаження і декількох файлів відразу. Для цього просто у вихідній формі слід вказати декілька полів з типом file, давши кожному своє назву. У обробник будуть передані змінні для кожного завантаженого файлу.

Проте для завантаження декількох файлів можна використовувати і конструкцію з масивом. Для цього досить у вихідній формі дати полям типа file назву з квадратними дужками:

<input name="uploadfile[]" type="file">

 <input name="uploadfile[]" type="file">

 <input name="uploadfile[]" type="file">

 В результаті в програму-обробник будуть передані:

1. Масиви $uploadfile[], $uploadfile_name[], $uploadfile_size[], $uploadfile_type[], що містять відповідно тимчасові імена завантажених файлів, вихідні імена завантажених файлів, розміри завантажених файлів і типів завантажених файлів. Порядок елементів в масивах в точності відповідає порядку полів у вихідній формі - так, якщо ім'я файлу file.zip було введено в перше поле типа file, то що відносяться до цього файлу змінні розташовуватимуться в елементах перерахованих масивів з індексом 0 (не забувайте - нумерація елементів масивів починається з нуля!).

 Дані масиви будуть передані в обробник у всіх версіях РНР, починаючи з 3.0.1, якщо у файлі php.ini ( Налаштування цього файлу - привілей адміністратора web-сервера, так що якщо ви таким не є, то включити ви її не зумієте) включена опція regis-ter_globals.

2. Масиви $HTTP_POST_FILES['uploadfile']['tmp_name'][], $HTTP_POST _FILES [luploadfile')['name'][], $HTTP_POST_FILES ['up-loadfile'h'size'][] і $HTTP_POST_FILES['uploadfile']['type'][], що містять відповідно тимчасові імена завантажених файлів, вихідні імена завантажених файлів, розміри завантажених файлів і типів завантажених файлів. Порядок елементів в масивах знову-таки в точності відповідає порядку полів у вихідній формі.

Дані масиви будуть передані в обробник у всіх версіях РНР, починаючи з 3.0.1, якщо у файлі php.ini включена опція track_vars.

3. Масиви $_FILES['uploadfile']['name'][], $_FILES['uploadfile'] ['tmpjiame'jo $_FILES['uploadfile']['size'][] u $_FlLES['uploadfile'] I'type'jl]. Їх вміст аналогічно попереднім. Дані масиви будуть передані в обробник у версіях РНР, починаючи з 4.1.

У даних прикладах uploadfde - це всього лише ім'я масиву, ви, природно, можете назвати його по-іншому.

У РНР 3-ої версії з номером підверсії 3.0.17 і вище, а також починаючи з версії 4.0.3, в РНР спеціально для роботи із завантаженими через форму файлами є дві команди - is_uploaded_file іmove_uploaded_file. При використанні описаного вище способу завантаження файлів існує небезпека того, що якийсь зловмисник замість вказівки у формі реального файлу зі свого комп'ютера вкаже дорогу до якого-небудь файлу на web-сервере (наприклад, файлу з паролями користувачів), і тим самим сценарій, оброблювальний завантажений файл, працюватиме вже з цим файлом. Ясна річ, такий розвиток подій представляється вельми небажаним. За допомогою даних команд можна виключити таку можливість. Перша команда перевіряє, чи був той файл, який вказаний в її параметрі, завантажений через форму завантаження файлів з браузера відвідувача, і якщо так, то повертає True, інакше - False. Друга ж аналогічна команді сміттю, проте, в качсстве#ісходного файлу для копіювання в ній допустимо вказувати лише завантажений від відвідувача файл. Інакше команда не відпрацює, повернувши False (без виводу в документ яких-небудь запобігань, на відміну від ситуації невдачі копіювання по яких-небудь іншим причинам).

Примітка:

Команда is_uploaded__file() no суть справи перевіряє, чи знаходиться вказаний в її параметрах файл в тимчасовій директорії сервера - тобто тій, куди всі завантажувані файли спочатку поміщаються. Те ж саме перевіряє іmove_uploaded_file () перед початком копіювання.

Отже, як бачите, надати відвідувачам можливість завантажувати файли на ваш сайт досить просто. Як і створити просту, але досить ефективну систему обмеження цієї можливості по паролю - всього лише за допомогою перевірки передаваною через форму змінної, що містить пароль; сам же пароль вказується в тексті програми на РНР. Для того, щоб дати вашому другу можливість вести свою "колонку" на вашому сайті, це буде вистачає.

Ще, звичайно, хотілося б зробити щось начеб простого "файл-менеджера", який би дозволив користувачеві хоч би видаляти непотрібні файли з його каталога. Про те, як реалізувати таку можливість - в главі 10 цієї книги.

Проте описані вище сценарії мають один вельми істотний недолік, який, зокрема, вельми утрудняє завантаження великих файлів. Звернете увагу, що перехід на сторінку з сценарієм, оброблювальним завантажений файл і що поміщає його в потрібну теку, а заразом і перевіряючим правильність пароля користувача, можливий лише після повного завантаження файлу. Т. е. користувачеві, який ввів невірний пароль, все одно доведеться чекати закінчення даремного завантаження його файлу на сервер, витрачаючи на це свій час в Мережі і трафік. Якщо завантажувані файли маленькі, то це ще як можна потерпіти, а якщо вони мають мегабайтниє розміри? Адже тоді цілком можна чекати скарг від розсерджених користувачів, що витратили по півгодини часу в Інтернеті на те, щоб взнати врешті-решт, що їх пароль неправильний...

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

 

Лабораторна робота

Тема: Використання констант в сценаріях РНР

Мета: розібратися, як створюються константи та відображаються їх значення

Хід роботи

1. Почнемо створювати сайт для введення даних. Додатково інформацію можна прочитать на сайті:

http://www.ibm.com/developerworks/ru/edu/os-phptut1/section4.html

Почніть зі створення простий Php-Сторінки:<html>

<title>Workflow Registration</title>

<body>

    <p>You entered:</p>

    <p><?php echo "Some Data"; ?></p>

</body>

</html>

У цьому прикладі ми бачимо просту Html-Сторінку c однієї Php-Секцією, яка виділена жирним шрифтом. Коли Web-Сервер зустрічає послідовність символів <?php, те це служить для нього сигналом, що далі випливають команди, а не просто текст, який треба послати браузеру. Сервер продовжує виконувати команди PHP.

У нашому випадку є тільки одна команда, echo, це інструкція серверу вивести текст, який стоїть після неї в лапках. Тобто, якщо ви збережете цю сторінку й захочете переглянути її своїм браузером, браузер одержить наступний текст:

<html>

<title>Workflow Registration</title>

<body>

    <p>You entered:</p>

    <p>Some Data</p>

</body>

</html>

Щоб подивитися, як це працює, збережете текст Php-Сторінки у файл із іменем registration_action.php і помістите файл у кореневу папку з документами для вашого сервера. Для Apache це буде папка, схожа на /var/www/html, для Internet Information Services це буде папка, схожа на C:\Inetpub\wwwroot.

Відкрийте браузер з адресою http://localhost/registration_action.php. Результат роботи вашого браузера буде подібний тому, що ви можете бачити нижче на рис.

2. Введемо в наш сайт змінні.

Змінна служить контейнером і іменем для даних. З того моменту, як ви привласнили змінної деяке значення, PHP завжди, зустрівши цю змінну, замінить її на значення. Розглянемо приклад, для цього внесіть наступні зміни у свою сторінку:

<html>

<title>Workflow Registration</title>

<body>

    <p>You entered:</p>

<?php

    $username = "tyler";

    $password = "mypassword";

    echo "<p>Username = " . $username . "</p>";

    echo "<p>Password = " . $password . "</p>";

?>

</body>

</html>

Збережіть файл і обновіть сторінку вашого браузера. Те, що ви побачите, буде схоже на рис.

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

Ще одне зауваження: імена змінних в PHP чутливі до регістру, тобто, $Username і $username -- це дві зовсім різні змінні.

Оскільки помилки подібного роду досить складно відшукувати, в PHP існує ряд угод про правила найменування змінних. Одне із цих правил говорить, що імена змінних повинні складатися із символів у нижньому регістрі.

 

3. Розглянемо константи, як вони вводяться і відображаються на сайті.

Ви можете вільно змінювати значення змінної, але іноді буває корисно задати змінну, значення яке не може бути змінене. Такі об'єкти називаються константами. Наприклад, ви можете визначити константу для зберігання заголовка, який буде виводитися на кожній сторінці: 

<?php

   define("PAGE_TITLE", "Workflow Registration");

?>

<html>

<title><?php echo PAGE_TITLE ?></title>

<body>

    <p>You entered:</p>

...

Помітьте, що в цьому операторові задається пара: ім'я константи і її значення. Якщо ви спробуєте змінити значення константи після того, як воно було визначено, то одержите повідомлення про помилку.

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

Для виводу даних в PHP існує оператор виводу, ви можете передати дані за допомогою конструкції <?= ?> :

<?php

   define("PAGE_TITLE", "Workflow Registration");

?>

<html>

<title><?= PAGE_TITLE ?></title>

<body>

    <p>You entered:</p>

...

Зверніть увагу, що за оператором виводу не ставиться крапка з комою.

3. Створення й використання форм в PHP.

Мова PHP споконвічно розроблявся як мова для Web-Програмування. Звичайно, ви можете запустити PHP з командного рядка, але фактично випадки використання PHP поза Web-Додатків дуже рідкі. Як правило PHP використовується разом з Html-Формами.

Ви створюєте форму з використанням HTML, потім користувач вводить дані в цю форму й ініціює її передачу, браузер пересилає дані серверу у формі масиву.

Почніть зі створення сторінки реєстрації для вашого додатка. На цій сторінці користувачі будуть уводити свої дані, а ви будете затверджувати їх, тобто виконувати деякі перевірки, перш ніж переслати дані в базу. Для початку просто створимо форму для введення. Створимо новий файл registration.php і помістимо в нього наступний текст:

<html>

<head><title>Workflow System</title></head>

<body>

<h1>Register for an Account:</h1>

<form action="registration_action.php" method="GET">

Username: <input type="text" name="name" /><br />

Email: <input type="text" name="email" /><br />

Password: <input type="password" name="pword" /><br />

<input type="submit" value="GO" />

</form>

</body>

</html>

Таким чином, ми маємо просту форму, яка втримується усередині Html-Тегу form, у ній є текстове поле для введення пароля й клавіша для відсилання даних. Збережіть цей текст у файл із іменем registration.php і помістіть файл у кореневу папку з документами для вашого сервера, потім відкрийте браузер з адресою http://localhost/registration.php. Результат роботи вашого браузера буде схожий на те, що можна бачити нижче, на рис.

Зверніть увагу на те, що в поле для введення пароля не відображаються символи, які ви набираєте, замість цього з'являються зірочки. Що ж відбувається, коли користувач натискає клавішу GO?

4. Розглянемо, як відбувається передача даних з форми.

Формат елемента form нашої форми<form action="registration_action.php" method="GET">

У цьому елементі визначено два параметри. Перший, action, повідомляє браузеру куди посилати інформацію. У нашому випадку посилання веде до того файлу, який ми створили раніше, registration_action.php. Другий параметр, method, повідомляє браузер як передавати дані.

Подивимося, як це працює. Уведіть які-небудь дані й натисніть кнопку GO. Результат виконання на рис.

У тому випадку, якщо ви не ввели дані, але нажали кнопку, форма буде працювати також, оскільки в нас поки ще не налагоджене приймання введених даних. Зверніть увагу на URL, який з'явився в поле адреси браузера http://localhost/registration_action.php?name=roadnick&email=

ibmquestions%40nicholaschase.com&pword=supersecretpassword

Зверніть увагу, що кожному елементу форми в URL відповідає пара ім'я-значення і ці пари розділені амперсандами. Такий вид URL обумовлений тим, що ми використовували як метод передачі GET.

5. Розробимо сайт для приймання даних з форми

Розглянемо, яким образом дані, уведені в Html-Форму, можна зробити доступними, що ухвалює Php-Сторінці. Внесіть наступні зміни у файл registration_action.php:...

<body>

    <p>You entered:</p>

<?php

    $username = $_GET['name'];

    $password = $_GET['pword'];

    echo "<p>Username = " . $username . "</p>";

    echo "<p>Password = " . $password . "</p>";

?>

</body>

</html>

Значення змінних будуть тепер вибиратися по імені з масиву $_GET. Трохи нижче ми поговоримо про масиви докладніше, а зараз спробуйте обновити віконце браузера, ви побачите, що введені дані з'явилися на своїх місцях, як показано на рис.

Ви можете витягти будь-яку частину переданої інформації з імені, але є й інші можливості роботи з масивами.

6. Розглянемо, як можна організувати роботу масивів.

В PHP можна організовувати масиви даних, тобто списки значень, це дозволяє легко переміщати одночасно цілі групи даних. Наприклад, створимо масив із трьох елементів і передамо його для висновку на сторінку:$formnames = array("name", "email", "pword");

echo "0=".$formnames[0]."<br />";

echo "1=".$formnames[1]."<br />";

echo "2=".$formnames[2]."<br />";

Функція array() повертає змінну, яка є масивом.

Результат роботи цього скрипта буде таким:

0=name<br />

1=email<br />

2=pword<br />

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

У той момент, коли ви відсилаєте свою форму, ви по суті створюєте асоціативний масив:

     $_GET = array("name" => "roadnick",

                          "email" => "ibmquestions@nicholaschase.com",

                          "pword" => "supersecretpassword");

Саме цей факт дозволяє згодом виділити окремі значення, наприклад, $_GET["name"], імена змінних у цьому випадку відіграють роль ключів.

 

7. Одержання інформації про масив.

Асоціативні масиви вкрай корисні при передачі даних між формами, але при їхньому використанні може виникнути труднощі, далеко не завжди відома структура масиву. Така ситуація може бути, наприклад, якщо асоціативний масив був отриманий у результаті виконання запиту до бази даних.

В PHP є дві функції, які полегшують використання таких масивів:

<body>

    <p>You entered:</p>

<?php

    $form_names = array_keys($_GET);

    $form_values = array_values($_GET);

    echo "<p>" . $form_names[0] . " = " . $form_values[0] . "</p>";

    echo "<p>" . $form_names[1] . " = " . $form_values[1] . "</p>";

    echo "<p>" . $form_names[2] . " = " . $form_values[2] . "</p>";

?>

</body>

</html>

Функції array_keys() і array_values() повертають звичайні масиви, до елементів яких можна звертатися за допомогою числових індексів, як показано нижче на рис.

Цей спосіб роботи з масивами також має незручності. Наприклад, ви можете не знати, скільки всього елементів в асоційованому масиві. В PHP існують і інші способи роботи з асоційованими масивами.

 

8. Використання циклу for-next

Послідовна обробка деякого числа однотипних значень виникає дуже часто. Для її виконання застосовується така конструкція як цикл. От один із прикладів циклу:

for ($i = 0; $i < 10; $i++) {

   echo $i . " ";

}

Результат його роботи буде наступним:0 1 2 3 4 5 6 7 8 9

Розглянемо синтаксис виразу for. Спочатку PHP приписує значення 0 змінної $i. Цикл триває доти, поки значення змінної $i залишається менше 10, на кожному кроці циклу значення змінної $i збільшується на одиницю.

Оскільки в нас є можливість довідатися, скільки всього значень містить масив $_GET, ми легко можемо організувати цикл, який відобразить усі значення, передані нам з форми:

<body>

    <p>You entered:</p>

<?php

    $form_names = array_keys($_GET);

    $form_values = array_values($_GET);

    for ($i = 0; $i < sizeof($_GET); $i++) {

       echo "<p>".$form_names[$i]." = " . $form_values[$i] . "</p>";

    }

?>

</body>

</html>

Функція sizeof() повертає число елементів масиву, у нашому випадку масиву $_GET. Результат роботи циклу показаний нижче на рис.

Для роботи з асоційованим масивом $_GET ви можете використовувати і інший тип циклу, цикл із ключовим словом foreach.

9. Використання циклу foreach

Асоційовані масиви настільки часто використовуються в PHP, що для роботи з ними була створена спеціальна конструкція, яка дозволяє одержувати доступ до даних, минаючи ключі. Замість цього ви можете використовувати цикл foreach, він дозволяє маніпулювати з даними масиву прямо. Давайте розглянемо приклад коду:...

<?php

    foreach ($_GET as $value) {

       echo "<p>" . $value . "</p>";

    }

?>

На першому кроці циклу буде задано перше значення з масиву $_GET, це значення буде присвоєно змінній $value, потім це значення виводиться командою echo. Потім цикл повторюється, змінній $value приписується друге значення і так далі, цикл працює доти, поки в масиві $_GET ще залишаються неопрацьовані елементи. Результат роботи цього циклу буде наступним:

<p>roadnick</p>

<p>ibmquestions@nicholaschase.com</p>

<p>supersecretpassword</p>

Ця конструкція дозволяє витягати не тільки значення елементів асоційованого масиву, але й ключі:...

<?php

    foreach ($_GET as $key=>$value) {

       echo "<p>".$key." = " . $value . "</p>";

    }

?<

...

Такий варіант коду приведе нас до результату.

 

10. Повторювані значення у формах

Іноді виникає ситуація, коли у форму треба ввести кілька значень для змінної з тим самим іменем. Прикладом може служити поле пароля pword. Оскільки користувачі не можуть бачити символи пароля, які вони набирають, то ви можете попросити їх увести пароль двічі, для того щоб переконатися, що вони не зробили помилку при введенні:...

Username: <input type="text" name="name" /><br />

Email: <input type="text" name="email" /><br />

Password: <input type="password" name="pword[]" /><br />

Password (again): <input type="password" name="pword[]" /><br />

<input type="submit" value="GO" />

...

Звертаю увагу, що ім'я поля pword трохи змінилося. Оскільки це поле повинне містити кілька значень, то воно саме стало масивом. Таким чином, масив переданих даних для цієї форми буде містити в якості одного зі своїх елементів інший масив. Коли ви натиснете кнопку відправлення форми, то в полі адреси виникне наступний URL:http://localhost/registration_action.php?name=roadnick&email=ibmquestions%40nicholas

chase.com&pword[]=supersecretpassword&pword[]=supersecretpassword

При цьому в процесі обробки буде створений масив:

$passwords = array("supersecretpassword", "supersecretpassword");

$_POST = array("name"=>"roadnick",

                           "email"=>"ibmquestions@nicholaschase.com",

                           "pword"=>$passwords);

У цьому варіанті для перегляду значення пароля ви повинні звертатися до відповідної змінної як до масиву із числовим індексом:...

    foreach ($_GET as $key=>$value) {

       echo "<p>".$key." = " . $value . "</p>";

    }

    $passwords = $_GET["pword"];

    echo "First password = ".$passwords[0];

    echo "<br />";

    echo "Second password = ".$passwords[1];

...

Якщо ви відішлете форму (не забудьте обновити сторінку), то можете помітити деякі зміни, як показано нижче на рис.

Зверніть увагу, у поле, де раніше відображався пароль, з'явилося слово Array, елементи самого масиву відображені нижче.

11. Відмінності методів GET і POST

Дотепер для передачі даних з форми ми використовували метод GET, головною незручністю й обмеженням цього методу є той факт, що передані дані містяться прямо на адресу URL. У деяких випадках це цілком припустиме, в інших -ні. Наприклад, вам потрібно передати з форми великий блок даних з поля типу textarea, звичайно такий тип використовується для розміщення коментарів. Як правило, Web-Сервер обмежує число символів, які можна помістити в Url-Адресу, у такий спосіб передати дані за допомогою методу GET просто неможливо.

Згідно із прийнятими стандартами технології Web-Програмування, метод GET не слід використовувати для передачі даних у скрипты, які можуть мати "побічні ефекти", а фактично будь-який скрипт, у якім відбувається обробка даних, має цю властивість. Дотепер ми тільки відображали введені дані, обробки не відбувалося, але якщо ми прагнемо додати запис у базу даних, те це вже обробка, яка може мати побічний ефект.

Той факт, що метод GET передає дані в Url-Адреси відкритим, тобто, доступним для перегляду образом, не тільки впливає на безпеку системи, але має й інші незручності. Наприклад, користувач може зробити закладку на цю адресу, що приведе до того, що операція буде виконуватися багато раз; пошукові машини, які індексують Url-Адреси, можуть перехопити дані, що направляються у вашу базу і так далі.

Тому в більшості випадків має сенс користуватися методом POST, який передає дані в тілі запиту, а не в заголовку, як метод GET.

 Зовні використання методу POST мало відрізняється від використання методу GET. Спочатку внесемо зміни у файл registration.php:...

<h1>Register for an Account:</h1>

<form action="registration_action.php" method="POST">

Username: <input type="text" name="name" /><br />

...

При відсиланні форми ви побачите, що зміст Url-Адреси змінилося: http://localhost/registration_action.php

Зміни потрібні і у файлі registration_action.php, для приймання даних замість масиву $_GET буде використовуватися масив $_POST:...

<body>

    <p>You entered:</p>

<?php

    foreach ($_POST as $key=>$value) {

       echo "<p>".$key." = " . $value . "</p>";

    }

    $passwords = $_POST["pword"];

    echo "First password = ".$passwords[0];

    echo "<br />";

    echo "Second password = ".$passwords[1];

?>

</body>

</html>

Подальша робота з масивом $_POST відбувається точно так само, як і з масивом $_GET.

 

12. Умовний оператор if-then

Вище ми попросили користувача ввести пароль двічі. Тепер подивимося, як можна перевірити, не чи було зроблено помилки при введенні пароля. Для цього використовуємо умовний оператор if-then:...

    $passwords = $_POST["pword"];

    echo "First password = ".$passwords[0];

    echo "<br />";

    echo "Second password = ".$passwords[1];

    if ($passwords[0] == $passwords[1]) {

        echo "<p>Passwords match.  Thank you.</p>";

    } else {

        echo "<p>Passwords don't match.  Please try again.</p>";

    }

...

У заголовку умовного оператора в дужках поміщене деяке вираження (у нашому прикладах це $passwords[0] == $passwords[1]), яке може бути істинно (TRUE) або ложно (FALSE). Якщо воно істинно, то PHP виконує той оператор, який іде за умовним виразом, це може бути блок операторів у фігурних дужках. Якщо воно ложно, що виконується блок, що випливає за ключовим словом else, а якщо його ні, то скрипт переходить до виконання наступного оператора.

Зверніть увагу на те, що ми написали $passwords[0] == $passwords[1], а не $passwords[0] = $passwords[1], тобто використовували подвійний знак рівності. Це не випадково. Простий знак рівності працює як оператор присвоювання, тобто, значення $passwords[0] у цьому випадку просто стане рівним $passwords[1]. Нам же треба зовсім не це, ми прагнемо зрівняти значення змінних і тому використовуємо оператор порівняння -- подвійна рівність.

Нижче, на рисунку, показана сторінка, яку побачить користувач у тому випадку, якщо він зробив помилку при введенні пароля.

Для формування більш складних логічних виразів можна застосовувати логічні оператори, наприклад, оператор И (&&) і оператор АБО (||). Розглянемо наступний вираз:

if (($today == "Monday") && ($status == "Not a holiday")) {

      echo "GO TO WORK!!!";

}

Значення логічного виразу в дужках буде істинно (TRUE) у тому випадку, якщо сьогодні понеділок (Monday) і цей день не є святковим.

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

  1. Які є данні в PHP?

  2. Як вводяться змінні?

  3. Що таке константі і як вони задаються в PHP?

  4. Як працює оперетор умовного переходу?

  5. Які оператори циклів ви знаєте?

 

Лабораторна робота

Тема: Робота з даними

Мета: розібратися, які є типи даних та як вони пов’язані зі змінними, а також, як виконуються основні математичні операції

Хід роботи

1. Створення файлу для зміни кольору рядка.

Створюємо файл example-1.php і пишемо в нього найпростіший код:

<font color=#<? echo $color; ?>>Піддослідний рядок</font>

<form action="" method=GET>

<input type="text" name=color>

<input type="submit" value="перемінити колір">

</form>

Якщо ваш Apache зібраний з PHP, то можете спробувати ввести у віконце різні кольори й нажати на кнопочку.

Нагадаю, що колір задається шестнадцатеричным числом (RGB) від 0000000(чорний) до FFFFFF(білий).

FF0000 — червоний

00FF00 — зелений

0000FF — блакитний

PHP сам розпізнав змінну $color, у якій ви передали код кольору. Вам не довелося робити парсинг рядка (розбирати рядок на складові), щоб з'ясувати, які змінні були передані в htmlпзапиті і які значення вони містять.

Спеціально додані method=GET, щоб ви в рядку URL побачили свою змінну.

З PHP використовується всього одна функція echo. Вона виводить усе, що ви їй дасте: рядка, цифри, значення змінних. В інших мовах вона називається print.

Додамо ще один вивід тієї ж змінної.

<font color=#<? echo $color; ?>>Наш колір: <? echo $color; ?></font>

<form action="" method=GET>

<input type="text" name=color>

<input type="submit" value="перемінити колір">

</form>

Тепер програма виводить код кольору, пофарбований у цей самий колір.

>Наш колір:

Якщо на сервері замість результату використання коду ви бачите сам код, значить вам треба міняти хостинг: ваш веб-сервер не підтримує PHP.

 

2. Створення каталогів й базу даних.

Напишемо цільний web-проект за всіма правилами. Так так, щоб був він корисний багатьом, так щоб на нього лягав будь-який дизайн, так щоб усе було: задум, план, блок-схема й усе інше. З використанням PHP, Mysql і особливостей Apache.

Завдання.

Написати комплект скриптов мовою PHP наступні можливості, що надають, користувачеві:

- Можливість публікувати тексти через стандартну web-форму.

- Можливість змінювати й видаляти опубліковані тексти.

- Можливість створювати й редагувати теми, що поєднують тексти.

- Автоматичне створення змісту.

- Автоматичний висновок обраного тексту в рамках закладеного дизайну.

- Підрахунок елементарної статистики відвідування сайту.

Загалом, повинно вийти, що нагадує даний сайт (http://kurepin.ru). Тільки створений не у вигляді десятка примітивних функцій, а у вигляді солідного пакета скриптов з усіма сучасними примочками: back office, mail-информер, повний контроль над помилками, без якої великий проект просто не зможе ефективно існувати.

Почнемо із планування. Планування — найважливіша частина створення великого проекту.

Для початку сплануємо місце в директорії, щоб правильно зберігати те, що буде народжуватися.

Припустимо, що ви вибрали правильного провайдера. І повний шлях до вашого каталогу виглядає приблизно так:

/home/roma/

А директорія (або "папка", — як зараз прийнято говорити), у якій повинні лежати html-файли сайту, називається:

/home/roma/WWW/

Цю папку називають html або public_html.

Тепер, потрібна папка, де ми будемо зберігати всі скрипти. Це повинна бути папка НЕ в директорії WWW, інакше всі бажаючі зможу подивитися ваші скрипт. Тому, для необхідних нам файлів-скриптов ми створюємо:

/home/roma/req/

req — це від слова require (бідувати).

Ще знадобиться папка, у яку складемо шматки html для динамічного складання сторінок. Назвемо її inc ( від include).

/home/roma/inc/

Ще папка для зберігання даних:

/home/roma/data/

І папка для зберігання періодично виконуваних програм службою cron:

/home/roma/cron/

Давайте створимо в папці WWW папку pic ( від picture) для зберігання всякої графіки.

Каталог /home/roma/ виглядає от так:

./req

./data

./inc

./WWW

./WWW/pic

Наступним етапом створитимо базу даних для зберігання даних.

Якщо ви не знайомі з мовою SQL, то знайти документацію по стандартних Sql-можливостям можна на тому ж www.citforum.ru.

Базу назвемо так само, як і account у провайдера — ROMA. По-перше, щоб не плутатися, а по-друге, звичайно так провайдер і видає доступ до Sql-Серверу.

Якщо база ще не створена, то її створюємо:

create database roma;

і переходимо в неї:

use roma;

Нам будуть потрібні три таблиці: таблиця розділів, таблиця текстів і таблиця статистики. Створимо поки дві.

Інформацію з роботи з Mysql-Сервером ви найдетет на сайті виробника: www.mysql.com.

Таблиця tbl_cats (категорії, розділи):

create table tbl_cats(

c_id int not null auto_increment primary key,

c_name varchar(50) not null default ""

);

Пояснюю. Тут написано, що таблиця tbl_cats має два поля: c_id — унікальний целочисленный ідентифікатор запису і c_name — буквена назва.

Можемо відразу додати в нашу таблицю перший розділ:

insert into tbl_cats(c_name) values(' web-огляди');

Тепер друга таблиця:

create table tbl_texts(

t_id int not null auto_increment primary key,

t_name varchar(200) not null default "",

t_dt datetime not null

);

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

 

3. ООП (Об'єктно-Орієнтованім Програмуванні) і класи.

В ООП усі функції й змінні поєднуються в класи (class). Класи між собою поєднуються "спадкуванням" (extends). Спадкування відбувається в одну сторону: від батька до сина. Причому, син успадковує всі можливості батька.

Припустимо, що клас "first" має у своєму тілі дві змінні й дві функції, що працюють із цими змінними:

class first

{

 var $a1;

 var $b2;

 function f_increment($x)

 {

  settype($x,"integer");

  $this->$a1=$this->a1+$x;

  return(0);

 }

 function f_ab()

 {

  $this->$a1=$this->a1+$this->$b2;

  return(0);

 }

}

Це оголосили змінні $a1 і b2, і дві функції. Перша одержує в якості параметра якесь значення x, яке приводить до цілого числа, і додає його (число) до глобальної змінної $a1, повертає "0" у якості коду помилки (0 — немає помилок). Друга функція просто додає наші дві оголошені змінні й результат записує в змінну $a. Теж повертає код помилки. Завжди повертайте код помилки виконання будь-якої функції!

Тіло першої функції:

$this->$a+=(int)$x;

Можна так написати. Але це не дуже зрозуміло для тих, хто слабко знаком із синтаксисом PHP або C.

Зверніть увагу на конструкцію $this->. У такий спосіб усередині класу ми звертаємося до будь-якого оголошеного об'єкта класу. Будь те змінна або функція.

У конструкціях виклику процедур або змінних не треба нічого міняти. Функція відрізняється від змінної під час виклику тільки тим, що містить у себе "на хвості" додаткові параметри або пару порожніх дужок, якщо параметрів немає.

$this->labuda — це змінна.

$this->labuda() — це функція.

echo "Результати роботи: ".$this->labuda()." і ".$this->labuda; — висновок обох значень: значення змінної буде виведено як є, а функція відробить і видасть результат своєї роботи не гірше змінної. Крапка "." в PHP використовується для злиття двох рядків:

"123"."abc" = "123abc"

Увага: змінна й функція цілком можуть мати однакові імена, інтерпретатор PHP сам розбере "хто є who", якщо ви не будете забувати про дужки на хвості у функцій. У більших проектах часто користуюся, щоб не плутатися.

Створюємо клас "second", від класу "first":

class second extends first

{

...

}

Навіть якщо на місці двокрапки (у тілі класу) ми не визначимо ні однієї змінної або функції, ми можемо користуватися тими, які описані в класі first.

Таким чином, в ООП створюють класи й успадковують їх, рухаючись від загального до часток. Виходить чітка деревоподібна структура класів, яку ми й створимо для нашого проекту. В PHP не реалізоване множинне спадкування. Кожний новий клас може народжуватися тільки від одного батька. Нам цього буде цілком достатньо.

Всі веб-проекти діляться на наступні тематичні групи скриптов (ці групи буду відразу називати класами, користуючись термінологією ООП. А кожний клас треба зберігати в окремому файлі із закінченням ".class"):

1. Клас змінних, що описують властивості проекту (class_var). Цей клас звичайно робиться споконвічним, у якому описуються глобальні змінн, що впливають на роботу всього проекту. Такі, як: шляхи на диску, час кеширования сторінок, стандартні назви, формати відображення часу й дати, і так далі.

2. Клас class_mysql успадковується від class_var. За назвою класу не складно догадатися, що він присвячений роботі з базою даних Mysql. Це буде невеликий клас.

3. Клас class_util містить усі глобальні утиліти, які можуть знадобитися на кожному з етапів виконання завдання. Крім того, у цьому класі описано найважливішу частину проекту: обробку помилок.

Ці три класи можна було б об'єднати в один, тому що всі інші класи будуть успадковуватися від class_util, але краще тримати їх саме в різних файлах. Так простіше вносити зміни в потрібне місце.

Є три основні групи скриптов. Група, відповідальна за додавання даних у базу сайту. Група, відповідальна за висновки даних з бази. І група, відповідальна за виконання періодичних (cron) завдань.

Визначимо три основні класи:

class_in

class_out

class_cron

4. Створення на PHP: vars.class

Першим ішов клас, що описує основні змінні й параметри системи. От із цього класу й почнемо.

Клас: class_vars.

Файл: vars.class

Місце розташування: /home/roma/req/

Отже, створюємо новий файл із зазначеною назвою, відкриваємо початок Php-Коду (<?) і починаємо писати.

Шапка:

<?

class class_vars

{

Насамперед, треба описати всі абсолютні шляхи до даних. Тоді, у випадку переїзду проекту в іншу папку або взагалі на інший сервер, треба буде всього лише замінити значення цих змінних.

В PHP коментар починається з подвійного слеша "/". А в іменах змінних ураховується регістр (висота букв).

Пишемо:

// Шляхи до папок.

var $PATH="/home/roma"; // основний шлях до проекту

var $PATH_INC="/home/roma/inc";

var $PATH_REQ="/home/roma/req";

var $PATH_DATA="/home/roma/data";

var $PATH_WWW="/home/roma/WWW";

var $PATH_WWW_PIC="/home/roma/WWW/pic";

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

Якщо раптом знадобиться перенести якісь дані в інше місце (а в більших проектах подібне трапляється), то треба буде просто поміняти от ці самі шляхи. А не вивчати всі скрипты, у пошуках звертань до потрібних директорій.

Тепер опишемо віртуальні шляхи до вашого сайту. Т.е. Url. А заодно опишемо відразу повну назву нашого проекту, коротка його назва й деякі інші зрозумілі параметри.

Відкриваємо наш vars.class і пишемо далі:

// Основний URL

var $PATH_HTTP="http://roma.21.ru/";

// Повна назва й коротка

var $NAME_FULL="Персональна сторінка Роми-Оглядача";

var $NAME_SHORT='' Рома-Оглядач";

// адреса хазяїна сторінки

var $EMAIL_ADMIN=array("roma@21.ru");

// технічна служба сайту

var $EMAIL_NOC=array("roma@21.ru","noc@21.ru");

// Час кеширования сторінок "Expires" (у секундах)

 var $CACHE_TIME=300;

// Максимальний розмір подгружаемого в базу тексту

 var $TEXT_SIZE_MAX= 1048576; // це мегабайт

// Мінімальний розмір подгружаемого в базу тексту

 var $TEXT_SIZE_MIN=100; // сто байт

// Формат висновку часу ( з Sql-Бази)

 var $TIME_FORMAT="%H:%i:%S"; // ЧЧ:ММ:СС

// Формат висновку дати ( з Sql-Бази)

 var $DATE_FORMAT="%d.% m.% Y"; // ДД.ММ.ГГГГ

У процесі подальшої роботи будемо звертатися до цього класу, щоб поповнити його новими й новими даними.

Зберігаємо файл, не забувши попередньо закрити клас і закрити головний Php-Тэг (?>):

}

?>

Користуйтеся нормальними текстовими редакторами для роботи з PHP. Редакторами, у яких зрозуміло, де закінчується рядок і де закінчується весь текст. Якщо ви не прагнете помилок "незрозумілого походження", -- перевірте: після закриваючого Php-Тэга не повинно бути ніяких символів, включаючи символ перекладу рядка. Закриваюча трикутна дужка (>) повинна бути останнім символом файлу.

На даний момент файл vars.class виглядає от так:

<?

class class_vars

{

 // Шляхи до папок.

 var $PATH="/home/roma"; // основний шлях до проекту

 var $PATH_INC="/home/roma/inc";

 var $PATH_REQ="/home/roma/req";

 var $PATH_DATA="/home/roma/data";

 var $PATH_WWW="/home/roma/WWW";

 var $PATH_WWW_PIC="/home/roma/WWW/pic";

 // Основний URL

 var $PATH_HTTP="http://roma.21.ru/";

 // Повна назва й коротка

 var $NAME_FULL="Персональна сторінка Роми Оглядача";

 var $NAME_SHORT='' Рома Оглядач";

 // адреса хазяїна сторінки

 var $EMAIL_ADMIN=array("roma@21.ru");

 // технічна служба сайту

 var $EMAIL_NOC=array("roma@21.ru","noc@21.ru");

 // Час кеширования сторінок "Expires" (у секундах)

 var $CACHE_TIME=300;

 // Максимальний розмір подгружаемого в базу тексту

 var $TEXT_SIZE_MAX= 1048576; // це мегабайт

 // Мінімальний розмір подгружаемого в базу тексту

 var $TEXT_SIZE_MIN=100; // сто байт

 // Формат висновку часу ( з SqlбБази)

 var $TIME_FORMAT="%H:%i:%S"; // ЧЧ:ММ:СС

 // Формат висновку дати ( з SqlбБази)

 var $DATE_FORMAT="%d.% m.% Y"; // ДД.ММ.ГГГГ

}

?>

5. Створення на PHP: mysql.class

Усі три перші класи (vars, mysql, utils) можна один раз уважно й з розміщенням написати, а потім просто користуватися ними у всіх інших своїх проектах. Але якщо в змінних оточення можуть бути якісь зміни, як і в обслуговуючих утилітах, то в класі mysql чи навряд щось колись треба міняти, хіба що, — реквізити доступу до бази (логін, пароль...).

Основні функції потрібні при роботі з базою Mysql:

По-перше, потрібна процедура підключення до бази. Її ще можна назвати процедурою авторизації або активації з'єднання. Або, як говорять програмісти, "відкриття з'єднання з базою".

По-друге, потрібна можливість оформити запит у базу й механізм виконання цього запиту.

По-трете, за собою треба прибирати. Закриття з'єднання.

Метод спілкування з базою, який напишемо, не універсальний. Завдяки функціям, можна буде одночасно працювати тільки з одним запитом до бази. Є випадки, коли це не дуже зручно.

Клас class_mysql народжується від класу class_vars. Тобто class_vars, будучи батьківським до класу class_mysql, передає йому всі свої можливості.

Відкриваємо (створюємо) новий файл class_mysql і пишемо в ньому:

<?

 require("/home/roma/req/vars.class");

 class class_mysql extends class_vars

Бачите, насамперед,  що для роботи необхідний файл "/home/roma/req/vars.class", тому що в ньому втримується фрагмент нашої програми, що описує батьківський class_vars.

Потім, об‘являємо новий клас. Об‘являємо його точно так само, як і class_vars, тільки дописуємо наприкінці рядка посилання на батьківський клас: extends class_vars.

Тепер перейдемо до тіла класу, і спочатку додамо потрібні нам змінні.

  var $sql_login="roma";

  var $sql_passwd="parol";

  var $sql_database="roma";

  var $sql_host="127.0.0.1";

  var $conn_id;

  var $sql_query;

  var $sql_err;

  var $sql_res;

У перших чотирьох змінні ми визначили реквізити доступу до бази Mysql: реєстраційне ім'я (логін), пароль, назва бази і Ip-Адреса, по якій фізично розташовується Mysql.

Другі чотири змінні ми будемо активно експлуатувати в нашій роботі.

Перша з них ($conn_id) — це ідентифікатор з'єднання. Він несе в собі інформацію про отримане з'єднання до бази.

Друга (sql_query) — рядок запитів. У неї ми будемо перешкодити наш запит до БД, перш ніж його активувати.

Третя (sql_err) — код помилки. Сервер Mysql, як і кожна друга програма, може давати різні збої як зі своєї вини, так і по нашої: коли наш запит написаний з помилками. От ця змінна й буде працювати в нас "прапором", який буде "підніматися", якщо відбулася якась помилка.

А четверта змінна (sql_res) буде містити в собі отриману інформацію з бази даних після виконання запиту. Із цієї змінної ми будемо витягати цю інформацію зручним нам способом.

Функція підключення до бази даних.

 function sql_connect()

 {

  $this->conn_id=mysql_connect($this->sql_host,

$this->sql_login,$this->sql_passwd);

  mysql_select_db($this->sql_database);

 }

Поясню построчно:

. заголовок функції з назвою

. відкриваюча фігурна дужка

. привласнюємо змінної $conn_id ідентифікатор підключення до бази. Підключення робить функція PHP mysql_connect, якої як параметрів передаються: адреса хоста (комп'ютера з MysqlрСервером, логін і пароль).

. вибираємо базу даних, з якої будемо працювати. Вибір проводиться функцією Mysql mysql_select_db, якої як параметра й передається назва нашої бази даних.

. закриваюча фігурна дужка.

Зрозуміло, що ми зробили? Ми підключилися до сервера Mysql, використовуючи свої реквізити, після чого, вибрали базу даних. В $conn_id залишиться ідентифікатор нашого з'єднання, він знадобиться в наступних двох функціях.

Функція, що виконує запит до БД:

  function sql_execute()

 {

  $this->sql_res=mysql_query($this->sql_query,$this->conn_id);

  $this->sql_err=mysql_error();

 }

Перший рядок (у тілі функції) виконує відправлення запиту (функція PHP mysql_query), а результат поміщає в оголошену нами змінну $sql_res.

Другий рядок запитує код помилки виконання SqlрЗапиту (функція PHP mysql_error) і записує її в іншу змінну, яку ми з вами теж визначили заздалегідь — $sql_err.

Реалізуємо останню, на теперішній момент, функцію класу class_mysql. Закриємо з'єднання із сервером Mysql.

Закриваємо.

function sql_close()

 {

  mysql_close($this->conn_id);

 }

Функція мови PHP mysql_close одержує в якості параметра ідентифікатор відкритого з'єднання й закриває це саме з'єднання.

Закривайте, що залишилися тэги й зберігаєте файл. Він у вас повинен виглядати от так:

 <?

 require("/home/roma/req/vars.class");

 class class_mysql extends class_vars

 {

  var $sql_login="roma";

  var $sql_passwd="parol";

  var $sql_database="roma";

  var $sql_host="127.0.0.1";

  var $conn_id;

  var $sql_query;

  var $sql_err;

  var $sql_res;

  function sql_connect()

  {

   $this->conn_id=mysql_connect($this->sql_host,$this->sql_login,

$this->sql_passwd);

   $this->conn_log_id=mysql_connect($this->sql_host,$this->sql_login,

$this->sql_passwd);

   mysql_select_db($this->sql_database);

  }

  function sql_close()

  {

   mysql_close($this->conn_id);

  }

  function sql_execute()

  {

   $this->sql_res=mysql_query($this->sql_query,$this->conn_id);

   $this->sql_err=mysql_error();

  }

}

?>

За винятком, зрозуміло, реквізитів підключення до _вашої_ базі даних Mysql.

З повагою ІЦ “KURSOVIKS”!