Базы данных

По умолчанию jqGridPHP использует PDO для работы с базой данных.
Вам всего лишь необходимо указать четыре переменных в загрузчике:

  • pdo_dsn - DSN базы данных
  • pdo_user - имя пользователя
  • pdo_pass - пароль
  • pdo_options - дополнительные опции

Эти переменные передаются напрямую в конструктор объекта PDO.

Вы можете использовать любые другие библиотеки. Прочитать об этом можно здесь.

Поддержка СУБД

В настоящий момент jqGridPHP поддерживает MySQL и PostgreSQL. Существуют адаптеры, добавляющие поддержку Mssql и Oracle. Поддержка других СУБД также может быть добавлена при помощи адаптеров.

Безопасность

Все переменные, используемые в SQL-запросах, соответствующим образом экранируются. Обработка осуществляется методом PDO::quote.
Он экранирует специальные символы и добавляет кавычки в начало и в конец строки. Значение Null НЕ изменяется и остается как есть.

Основные функции

Функции для работы с базой данных вынесены в отдельные классы (драйверы). Обращение к ним происходит следующим образом:

$this->DB->query('SELECT * FROM tbl_books');
Функция Аргументы Возврат Комментарий
link нет resource или object - соединение с БД Возвращает соединение с БД. Неявно вызывается внутри других функций.
query $query [string] - запрос resource или object - результат Основная функция, через которую выполняются все запросы.
fetch resource или object - результат array - следующий ряд Аналог *_fetch_assoc.
quote mixed - значение mixed - «SQL-безопасное» значение Экранирует специальные символы и добавляет кавычки. В отличие от стандартной PDO::quote, не изменяет Null.
rowCount resourse или object - результат integer - кол-во рядов Аналог *_affected_rows

Дополнительные функции

Также есть функции-помощники для базовых операций. Они сами обрабатывают входящие переменные и собирают запросы.

Функция Аргументы Возврат Комментарий
insert $table [string] - имя таблицы
$ins [array] - данные для записи
$last_id [boolean] - возвращать last_insert_id
resource или object Обертка для INSERT.
Если $last_id == true, то вернет id добавленной записи.
update $table [string] - имя таблицы
$upd [array] - данные для записи
$cond [string,array] - условие
resource или object Обертка для UPDATE.
delete $table [string] - имя таблицы
$cond [string,array] - условие
resource или object Обертка для DELETE.

Передача условий

Переменная $cond имеет разное значение в зависимости от своего типа.

  • Массив превращается в SQL-условие, объединенное AND.
  • Число превращается в выражение «id=$cond;».
  • Строка передается как есть. Этот вариант небезопасен, и вы отвечаете за защиту от SQL-инъекций в этом случае.

Если $cond берется из небезопасного источника - приводите его к нужному типу перед передачей в функцию.

$this->dbUpdate($tblName, $upd, (array)$cond);

Подзапросы и SQL-функции

При помощи объектов класса jqGrid_Data_Raw можно указать те значения, которые не будут экранироваться. Они будут подставляться в SQL запрос в точности «как есть». Это позволяет легко использовать SQL-функции и подзапросы.

Например:

$tblName = 'customer';
$upd = array('name' => "Вася'и Петя", 'date' => new jqGrid_Data_Raw('now()'));
$cond = 15;
$this->dbUpdate($tblName, $upd, (integer)$cond);

Выполняет следующий SQL-запрос (для PostgreSQL):

UPDATE customer SET name='Вася''и Петя',DATE=now() WHERE id=15

Расширение

jqGridPHP может использовать те класс для работы с базами данных, которые уже используются в вашем приложении.

Для этого необходимо добавить новый драйвер в папку /DB/, унаследовать его от абстрактного jqGrid_DB и определить необходимые функции.

Пример использования стандартных функций для PostgreSQL вместо PDO:

class jqGrid_DB_Pgsql extends jqGrid_DB
{
	protected $db_type = 'postgresql';
 
	public function link()
	{
		static $link = null;
 
		if(!$link)
		{
			$connect = $this->loader->get('db_pg_connect');
			$link = pg_connect($connect);
		}
 
		return $link;
	}
 
	public function query($query)
	{
		return pg_query($this->link(), $query);
	}
 
	public function fetch($result)
	{
		return pg_fetch_assoc($result);
	}
 
	public function quote($val)
	{
		if(is_null($val))
		{
			return $val;
		}
 
		return "'" . pg_escape_string($this->link(), $val) . "'";
	}
 
	public function rowCount($result)
	{
		return pg_affected_rows($result);
	}
}

Запросы инициализации

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

Например:

$jq_loader = new jqGridLoader;
 
$jq_loader->set('pdo_dsn', $_CONFIG['pdo_dsn']);
$jq_loader->set('pdo_user', $_CONFIG['pdo_user']);
$jq_loader->set('pdo_pass', $_CONFIG['pdo_pass']);
 
$jq_loader->addInitQuery('SET NAMES utf8');

Если у вас будет несколько соединений с разными базами, то очистить список запросов можно при помощи resetInitQuery.


На других языках