Лістинг 6.2. processorder.php - обробка форми.
<html><head><title> Auto Parts: Order Results</title></head><body>
<h1>Auto Parts</h1><h2>Order Results</h2>
<?
echo "<p>Order processed at "; // Start printing order
echo date("H:i, jS F");
echo "<br><p>Your order is as follows: <br>";
echo $tireqty." tires<br>";
echo $oilqty." bottles of oil<br>";
$totalqty = 0; $totalamount = 0.00;
define("TYREPRICE", 100); define("OILPRICE", 10);
$totalqty = $tyreqty + $oilqty;
$totalamount = $tyreqty * TYREPRICE + $oilqty * OILPRICE;
$totalamount = number_format($totalamount, 2);
echo "<br>\n Items ordered: ".$totalqty."<br>\n";
echo "Subtotal: $".$totalamount."<br>\n";
$taxrate = 0.10; // local sales tax is 10%
$totalamount = $totalamount * (1 + $taxrate);
$totalamount = number_format($totalamount, 2);
echo "Total including tax: $".$totalamount."<br>\n";
?></body></html>
Використання функції date().Функція date() приймає два аргументи, один з яких є необов'язковим. Перший аргумент є рядком формату, а другий, необов'язковий, — мітку часу UNIX. Якщо мітка часу не вказана, то функція date() обробляє поточну дату і час. Вона повертає рядок, що відформатував, містить дату. Типовий виклик функції виглядає так:
echo date("jS F Y");
Виведення цього виразу має вигляд "31th July 2001". Коду форматування, використовувані функцією date(), Перераховані в таблиці. 6.5.
Таблиця 6.5 Кодів форматування РНР-функции date()
Код | Опис |
а | Ранок або час пополудні, з двома рядковими символами, "am" або "pm" |
А | Ранок або час пополудні, з двома прописними символами, "AM" або "PM". |
У | Internet-время Swatch — універсальна тимчасова схема. Детальніше про неї можна взнати на сайті http://www.swatch.com. |
d | День місяця у вигляді двозначного числа з провідним нулем. Діапазон значень — від "01" до "31". |
D | День тижня у вигляді трьохбуквеної абревіатури. Діапазон значень — від "Mon" (понеділок) до "Sun" (воскресіння). |
F | Місяць в повнотекстовому форматі. Діапазон значень — від "January" до "December". |
g | Годинник в 12-годинному форматі без провідних нулів. Діапазон значень — від "1" до "12". |
G | Годинник в 24-годинному форматі без провідних нулів. Діапазон значень — від "0" до "23". |
h | Годинник в 12-годинному форматі з провідними нулями. Діапазон значень — від "01" до "12" |
H | Годинник в 24-годинному форматі з провідними нулями. Діапазон значень — від "00" до "23" |
i | Хвилини з провідними нулями. Діапазон значень — від "00" до "59". |
I | Перехід на літній час, представлений значенням логічного типа. Якщо перехід на літній час встановлений, функція повертає значення "1", інакше — "0". |
j | День місяця у вигляді числа без провідних нулів. Діапазон значень — від "1" до "31". |
I | День тижня в повнотекстовому форматі. Діапазон значень — від "Monday" (понеділок) до "Sunday" (воскресіння). |
L | Високосний рік, представлений значенням логічного типу. Функція повертає значення "1", якщо дата належить високосному року, і "0" — інакше. |
L | Високосний рік, представлений значенням логічного типа. Функція повертає значення "1", якщо дата належить високосному року, і "0" — інакше. |
m | Місяць в двозначному числовому форматі з провідними нулями. Діапазон значень — від "01" до "12". |
M | Місяць у вигляді трьохбуквеної абревіатури. Діапазон значень — від "Jan" (січень) до "Dec" (грудень). |
n | Місяць у вигляді числа без провідних нулів. Діапазон значень — від "1" до "12". |
s | Секунди з провідними нулями. Діапазон значень від "00" до "59". |
S | Порядковий суфікс для дат в двохбуквеному форматі. Він може набувати значення "st", "nd", "rd" або "th" залежно від числа, за яким він слідує. |
t | Повна кількість днів в місяці. Діапазон значень — від "28" до "31". |
Т | Часова зона сервера, задана в трьохбуквеному форматі, наприклад, "EST". |
U | Число секунд з 1 січня 1970 р. до теперішнього моменту; його також називають влучною часу UNIX для поточної дати. |
w | День тижня у вигляді числа. Діапазон значень — від "0" (воскресіння) до "6" (субота). |
В | Рік в двозначному форматі, наприклад, "00". |
Y | Рік в чотиризначному форматі, наприклад, "2000". |
z | День року у вигляді числа. Діапазон значень — від "0" до "365". |
Z | Зсув поточної часової зони в секундах. Діапазон значень — від "-43200" до "43200". |
Огляд обробки файлів. Запис даних у файл реалізується в три кроки:
1. Відкриття файлу. Якщо файл ще не існує, його потрібно буде створити.
2. Запис даних у файл.
3. Закриття файлу.
Аналогічно, прочитування даних з файлу також пов'язане з виконанням трьох кроків:
1. Відкриття файлу. Якщо файл не може бути відкритий (наприклад, він не существует), ця ситуація має бути розпізнана і слід передбачити коректний вихід з неї.
2. Прочитування даних з файлу.
3. Закриття файлу.
При необхідності прочитування даних з файлу можна вибирати, яка частина файлу "повинна прочитуватися за один раз. Ледве пізніше детально розглядатимуться всі доступні можливості. Поки давайте дослідимо крок відкриття файлу.
Відкриття файлу.Для відкриття файлу в середовищі РНР використовується функція fopen(). При відкритті файлу необхідно вказати режим його використання.
Режими файлів.Серверна операційна система повинна знати, що потрібно робити з файлом, що відкривається. Їй потрібно знати, чи може файл бути відкритий і оброблений іншим сценарием в той час, коли він є відкритим, якщо власник сценарію має право на подібне його використання. По суті, режими файлу надають операційній системі механізм для визначення способу обробки запитів на доступ, поступающих від інших користувачів або сценаріїв, а також метод перевірки наявності доступа і прав для роботи з конкретним файлом.
При відкритті файлу слід прийняти три рішення:
1. Файл можна відкрити лише для читання, лише для запису або для читання і записи.
2. При виконанні запису у файл можна перезаписати що будь-яке існує содержимое файлу або ж дописати нові дані в кінець файлу.
3. При спробі виконання запису у файл в системі, яка розрізняє двійкові і текстові файли, може потрібно вказати типа файлу.
Функція fopen() підтримує будь-які комбінації цих трьох варіантів, що мають сенс. Використання функції fopen() для відкриття файлу. Передбачимо, що потрібно записати замовлення клієнта у файл. Цей файл можна відкрити для запису так:
$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", "w');
Функція fopen чекає два або трьох вхідних параметрів. Зазвичай використовуються два параметри, як показано в приведеному вище рядку коду.
Першим параметром має бути файл, який необхідно відкрити. При цьому можна вказати дорогу до файлу, як було зроблено в приведеному вище рядку коду — orders.txt знаходиться в каталозі orders. Ми використовували вбудовану змінну $DOCUMENT_ROOT PHP. Ета змінна вказує на підставу дерева документов Web-сервера. Крім того, ми використовували символ "..", "батьківський каталог каталога, що означає $DOCUMENT_ROOT. В цілях підвищення безпеки цей каталог знаходиться поза деревом документів. Небажано, аби цей файл був доступний в Web окрім інтерфейсу, що надавався нами. Ця шлях називається відносною, оскільки він описує позицію у файловій системі відносно $DOCUMENT_ROOT.
Можна було б задати і абсолютну дорогу до файлу — шлях від кореневого каталога (/ у системі UNIX і, як правило, С:\ в системі Windows). На сервері UNIX така шлях виглядає як /home/book/orders. Проблема, пов'язана з подібною вказівкою шляхи, особливо в разі розміщення свого сайту на чужому сервері, полягає в тому, що абсолютна шлях може змінюватися, коли системні адміністратори без попередження "визнають необхідним" змінити структуру каталогів. Якщо шлях взагалі не вказана, файл створюватиметься або відшукуватиметься в тому ж каталозі, в якому знаходиться власне сценарій. Згадана поведінка буде іншим при запуску РНР через якусь CGI-оболочку і залежить від конфігурації сервера.
У середовищі UNIX як роздільник каталогів використовується символ прямої (з ухилом управо) косої риски (/). На платформах Windows можна застосовувати символи прямої або зворотної косої риски. При використанні символу зворотної риси вони мають бути помічені як спеціальні (тобто скасовані), аби функція fopen змогла їх коректно інтерпретувати. Для відміни перед символом слід просто помістити додатковий символ оберненої косої риски, як показано в наступному рядку:
$fp = fopen("..\\..\\orders\\orders.txt", "w");
Другий параметр функції fopen() — це режим файлу, який повинен мати строкового типа. Цей параметр визначає, що необхідно робити з файлом. В даному випадку у функцію fopen() передається параметр "w" — це означає відкриття файлу для запису. Режими файлу перераховані в таблиці. 6.6.
Таблиця 6.6. Режими файлу для функції fopen
Режим | Значення |
г | Режим читання — Відкриття файлу для читання, починаючи з початку файлу. |
r+ | Режим читання — Відкриття файл для читання і запису, починаючи з початку файлу. |
w | Режим запису — Відкриття файлу для запису, починаючи з початку файлу. Якщо файл вже існує, його вміст віддаляється. Якщо файл не існує, робиться спроба його відкриття і в результаті файл створюється. |
w+ | Режим запису — Відкриття файлу для запису і читання, починаючи з початку файлу. Якщо файл вже існує, його вміст віддаляється. Якщо файл не існує, робиться спроба його відкриття і в результаті файл створюється. |
а | Режим додавання — Відкриття файлу лише для додавання (записи), починаючи з кінця існуючого вмісту, якщо воно є. Якщо файл не існує, робиться спроба його відкриття і в результаті файл створюється. |
a+ | Режим додавання — Відкриття файлу для додавання (записи) і читання, починаючи з кінця існуючого вмісту, якщо воно є. Якщо файл не існує, робиться спроба його відкриття і в результаті файл створюється. |
b | Двійковий режим — Використовується у поєднанні з одним з останніх режимів. Його вказівка потрібна, якщо файлова система розрізняє двійкові і текстові файли. Операційна система Windows розрізняє ці файли, а UNIX - ні. |
Режим файлу, який необхідно використовувати в даному прикладі, залежить від того, як використовуватиметься система. Параметр "w" дозволяє зберегти у файл лише один замовлення. При прийомі кожного нового замовлення він перезаписуватиме раніше записане замовлення. Ймовірно, це не дуже розумно, тому краще вказати режим додавання:
$fp = fopen("../../orders/orders.txt", "a");
Третій параметр функції fopen() не є обов'язковим. Його можна використовувати, якщо файл необхідно шукати в шляхи include_path (визначеному в конфігурації РНР). Якщо це потрібно, встановите параметр рівним 1 і не задавайте ім'я каталога або дорогу:
$fp = fopen("orders.txt", "a", 1);
В разі успішного відкриття файлу функція fopen() повертає покажчик на файл і зберігає його в зміною, в даному випадку $fp. Ета змінна використовуватиметься для доступу до файлу, коли потрібно буде виконати прочитування або запис в нього.
Відкриття віддалених файлів через FTP або HTTP.Використовуючи функцію fopen(), можна відкривати для читання або запису не лише локальні файли, але і видалені з використанням протоколів FTP і HTTP. Якщо використовуване ім'я файлу починається з ftp://, відкривається FTP-соединение з вказаним сервером в пасивному режимі і повертається покажчик на початок файлу. Якщо використовуване ім'я файлу починається з http://, відкривається HTTP-з’єднання з вказаним сервером і повертається покажчик на відповідь від сервера. В разі вживаннярежиму HTTP обов'язково слід вказувати завершуючі символи косої риски в іменах каталогів, як показано в наступному прикладі:
http://www.server.com/
але не
http://www.server.com
При другій формі вказівки адреси (без завершуючої косої риски) Web-сервер, як правило, використовуватиме перенаправлення HTTP з метою звернення за першою адресою (з косою рискою). Перевірте це в своєму браузері.
Функція fopen() не підтримує перенаправлення HTTP, тому необхідно вказувати URL-адреса (уніфікований локатор ресурсів), які посилаються на каталоги із завершуючими символами косої риски. Пам'ятаєте, що імена доменів в URL-адресах не залежать від регістра, проте шляху і імена файлів залежать.
Проблеми, що виникають при відкритті файлів.Звичайна помилка, зв'язана з відкриттям файлу, — спроба відкрити файл, для якого відсутні права на читання або запис. В цьому випадку РНР виводить відповідне попередження.
В разі здобуття подібного повідомлення про помилку необхідно переконатися, що користувач, що виконує сценарій, володіє правами доступу до файлу, спроба використання якого робиться. Залежно від того, як встановлений даний сервер, сценарій може виконуватися як користувач Web-сервера або як власник каталога, в якому розміщується сценарій.
У більшості систем сценарій виконуватиметься як користувач Web-сервера. Якби сценарій знаходився в системі UNIX в каталозі ~/public_html/chapter2/, загальнодоступний для запису каталог для зберігання замовлень можна було б створити, набравши наступні команди:
mkdir ~/orders chmod 777 -/orders
Майте на увазі, що каталоги, в яких будь-який користувач може виконати запис, представляють небезпеку. У системі не повинно бути каталогів, які доступні для запису безпосередньо з Web. Саме тому наш каталог orders розміщується на два підкаталоги вище за каталог public_html.
Некоректні налаштування прав доступу — ймовірно, найбільш помилка, що часто зустрічається, під час відкриття файлу. Якщо файл не може бути відкритий, про це дійсно потрібно знати, щоб не намагатися прочитувати або записувати в нього дані.
Якщо звернення до функції fopen() виявляється безуспішним, функція повертає значення false. Обробку помилок можна зробити зручнішою для користувача, подавивши повідомлення про помилку від РНР, і реалізувавши власне повідомлення:
@$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", "a", 1);
if ('$fp) {
echo "<p><strong> Your order could not be processed at this time. ."Please try again later.</strong></p></body></html>";
exit;}
Символ @ перед зверненням до функції fopen() вказує РНР на необхідність придушення будь-яких повідомлень про помилки, що генеруються після виклику функції. Зазвичай важливо лише знати, коли щось виконується неправильно, але в даній ситуації в будь-якому разі слід розібратися з подібного роду проблемою. Зверніть увагу, що символ @ повинен розташовуватися на самому початку рядка.
Оператор if перевіряє змінну $fp з метою з'ясування, чи повертався з функції fopen допустимий покажчик файлу, і якщо немає, виводиться повідомлення про помилку і виконання сценарію завершується. Оскільки тут завершується і сторінка, зверніть увагу на генерацію закриваючого дескриптора </html>, що забезпечує допустимість HTML-кода.
Запис у файл.Запис у файл в РНР виконується порівняно просто. Для цього можна скористатися будь-якій з функцій fwrite() (file write — запис у файл) або fputs() (file put string — запис рядка у файл); fputs() — це псевдонім функції fwrite(). Функцію fwrite() можна викликати таким чином:
fwrite($fp, $outputstring);
Це вказує РНР на необхідність запису рядка із змінної $outputstring у файл, вказаний $fp. Розглянемо функцію fwrite() детальніше, перш ніж приступати до дослідження вмісту змінною $outputstring.
Параметри функції fwrite().Насправді функція fwrite() приймає три параметри, проте третій з них не є обов'язковим. Прототип fwrite() має вигляд
int fputs(int fp, string str, int [length]);
Третій параметр length є максимальною кількістю байтів, які потрібно записати. При передачі цього параметра функція fwrite() записуватиме рядок str у файл, вказаний параметром fp, поки не зустріне кінець рядка або не запише length байтів, залежно від того, що станеться раніше.
Формати файлів.При створенні файлу даних, подібного використовуваному в даному прикладі, формат зберігання даних повністю залежить від програміста. (Проте, якщо планується використання файлу даних в іншому застосуванні, можливо, доведеться врахувати особливості інтерпретації даних цього застосування.)
Давайте створимо рядок, який представляє один запис у файлі даних. Це можна зробити таким чином:
$outputstring = $date."\t".$tireqty."tires \t".$oilqty." oil\t"
.$total ."\t\n";
У цьому простому прикладі кожен запис замовлення зберігається в окремому рядку файлу, Подібне рішення обумовлене тим, що дозволяє як простий роздільник рядків використовувати символ нового рядка. Оскільки символи нового рядка невидимі, вони представляються за допомогою послідовності "\n", що управляє. Поля даних записуватимуться в одному і тому ж порядку, а як роздільник полів використовуватиметься символ табуляції. Знову-таки, оскільки цей символ невидимий, він представляється послідовністю "\t", що управляє. Роздільником має бути будь-який символ, який напевно не зустрічатиметься у вихідних даних, інакше доведеться піддати вихідні дані додатковій обробці з метою видалення або відміни всіх входжень обмежувача. Поки передбачимо, що ніхто не виводитиме символи табуляції у форму замовлення. Приміщення користувачем символів табуляції або нового рядка в однорядкове поле введення HTML маловірогідно, але не так вже неможливо. Використання спеціального роздільника полів спрощує розділення даних на окремі змінні під час прочитування. Поки кожне замовлення оброблятиметься як окремий рядок.
Після обробки декількох замовлень вміст файлу виглядатиме, як в лістингу 6.3.
Дата добавления: 2016-04-02; просмотров: 796;