Использование магических кавычек. Использование функции eval(). Прекращение выполнения с помощью die и exit. Сериализация переменных и объектов

Использование магических кавычек

Возможно вы заметили, что использование символов кавычек ( ' и " ) и символа обратной косой черты ( \ ) внутри строк требует соблюдения осторожности. Интерпретатор PHP не поймет оператор, содержащий строку наподобие:

echo "color = "#FFFFFF" Эж

и выдаст сообщение о синтаксической ошибке. Чтобы вставить кавычки внутрь строки, необходимо, чтобы они отличались от кавычек, окаймляющих строку. Например:

echo "color = '#FFFFFF' ";

или

echo 'color = "#FFFFFF" ';

являются допустимыми.

Та же проблема возникает с пользовательским вводом, а также вводом и выводом других программ.

Синтаксический анализатор MySQL точно также не поймет запрос наподобие

insert into company values (' Объект 'Укрытие');

Мы уже рассматривали функции addslashes() и stripslashes(), которые заменяют на управляющие последовательности присутствующие в строке непарные символы кавычек, двойных кавычек, обратной косой черты и NULL.

В PHP имеется полезная возможность автоматически ("магически") добавлять и убирать управляющие символы косой черты. С помощью двух установок в файле php.ini можно включить или выключить магические кавычки для данных, полученных из GET, POST, cookie-наборов и других источников.

Значение директивы magic_quotes_gpc определяет, будут ли применяться магические кавычки при операциях GET, POST и cookie-наборами.

Если при включенной опции magic_quotec_gpc пользователь в форме введет "Bob's Auto Parts", сценарий получит строку "Bob\ 's Auto Parts", поскольку символ кавычки автоматически модифицируется. Такое поведение может оказаться весьма полезным, тем не менее, вы не должны забывать, что происходит, и удалять символы косой черты перед выводом данных на экран. Хорошо, если разрабатываемый вами код рассчитан на конкретный сервер, однако если код планируется распространить, то придется в нем учитывать как включенную опцию magic_quotes_gpc, так и выключенную.

Функция get_magic_quotes_gpc () возвращает 1 или 0 в зависимости от текущего состояния magic_quotes_gpc. В основном она нужна для проверки, стоит ли вызывать функцию strpslashes() для данных получаемых от пользователя.

Значение magic_quotes_runtime служит функция get_magic_quotes_runtime(), также возвращающая 1 или 0. Магические кавычки можно включить или выключить непосредственно внутри сценария с помощью функции set_magic_quotes_runtime().

По умолчанию magic_quotes_gpc включена, а magic_quotes_runtime — выключена.

Выполнение команд, содержащихся в строке, с помощью функции eval()

Функция eval() выполняет строку как PHP-код.

Например, вызов

eval ( "echo ' Приветствуем всех на нашем сайте! ';");

выполняет оператор, содержащийся в строке. Эта строка выведет точно то же. что и

echo ' Приветствуем всех на нашем сайте! ';

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

Наиболее общее использование eval() связано с системой генерации шаблонов. Смесь из HTML, PHP и простого текста можно загружать из базы данных. Система генерации шаблонов затем форматирует его содержимое и применяет к нему eval() для выполнения PHP-кода.

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

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

Прекращение выполнения с помощью сценария die и exit

До сих пор для останова выполнения сценария нами применялся оператор exit. Он имеет следующий вид:

exit;

и ничего не возвращает. Вместо этого оператора можно использовать его псевдоним die().

Чтобы завершение программы было более информативным, функции exit() можно передать параметр. Это позволит вывести сообщение об ошибке или запустить другую функцию до останова сценария.

Вот один из примеров:

exit ( 'Сценарий завершен ' );

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

mysql_query ($query) or die ( 'Невозможно выполнить запрос' );

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

function err_msg ()

{

echo ' Номер ошибки MySQL: ' ;

echo mysql_error();

}

mysql_query ($query) or die (err_msg() );

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

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

Сериализация переменных и объектов

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

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

Тем не менее, может возникнуть необходимость сохранить массив или PHP-объект в файле или базе данных. В этом случае необходимо знать, как действуют две функции: serialize() и unserialize().

Вызов функции serialize() имеет следующий вид:

$serial_object = serialize($my_object);

Чтобы понять, что происходит при сериализации, достаточно посмотреть на значение, возвращаемое этой функцией. Она превращает содержимое объекта или массива в строку.

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

 

class employee

{

var $name;

var $employee_id;

}

$this_emp = new employee;

$this_emp->name = ' Сидоров ' ;

$this_emp->employee_id = 5324;

Если сериализовать этот объект и вывести результат в браузер, то получим:

o:8:"employee":2: {s:4:"name"; s:9:"Сидоров"; s:11: "employee_id" ; i:5324;}

Взаимосвязь между исходным объектом и сериализованными данными очевидна.

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

Чтобы снова получить объект, необходимо воспользоваться обратной функцией — unserialize():

$new_object = unserialize ($serial_object);

Очевидно, что если перед помещением в базу данных использовалась функция addslashes(), то теперь следует вызвать функцию stripslashes().

При сериализации объектов или их использовании в качестве переменной сеанса необходимо помнить, что PHP для восстановления экземпляра класса нужна информация о его структуре. Значит, в тексте сценария перед вызовом session_start() или unserialize() должен быть включен файл с определением класса.




  • Другие |
назадвверхвперед
Rambler's Top100