Просмотров: 76100
										Дата последнего изменения: 15.11.2023					
					
			
							
			
			
				
									
						Сложность урока:
						
							
								
									
										3 уровень - средняя сложность. Необходимо внимание и немного подумать.
									 
								 
							 
														
															
									4
								
																
									5
								
														 
					 
				
				
								
					Недоступно в лицензиях:
					
													Ограничений нет											
				 
				
							 
		 
	 	
	
		Практический пример работы с Базой данных через API D7 на основе создания собственного компонента. Создадим компонент:
<?php
class d7SQL extends CBitrixComponent
{
	var $connection;
	var $sqlHelper;
	var $sql;
	function __construct($component = null)
	{
		parent::__construct($component);
		$this->connection = \Bitrix\Main\Application::getConnection();
		$this->sqlHelper = $this->connection->getSqlHelper();
		//Строка запроса. Выбираем все логины, активных пользователей
		$this->sql = 'SELECT LOGIN FROM b_user WHERE ACTIVE = \''.$this->sqlHelper->forSql('Y', 1).'\' ';
	}
	/*
	* Возвращаем все значения
	*/
	function var1()
	{
		$recordset = $this->connection->query($this->sql);
			while ($record = $recordset->fetch())
		{
			$arResult[]=$record;
		}
		return $arResult;
	}
	/*
	* Возвращаем первые два значения
	*/
	function var2()
	{
		$recordset = $this->connection->query($this->sql,2);
		while ($record = $recordset->fetch())
		{
			$arResult[]=$record;
		}
		return $arResult;
	}
	/*
	* Возвращаем два значения, отступая два элемента от начала
	*/
	function var3()
	{
		$recordset = $this->connection->query($this->sql,2,2);
		while ($record = $recordset->fetch())
		{
		$arResult[]=$record;
		}
		return $arResult;
	}
	/*
	* Возвращаем сразу первый элемент из запроса
	*/
	function var4()
	{
		$arResult = $this->connection->queryScalar($this->sql);
		return $arResult;
	}
	/*
	* Выполняем запрос, не возвращая результат, т. е. INSERT, UPDATE, DELETE
	*/
	function var5()
	{
		$this->connection->queryExecute('UPDATE b_user SET ACTIVE = \'N\' WHERE LOGIN=\'test\' ');//Заменить на UPDATE
	}
	/*
	* Модифицируем результат
	*/
	function var6()
	{
		$recordset = $this->connection->query($this->sql);
		$recordset->addFetchDataModifier(
			function ($data)
			{
				$data["LOGIN"] .= ": Логин пользователя";
				return $data;
			}
		);
		while ($record = $recordset->fetch())
		{
			$arResult[]=$record;
		}
		return $arResult;
	}
	public function executeComponent()
	{
		//$this->arResult = $this->var1();
		//$this->arResult = $this->var2();
		//$this->arResult = $this->var3();
		//$this->arResult = $this->var4();
		//$this->var5();
		$this->arResult = $this->var6();
		$this->includeComponentTemplate();
	}
};
В коде объявлены три переменные:
- connection- хранит подключение к базе данных;
- sqlHelper- хранит объект конкретного класса формирования sql запросов;
- sql- sql запрос.
В конструкторе класса получаем соединение через приложения, которые, кроме всего прочего, являются точкой входа.
Так же у нас здесь формируется строка запроса: выбираются из таблицы пользователей логины всех пользователей, которые активны, то есть поле ACTIVE установлено в Y. В строке запроса использован метод forSql, который делает входные параметры безопасными. Так же он может ограничить длину строки. В нашем случае он показан для примера: передан Y и указано что длина не должна быть больше одного символа.
Через приложение выполняется запрос и получаются все значения, соответствующие значению. 
Функция var1: в ней осуществляется запрос и с помощью fetch получаются результаты. Типизированные данные возвращаются сразу в виде типа, а не в виде строк или чисел.
 
| Возвращаем все значения | 
|---|
| /*
* Возвращаем все значения
*/
	function var1()
	{
		$recordset = $this->connection->query($this->sql);
		while ($record = $recordset->fetch())
		{
			$arResult[]=$record;
		}
		return $arResult;
	} | 
 
Функция var2. Здесь выполняется тот же самый запрос, но указывается лимит на количество получаемых элементов. В нашем случае 2.
| Возвращаем первые два значения | 
|---|
| /*
* Возвращаем первые два значения
*/
	function var2()
		{
		$recordset = $this->connection->query($this->sql,2);
		while ($record = $recordset->fetch())
		{
			$arResult[]=$record;
		}
		return $arResult;
	} | 
 
Функция var3. Выполняется тот же самый запрос, но указываются два дополнительных параметра. Такая запись означает, то, что возвратятся два элемента. Это последний параметр. И эти элементы возвращаются нам начиная со второй позиции. Это второй параметр. То есть отступаем два элемента и отдаем два, начиная с третьего элемента.
| Возвращаем два значения, отступая два элемента от начала | 
|---|
| /*
* Возвращаем два значения, отступая два элемента от начала
*/
	function var3()
	{
		$recordset = $this->connection->query($this->sql,2,2);
		while ($record = $recordset->fetch())
		{
			$arResult[]=$record;
		}
		return $arResult;
	} | 
 
Функция var4 - скалярный запрос, то есть когда возвращается первый, единственный результат выборки.
| Возвращаем сразу первый элемент из запроса | 
|---|
| /*
* Возвращаем сразу первый элемент из запроса
*/
	function var4()
	{
		$arResult = $this->connection->queryScalar($this->sql);
		return $arResult;
	} | 
 
Функция var5 - выполнение запроса, без получения результата. Это нужно в случае INSERT, UPDATE, DELETE. 
| Выполняем запрос, не возвращая результат | 
|---|
| /*
 * Выполняем запрос, не возвращая результат, т. е. INSERT, UPDATE, DELETE
*/
	function var5()
	{
		$this->connection->queryExecute('UPDATE b_user SET ACTIVE = \'N\' WHERE LOGIN=\'test\' ');//Заменить на UPDATE
	} | 
 
Функция var6 - модификация результата. Смотрим . С помощью метода addFetchDataModifier объявляется функцию, которая на вход принимает массив результата для одного элемента и после модификации его возвращает. В нашем случае не сложный пример: просто к полю логин после двоеточия добавляется текст Логин пользователя.
| Модифицируем результат | 
|---|
| /*
* Модифицируем результат
*/
	function var6()
	{
		$recordset = $this->connection->query($this->sql);
		$recordset->addFetchDataModifier(
			function ($data)
			{
				$data["LOGIN"] .= ": Логин пользователя";
				return $data;
			}
		);
		while ($record = $recordset->fetch())
		{
			$arResult[]=$record;
		}
		return $arResult;
	} | 
 
В метод fetch можно передать конвертер. Выглядит это так:
<?
$record = $recordset->fetch(\Bitrix\Main\Text\Converter::getHtmlConverter())
Допустимо использовать методы Bitrix\Main\Text\Converter::getHtmlConverter и Bitrix\Main\Text\Converter::getXmlConverter. Соответственно, они  подготавливают к выводу в html и в xml.  Происходит преобразование специальных символов в html сущности.