White cat - Справочник по PHP
error_reporting
Установка видов сообщаемых ошибок.
Синтаксис:
int error_reporting([int level])
Функция error_reporting() возвращает предыдущую установку типа сообщаемых ошибок. Если указан аргумент, то заново переопределяет ее. В аргументе можно указывать константу, число или битовую маску. Старайтесь использовать константы вместо численных значений, чтобы сохранить совместимость с будущими версиями PHP.
error_reporting(2039); // в PHP эквивалент E_ALL ^ E_NOTICE
error_reporting(E_ALL ^ E_NOTICE); // установка по умолчанию
error_reporting(0); // отключить сообщения об ошибках
// общие ошибки выполнения
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// также сообщать о неизвестных переменных
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
error_reporting(E_ALL); // сообщать все ошибки
restore_error_handler
Восстановление предыдущего обработчика ошибок.
Синтаксис:
void restore_error_handler()
Эта функция устанавливает в качестве функции обработчика ошибок ту, которая была таковой до последнего вызова функции set_error_handler(). Предыдущим обработчиком может быть ранее установленный пользовательский обработчик или встроенный обработчик PHP.
trigger_error
Генерация ошибки.
Синтаксис:
void trigger_error(string error_msg [, int error_type])
Явно вызывает функцию, установленную для обработки ошибок, и обычно используется в паре с обработчиком ошибок. Функция способна генерировать только пользовательские типы ошибок ( семейство констант E_USER), и по умолчанию, если не указан тип ошибки error_type, он считается E_USER_NOTICE.
Возможно конструировать сложные конструкции генерации и обработки ошибок и исключительных ситуаций.
if(assert($divisor == 0))
trigger_error ("Нельзя делить на 0 ", E_USER_ERROR);
user_error
Синоним функции trigger_error().
Синтаксис:
void user_error(string error_msg [, int error_type])
Установка пользовательского обработчика ошибок
set_error_handler
Установка пользовательского обработчика ошибок.
Синтаксис:
string set_error_handler(string error_handler)
Функция возвращает имя функции, ранее определенной в качестве обработчика ошибок (или FALSE при ошибке), и устанавливает, в качестве нового обработчика, функцию с указанным в аргументе error_handler именем.
Обычно пользовательский обработчик ошибок работает в паре с функцией trigger_error(), генерирующей ошибку. Это может быть использовано (подобно аналогичной конструкции работы с исключениями в C) для освобождения выделенных ресурсов (например, удаления созданных файлов), если сценарий не может нормально завершиться.
Функция, устанавливаемая в качестве обработчика ошибок, должна принимать пять параметров (три последних являются дополнительными и могут не обрабатываться):
<?php
// определить константы пользовательских ошибок
define(FATAL, E_USER_ERROR);
define(ERROR, E_USER_WARNING);
define(WARNING, E_USER_NOTICE);
// установить, какие ошибки должны обрабатываться в сценарии
error_reporting (FATAL | ERROR | WARNING);
// пользовательский обработчик ошибок
function myErrorHandler($errno,$errstr,$errfile,$errline) {
switch ($errno) {
case FATAL:
echo "<b>Критическая ошибка</b> [$errno] $errstr<br>n";
echo "в строке: $errline файла:".$errfile;
echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>n";
echo "Aborting...<br>n";
exit -1;
break;
case ERROR:
echo "<b>Ошибка</b> [$errno] $errstr<br>n";
break;
case WARNING:
echo "<b>Предупреждение</b> [$errno] $errstr<br>n";
break;
default:
echo "Неизвестный тип ошибки: [$errno] $errstr<br>n";
}
}
// функция для проверки обработки ошибок
// (масштабирование массива
function scale_by_log($vect, $scale) {
if(!is_numeric($scale) || $scale <= 0)
trigger_error("вычислить log(x) для x <= 0 нельзя. ",
"(x = $scale)", FATAL);
if(!is_array($vect)) {
trigger_error("Требуется массив ", ERROR);
return null;
}
for($i=0; $i<count($vect); $i++) {
if(!is_numeric($vect[$i]))
trigger_error("Элемент ($i) не число и
его значением считается 0", WARNING);
$temp[$i]=log($scale)*$vect[$i];
}
return $temp;
}
// установить пользовательский обработчик ошибок
$old_error_handler=set_error_handler("myErrorHandler");
$a=array(2,3,"foo",5.5,43.3,21.11);
print_r($a);
$b=scale_by_log($a,M_PI); // здесь выдается предупреждение
echo "Массив, масштабированный на логарифм(Пи): ";
print_r($b);
$c=scale_by_log("not array",2,3); // здесь ошибка
var_dump($c);
$d=scale_by_log($a, -2.5); // здесь критическая ошибка
echo "Продолжение сценария...";
?>
При выполнении сценария вывод будет следующим:
Array( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11)Предупреждение [1024] Элемент (2) не число, и его значением считается 0<br>Массив, масштабированный на логарифм(Пи): Array( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281)<b>Ошибка</b> [512] Требуется массив <br>NULL<b>Критическая ошибка</b> [256] вычислить log(x) для x <=0 нельзя, (x = -2.5)<br> в строке: 37, файла E:wwwexampl.php, PHP 4.0.5 (WINNT)<br>Aborting...<br>
Не забывайте, что при установке пользовательского обработчика ошибок стандартный обработчик PHP не используется. Установки error_reporting() также не будут иметь эффекта, и пользовательский обработчик должен уметь обрабатывать все виды ошибок (значение error_reporting() можно выяснить и действовать соотвественно). Заметьте, что код ошибки будет равен 0, если ошибка возникла в функции, вывод ошибок для которой был блокирован оператором "@".
Также помните, что завершать сценарий в обработчике необходимо явно (например, с помощью функции die(), если, конечно, в этом есть необходимость. Если обработчик ошибок завершается с помощью return, то выполнение сценария продолжается с того места, в котором возникла ошибка (то есть исполняются инструкции, которые следуют за той инструкцией, в которой возникла ошибка).
Управление сессиями
Зачем нужны сессии
Сессия представляет собой механизм, позволяющий хранить некоторые данные, индивидуальные для каждого пользователя (например, его имя и номер счета), между запусками сценария.
В Web-программировании есть один класс задач, который может вызвать довольно много проблем, если писать сценарий "в лоб". Речь идет о слабой стороне CGI - невозможности запустить программу на длительное время, позволив ей при этом обмениваться данными с пользователями.
Представте, что мы пишем форму, но в ней такое большое число полей, что было бы глупо поместить их на одну страницу. Нам нужно разбить процесс заполнения формы на несколько этапов, или стадий, и представить их в виде отдельных HTML-документов.Например, в первом документе с диалогом у пользователя может запрашиваться его имя и фамилия, во втором - данные о его месте жительства, и в третьем - номер кредитной карточки. В любой момент можно вернуться на шаг назад, чтобы исправить те или иные данные. Наконец, если все в порядке, накопленная информация обрабатывается - например, помещается в базу данных.
Реализация такой схемы оказывается для Web-приложений довольно нетривиальной проблемой. Действительно, нам придется хранить все ранее введенные данные в каком-нибудь хранилище, которое должно аннулироваться, если пользователь вдруг передумает и уйдет с сайта. Для этого можно использовать функции сериализации и файлы. Однако ими мы решаем только половину проблемы: нам нужно как то привязать конкретного пользователя к конкретному временному хранилищу. Действительно, предположим, мы этого не сделали. Тогда, если в момент заполнения какой-нибудь формы одним пользователем на сайт зайдет другой и тоже попытается ввести свои данные, получится белеберда.Все эти проблемы решаются при помощи сессий.
Механизм работы сессий
Для начала должен существовать механизм, который бы позволил PHP идентифицировать каждого пользователя, запустившего сценарий. То есть при следующем запуске PHP нужно однозначно определить, кто его запустил: тот же человек, или другой. Делается это путем присвоения клиенту так называемого уникального идентификатора сессии. Чтобы этот идентификатор был доступен при каждом запуске сценария, PHP помещает его Cookies браузера. Теперь, зная идентификатор (дальше SID), PHP может определить, в каком же файле на диске хранятся данные пользователя.
Немного о том, как сохранять переменную (обязательно глобальную) в сессии. Для этого мы должны ее зарегистрировать с помощью специальной функции. После регистрации мы можем быть уверены, что при следующем запуске сценария тем же пользователем она получит то же самое значение, которое было у нее при предыдущем завершении программы. Это произойдет потому, что при завершении сценария PHP автоматически сохраняет все переменные, зарегистрированные в сессии, во временное хранилище. Конечно, можно в любой момент аннулировать переменную - вычеркнуть ее из сессии, или же уничтожить вообще все данные сессии.