Профессиональное программирование на PHP

Страница 56 из 591


Краткое введение в типовые проекты 59

данных. Этот этап предполагает определенные издержки, поэтому многие базы данных пытаются кэшировать результаты. Пользователь может подготовить запрос, заставляющий базу данных проанализировать его синтаксис и возвратить ресурс, который связан с представлением проанализированного запроса. Функция, которая часто сопровождает данный подход, называется bind SQL Bind SQL позволяет выполнить синтаксический анализ запроса с метками-заполнителями, в которые затем подставляются данные переменных. .Перед выполнением можно привязать параметры к проанализированной версии запроса. Во многих системах баз данных (особенно в Oracle) использование bind SQL приносит значительный выигрыш производительности.

Версии MySQL до 4.1 не предоставляли отдельный интерфейс для подготовки запросов перед выполнением и не допускали использования bind SQL. Однако передача всех переменных данных в процесс по отдельности обеспечивает удобное пространство для перехвата переменных и их экранирования до того, как они будут вставлены в запрос. Интерфейс к новым функциям MySQL 4.1 обеспечивается расширением mysqli Джорджа Ритчера (Georg Richter).

Для достижения этой цели необходимо модифицировать класс DB_Mysql так, чтобы он включал в себя метод prepare, и включить в класс DB_MysqlStatement методы bind и execute.

class DB_Mysql { /* ... */

public function prepare($query) { if(!$this->dbh) { $this->connect();

}

return new DB MysqlStatetnent($this->dbh, $query);

}

}

class DB_MysqlStatement { public $result; public $binds; public $query; public $dbh; I* ... * I

public function execute() { $binds = func_get_args(); foreach($binds as $index => $name) { $this->binds[$index + 1] = $name;

}

$cnt = count($binds);

$query = $this->query;

foreach ($this->binds as $ph => $pv) {

$query = str_replace(":$ph", "'".mysql_escape_string($pv)."'", $query); }

$this->result = mysql_query($query, $this->dbh); if(!$this->result) {

throw new MysqlException;

}

return $this;

}

}




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006