Статичные запросы в Drupal

Наиболее распространенной формой запроса в Drupal является статический запрос. Статический запрос, который будет передан в базу данных почти дословно. Только select запросы могут быть статическими.

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

Внутренний способ выдачи статического запроса это метод запроса:

	$result = $conn->query("SELECT nid, title FROM {node}");

	$result = db_query("SELECT nid, title FROM {node}");

	$result = Database::getConnection()->query("SELECT nid, title FROM {node}");
(См. почему процедурная версия предпочтительнее?)

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

Префиксы

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

Заполнители(переменные)

Заполнители отмечают где переменная будует вставлена в запрос на выполнение. Отделяя их от самого запроса, мы позволим базе данных провести различие между синтаксисом SQL и предоставленными пользователем значениями, чтобы позволить избежать SQL инъекций.

	$result = db_query("SELECT nid, title FROM {node} WHERE created > :created", array(
				  			':created' => REQUEST_TIME - 3600,
					   ));

Приведенный выше код выберет все ноды, созданные в течение последнего часа (3600 секунд). Заполнитель :created динамически заменяется в зависимости от значения REQUEST_TIME - 3600 - это значение в запросе подставляется. Запрос может иметь любое число заполнителей(переменных), но все должны иметь уникальные имена, даже если они имеют одинаковое значение. В зависимости от варианта использования, массив заполнителей может быть определен внутренне (как указано выше), или может быть построен заранее и передан внутрь.

Заполнители, начинающиеся с "db_" зарезервированы для внутреннего использования системы и не должны быть указаны в явном виде.

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

	// НЕПРАВИЛЬНО:
	$result = db_query("SELECT nid, title FROM {node} WHERE type = ':type'", array(
	  ':type' => 'page',
	));
	 
	// ПРАВИЛЬНО:
	$result = db_query("SELECT nid, title FROM {node} WHERE type = :type", array(
	  ':type' => 'page',
	));

Заполнители не должны (в самом деле, не могут) быть использованы для имен столбцов и таблиц. Вместо этого, если они получены из небезопасных источника, они должны проходить через db_escape_table().

Массив заполнителей

Уровень баз данных Drupal включает в себя дополнительные возможности заполнителей. Если значение передается в заполнитель как массив, он будет автоматически расширен в список разделенный запятыми соответствующих заполнителей. Это означает, что разработчикам не нужно беспокоиться о подсчете сколько заполнителей им понадобится.

Пример должен пояснить это нагляднее:

	// Этот код:
	db_query("SELECT * FROM {node} WHERE nid IN (:nids)", array(':nids' => array(13, 42, 144));
	 
	// Преобразуется в нужный запрос автоматически:
	db_query("SELECT * FROM {node} WHERE nid IN (:nids_1, :nids_2, :nids_3)", array(
	  ':nids_1' => 13,
	  ':nids_2' => 42,
	  ':nids_3' => 144,
	));
	 
	// Что эквивалентно следующему запросу:
	db_query("SELECT * FROM {node} WHERE nid IN (13, 42, 144)");

The "fetch" key specifies how records returned from that query will be retrieved. Legal values include PDO::FETCH_OBJ, PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_BOTH, or a string representing the name of a class. If a string is specified, each record will be fetched into a new object of that class. The behavior of all other values is defined by PDO, and will retrieve records as a stdClass object, an associative array, a numerical array, or an array keyed both numerically and associatively, respectively. See https://www.php.net/manual/en/pdostatement.fetch.php. The default is PDO::FETCH_OBJ, which for consistency should be used unless there is a specific reason to do otherwise.

The following example will execute a query against a slave server if available and fetch records from the result set as an associative array.

Настройки запроса

Третий параметр в db_query() (и в методе запроса объекта подключения ) представляет собой массив из опций, которые управляют тем как будет себя вести запрос. Это главным образом только две директивы, которые используются большинством запросов.Другие значения предназначены в основном для внутреннего использования.

Ключ "target" определяет цель использования. Если не указан, то по умолчанию используется "default". В настоящий момент единственное допустимое значение является "slave", чтобы указать, что запрос должен идти на подчиненный сервер, если таковой существует.

Ключ "fetch" определяет как записи возвращаются ответ на запрос будет получен. Допустимые значения включают PDO::FETCH_OBJ, PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_BOTH, или строка, представляющая имя класса. Если строка определена, каждая запись будет получена в новом объекте этого класса. Поведение всех остальных значений определяется PDO, и будет возвращать записи как объект StdClass , ассоциативный массив, числовой массив или массив ключами которого будет как числа так и строки, соответственно. См. http://php.net/manual/en/pdostatement.fetch.php. По умолчанию это PDO::FETCH_OBJ, который следует использовать для последовательности, если нет особых причин поступить иначе.

В следующем примере будет выполнен запрос к серверу, если slave-сервер доступен и полученные записи из набора результатов представлены в виде ассоциативного массива.

	$result = db_query("SELECT nid, title FROM {node}", array(), array(
	  'target' => 'slave',
	  'fetch' => PDO::FETCH_ASSOC,
	));

оригинал, перевод от 15 ноября 2012

Тэги:

Тэг в списке: