В PHP 4 переменные обычно объявляются с помощью var, а в PHP 5 можно использовать возможности объектно-ориентированного программирования (ООП) для настройки видимости данных — то есть видимость здесь очень похожа на область видимости переменных. , но обеспечивает лучший механизм управления, существует три типа модификаторов видимости:
Public (по умолчанию) — к переменным можно получить доступ или изменить их в глобальной области.
Защищено: доступ к переменным и их изменение возможны только внутри самого класса и непосредственно производных (с использованием оператора расширения) классов.
Частное — доступ к переменным и их изменение возможны только внутри класса.
Как и реализации интерфейсов, нарушение этих правил в программе приведет к серьезным ошибкам, и, как и интерфейсы, они существуют исключительно для удобства программистов; Но это не значит, что их можно игнорировать. Указание видимости определенной переменной-члена класса может защитить данные внутри объекта от внешнего влияния.
Предположим, есть класс MySqlDB и переменная $link в нем объявлена частной, что означает, что доступ к этой переменной можно получить только изнутри объекта с помощью переменной $this. Это предотвращает случайную перезапись другими объектами или функциями вне класса. , мы будем использовать атрибут видимости, чтобы создать объект запроса.
Вы можете думать о запросе как об отдельной сущности, которая может быть выполнена и вернуть результаты. Некоторые системы баз данных также имеют хранимые процедуры. Хранимые процедуры очень похожи на функции. Они хранят операторы запроса и принимают соответствующие параметры при вызове.
В этой статье две вышеупомянутые функции будут объединены в объект запроса примера. В примере будет моделироваться базовая хранимая процедура и сохраняться указатель результата внутри. На данный момент основное внимание уделяется выполнению запроса из объекта, где вы можете вызвать функцию query() объекта MySqlDB.
В объекте запроса могут быть определены следующие общедоступные функции:
__construct() — конструктор принимает параметр, содержащий ссылку на экземпляр объекта, реализующего интерфейс БД.
подготовить() — функция подготовить() инициализирует хранимую процедуру запроса. Он может содержать один или несколько ограниченных заполнителей, которые будут переданы в качестве параметров функции выполнения(). Заполнитель определяется как двоеточие, соответствующее количеству параметров, за которым следует целое число и буква, относящаяся к типу параметра.
Простой запрос, содержащий заполнители, выглядит следующим образом:
SELECT col1,col2 FROM table_name WHERE col1=:1I
Execute() — функция Execute() выполнит запрос. Если функция подготовки() преждевременно инициализируется как хранимая процедура, любые переданные параметры будут использоваться в качестве параметров выполнения хранимой процедуры. В противном случае первый параметр будет использоваться только в качестве текста запроса. Функция Execute() вернет результаты после выполнения запроса.
compile() — функция compile() аналогична функции Execute(). Фактически запрос не выполняется, а заменяет все заполнители в строке запроса, принимает параметры хранимой процедуры и возвращает скомпилированную версию. запроса.
Защищенные члены
Как упоминалось выше, концепция видимости может использоваться для сокрытия внутренней работы объекта, защищая целостность данных, необходимую для внутренней работы. Как объяснялось ранее, указатель результата, возвращаемый запросом, будет сохранен как защищенный атрибут. Здесь используется защищенный элемент, поскольку определенный объект запроса к базе данных, полученный из объекта запроса, может перегружать некоторые основные функции.
Хватит
копаться в теории кода
, теперь приступим к написанию кода. Сначала создайте шаблон, как показано в примере 1:Пример 1: Класс шаблона
DBQuery
класса запросов к базе данных.
{
/**
*Сохраните ссылку на объект, реализующий интерфейс БД.
*/
защищенная $дб
/**;
*Если это хранимая процедура, установите значение true.
*/
защищенный $stored_procedure = ложь
;
*Сохраните запрос, удалив все строки.
*/
частный $запрос
/**;
* используется для сопоставления кавычек в SQL.
*/
частный статический $QUOTE_MATCH = "/(".*(?db = $db;
}
Публичная функция подготовить ($ запрос)
{
$this->stored_procedure = true;
}
Компиляция общедоступной функции ($args)
{}
выполнение публичной функции ($ запрос)
{}
}
Функция подготовки
— это шаблон в примере 1. Первое, что вам нужно сделать, — это создать функцию подготовки(). Чтобы гарантировать, что символы без кавычек случайно анализируются как заполнители, функция должна удалить все символы в строках запроса и. временно сохраните их в массиве. Сама строка также будет заменена заполнителями, которые обычно распознаются как последовательности строк, которые не должны появляться в инструкции SQL. Во время компиляции запроса сначала заменяется заполнитель процедуры, а затем строка возвращается в запрос. Это делается с помощью функции preg_replace() и другой вспомогательной функции обратного вызова, используемой в качестве функции preg_replace().
Пример 2: функция подготовки()
/**
* Подготовьте запрос как хранимую процедуру.
* @param string $query Подготовленный текст запроса
* @return void
*/
публичная функция подготовить($запрос)
{
$this->stored_procedure = true;
$this->quote_store = array(); //Очистить кавычки $this->query = preg_replace(self::$QUOTE_MATCH, '$this->sql_quote_replace("1"?"1":'2')', $ запрос);
}
частная функция sql_quote_replace($match)
{
$number = count($this->query_strings);
$this->query_strings[] = $match;
вернуть "$||$$номер";
}
Обратите внимание на использование статического частного атрибута QUOTE_MATCH, а также атрибута quote_store и функции sql_quote_replace(). По сравнению с защищенным, определение его как закрытого здесь гарантирует, что любой подкласс, который переопределяет метод подготовки() класса запроса, использует свой собственный механизм для удаления кавычек.
Функция компиляцииСледующим
шагом является создание функций компиляции() и выполнения().
Функция compile(), как показано в примере 3, имеет следующие функции:
· Число принимаемых параметров является переменным (т. е. переменными параметрами), которые будут соответствовать заполнителям в запросе.
· Убедитесь, что заполнитель имеет правильный тип данных, и замените его значением в параметре.
· Верните запрос в виде строки, но не выполняйте его.
· Если объект запроса не инициализируется как хранимая процедура с помощью функции подготовки(), будет выдано исключение.
Пример 3: функция compile()
/**
* Возвращает скомпилированный запрос, но не выполняет его.
* @param смешанные $args,... Параметры запроса
* @return string Скомпилированный запрос
*/
компиляция общедоступной функции ($params)
{
если (! $this->stored_procedure) {
throw new Exception("Хранимая процедура не инициализирована!");
}
/* Параметры замены*/
$params = func_get_args(); // Получаем параметры функции $query = preg_replace("/(?query);
return $this->add_strings($query); // Возвращаем строку в запрос
}
/**
* Повторно вставьте строку, удаленную функцией подготовки().
*/
частная функция add_strings($string)
{
$numbers = array_keys($this->query_strings);
$count = count($numbers);
$searches = массив();
for($x = 0; $x < $count; $x++) {
$searches[$x] = "$||${$numbers[$x]}";
}
return str_replace($searches, $this->query_strings, $string);
}
/**
* При каждом выполнении заполнитель в хранимой процедуре заменяется.
*/
защищенная функция compile_callback($params, $index, $type)
{
--$index;
/* Выдать исключение */
if (! isset($params[$index])) {
throw new Exception("Хранимая процедура не получила необходимое количество параметров!");
}
/* Здесь вы можете добавить другие типы, например дату и время. */
переключатель ($type) {
случаи':
return '"' . $this->db->escape_string($params[$index]) . '"';
перерыв;
случай «Я»:
return (int) $params[$index];
перерыв;
случай «Н»:
вернуть (с плавающей запятой) $params[$index];
по умолчанию:
throw new Exception("Тип данных $type, указанный в хранимой процедуре, не распознан.");
}
}
В функции compile() используются две дополнительные функции. Функция compile_callback() используется в качестве функции обратного вызова при вызове функции preg_replace(). Каждый раз, когда в запросе обнаруживается заполнитель, он заменяется значением, переданным в функцию. При компиляции значения функции она будет выполнена.
Функция выполнения
Наконец, вам нужно создать функцию выполнения(). Функция выполнения() компилирует запрос и выполняет его, используя объект DB, который здесь используется для инициализации объекта DBQuery. Обратите внимание в примере 4, как функция call_user_func_array() используется для получения скомпилированного запроса. Причина этого в том, что функция Execute() не может определить количество переданных ей аргументов до момента выполнения.
Пример 4: функция выполнения()
/**
*
* Выполните текущий запрос и замените заполнители предоставленными параметрами.
*
* @param смешанный $queryParams,... Параметр запроса
* @return resources Ссылка на ресурс, представляющий выполненный запрос.
*/
выполнение публичной функции ($queryParams = '')
{
//Например: SELECT * FROM table WHERE name=:1S AND type=:2I AND level=:3N
$args = func_get_args();
если ($this->stored_procedure) {
/* Вызов функции компиляции для получения запроса */
$query = call_user_func_array(array($this, 'compile'), $args);
} еще {
/* Если хранимая процедура не была инициализирована, выполните ее как стандартный запрос. */
$query = $queryParams;
}
$this->result = $this->db->query($query);
return $this->result;
}
Соберите все это вместе.
Чтобы продемонстрировать, как использовать объект запроса, ниже создан небольшой пример, который будет использовать объект DBQuery в качестве хранимой процедуры и проверять правильность ввода имени пользователя и пароля. См. Пример 5:
Пример. 5:
требуется «mysql_db.php5»;
require_once 'query2.php5';
$db = новый MySqlDb;
$db->connect('хост', 'имя пользователя', 'пароль');
$db->query('use content_management_system');
$query = new DBQuery($db);
$query->prepare('SELECT fname,sname FROM username=:1S AND pword=:2S AND expire_time<:3I ');
if ($result = $query->execute("visualad", "apron", time())) {
if ($db->num_rows($result) == 1) {
echo('Учетные данные верны.');
} еще {
echo('Учетные данные неверны, срок действия сеанса истек.');
}
} еще {
echo('Произошла ошибка при выполнении запроса:' . $db->error());
}
В этой статье вы увидели, как защитить данные и ограничить видимость объектов данных с помощью модификаторов доступа Private, Protected и Public при объявлении переменных класса. В то же время в PHP 5 эти концепции также можно использовать. другой класс данных для защиты важных внутренних данных.