Page 78 - 4636
P. 78
Рисунок 3.2 - У разі, коли файл відкрити неможливо, РНР видає відповідне попередження
У разі отримання подібного повідомлення про помилку необхідно переконатися, у тому, чи
користувач, від імені якого виконується сценарій, мав право доступу до файлу, яким намагаються
скористався. Залежно від налаштування сервера, сценарій може виконуватися або від імені
користувача веб-сервера, або від імені власника каталогу, в якому зберігається сценарій.
У більшості систем сценарій виконується під ім'ям користувача веб -сервера. Якщо сценарій
розміщений в каталозі системи UNIX, наприклад, ~/public_html/chapter02/, то можна створити
загальнодоступний для запису каталог для зберігання в ньому замовлень, набравши такі команди:
mkdir ~/orders
chmod 777 ~/orders
Майте на увазі, що каталоги, в яких будь-який користувач може записати все, що завгодно, несуть у
собі потенційну небезпеку. Не повинно бути каталогів, які доступні для запису безпосередньо з
середовища Інтернет. Саме з цієї причини наш каталог orders розміщується на два підкаталоги вище
від каталога public_html .
Некоректні налаштування прав доступу, є мабуть, найбільш розповсюдженою помилкою під час
відкриття файлу, однак вона далеко не єдина. Якщо файл не може бути відкритий, то ви повинні про
це знати, щоб не робити подальших спроб зчитувати з нього або записувати в нього дані .
Якщо виклик функції fopen( ) завершується невдачею, вона повертає значення false .
Обробку помилок можна зробити більш зручною для користувача, для чого потрібно придушити
повідомлення про помилку від РНР і вивести власне, більш зрозуміле повідомлення:
@ $fp = fopen( "$DOCUMENT_ROOT / . . /orders / orders.txt", 'ab');
if (!$fp) {
echo "<p><strong>Наразі ваш запит не може бути оброблений"
"Будь ласка, спробуйте пізніше.</strong/p></body></html>";
еxit;
}
Символ @ перед зверненням до функції fopen() вказує РНР на необхідність заборони будь-яких
повідомлень про помилки, що генеруються за результатами виклику функції.
Перший рядок можна записати і в наступному вигляді:
$fp = @ fopen("$DOCUMENT_ROOT/../Orders/orders.txt ",'ab');
Однак така форма запису робить її менш зрозумілою, до того ж ускладнюється налагодження коду.
Описаний метод є найпростішим способом обробки помилок.
75