Важно устранить все ошибки перед развертыванием PHP-страниц в Интернете. Многие хостинговые компании отключают уведомления об ошибках, если вы не видите сообщения об ошибке, это не означает, что со страницей всё в порядке. Страницы, которые используют серверные технологии, такие как PHP, имеют дело с большим количеством непредвиденных ситуаций, поэтому разумно создавать защиту в коде, проверяя значения перед их использованием. 

Проверка существования переменных

Всегда нужно использовать команду isset() для проверки существования переменной, которая получает значение из подключаемых файлов и заключать в условный оператор любой код, который её использует.

Можно присвоить переменной значение по умолчанию следующим образом:

</p>
<p style="text-align: justify;">if (!isset($someVariable)) {
$someVariable = default value;
}</p>
<p style="text-align: justify;">

При этом используется оператор логического отрицания чтобы проверить, что переменная $someVariable не была установлена. Если переменная $some не существует, ей присваивается значение по умолчанию, которое затем может быть использовано в сценарии. Если переменная уже существует, код внутри условного оператора пропускается, и используется исходное значение.

Проверка существования функции или класса

Включаемые файлы часто используются для определения пользовательских функций или классов. Попытка использовать функцию или класс, которые не были определены, вызывает фатальную ошибку. Чтобы проверить, что функция определена, передайте имя функции в виде строки в function_exists(). При передаче имени функции в качестве параметра function_exists() не ставьте скобки в конце имени функции.

Например, проверить, что функция doubleIt()определена, можно следующим образом:

</p>
<p style="text-align: justify;">if (function_exists('doubleIt')) {
// используем doubleIt()
}</p>
<p style="text-align: justify;">

Чтобы проверить, что класс определен, используйте функцию class_exists() таким же образом, передав строку, содержащую имя класса в качестве аргумента:

</p>
<p style="text-align: justify;">if (class_exists('MyClass')) {
//используем MyClass
}</p>
<p style="text-align: justify;">

Если предполагается использовать функцию или класс, которые ещё не определены в сценарии, более практичным подходом будет включить с помощью условного оператора файл, в котором находится определение данного класса или функции. Например, если определение функции doubleIt() находится в файле с именем utilities.inc.php:

</p>
<p style="text-align: justify;">if (!function_exists('doubleIt')) {
require_once('includes/utilities.inc.php');
}</p>
<p style="text-align: justify;">

Временное включение сообщений об ошибках

Сообщения об ошибках нужны, чтобы помочь разработчику. К сожалению, вывод сообщений на рабочем сайте предоставляет информацию, которая может быть полезна для злоумышленника, и именно поэтому большинство хостинговых компаний отключают вывод сообщений об ошибках. В зависимости от характера ошибки, все, что вы можете видеть, когда заходите на страницу это пустой экран. Пользы от него мало, когда нужно выяснить что случилось со страницами, которые работали безупречно в локальной среде тестирования.

К счастью, можно легко включить временный вывод сообщений об ошибках для отдельной страницы с помощью функции ini_set(), которая может быть использована для изменения некоторых директив в php.ini, в конфигурационном файле PHP на сервере.

Добавьте следующий код в верхней части страницы, с которой возникают проблемы:

<?php ini_set('display_errors', '1'); ?>

Загрузите файл на удаленный сервер, и перезагрузите страницу в браузере. Вы должны увидеть на экране сообщение об ошибке. Исправьте проблему, и проверьте страницу снова. Если страница отображается правильно, удалите дополнительную строку кода.

Если вы по-прежнему видите пустой экран, это означает, что в PHP коде ошибка синтаксиса. Использование ini_set() не работает, если существуют ошибки синтаксического разбора.

Большинство ошибок возникает, когда разработчики забывают загрузить включаемый файл на удаленный сервер. Даже если загружены все файлы, всё равно может появиться сообщение об ошибке, сообщающее о недостаточных полномочиях для доступа к включаемому файлу. Это может произойти в следующих случаях:

  • Сервер работает в безопасном режиме: Если ваша хостинговая компания поддерживает PHP в ограниченном режиме, вы увидите предупреждение, что ограничения безопасного режима вступили в силу. Выполните phpinfo() и проверьте значение safe_mode_include_dir в разделе Core. Все ваши включаемые файлы должны храниться в этом месте. Настройте структуру сайта в соответствии с настройками. Безопасный режим запланирован для удаления из следующей версии PHP, так что эта проблема встречается реже.
  • Установлена директива open_basedir: Директива open_basedir ограничивает возможность включать или открывать файлы. Директива должна подействовать, только если включаемый файл находится за пределами корневого каталога веб-сервера. Предупреждение генерируется на основе PHP списков разрешенных путей. Переместите включаемый файл в разрешенное расположение, и скорректируйте пути команд включения соответствующим образом.

Обработка отсутствующих включаемых файлов

Предполагая, что включаемые файлы нормально работают на удаленном сервере, это вся проверка ошибок, которая требуется. Однако если удаленный сервер выводит сообщения об ошибках, нужно принять меры для их подавления, если включаемые файлы случайно удалены или повреждены.

Довольно грубый, но эффективный способ заключается в использовании оператора управления ошибками (@) в PHP, который подавляет сообщение об ошибке, связанное со строкой кода, на которой оператор используется. Оператор управления ошибками размещается в начале строки или прямо напротив функции или оператора, который может выдавать ошибку следующим образом:

 @ include('./includes/random_image.php'); 

Проблема с оператором управления ошибками заключается в том, что он скрывает ошибки, вместо того чтобы обрабатывать их. Это только один символ, так что легко забыть, где он был использован. Следовательно, можно потратить много времени в поисках ошибки в другой части скрипта. При использовании оператора управления ошибками, знак @ должен быть первым, что следует удалить при устранении проблемы.

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

Лучший способ подавления сообщений об ошибках на рабочем сайте — это выключить директиву display_errors в конфигурации с веб-сервера. Наиболее эффективным способом является изменение php.ini, если хостинговая компания позволяет изменять его параметры. Кроме того, если ваш сервер работает на Apache и у вас есть разрешение на изменение конфигурации с помощью .htaccess файла, вы должны добавить следующую команду в файл .htaccess в корневой папке сервера:

 php_flag display_errors Off 

Если ни один вариант не доступен, добавьте следующую строку в верхней части любого сценария, который использует включаемые файлы:

 <?php ini_set('display_errors', '0'); ?> 

Все методы, предложенные ранее, только подавляют сообщения об ошибках, если включаемый файл не может быть найден. Если страница не имеет смысла без включаемого файла, следует перенаправить пользователя на страницу с ошибкой, если включаемый файл отсутствует.

Один из способов перенаправить пользователя — вызвать исключение следующим образом:

</p>
<p style="text-align: justify;">$file = 'includes/menu.inc.php';
if (file_exists($file) && is_readable($file)) {
include($file);
} else {
throw new Exception("$file can't be found");
}

При использовании кода, который может вызвать исключение, необходимо заключить его в блок try и создать блок catch для обработки исключения.