Подключение SQL адаптеров данных
Для построения отчетов, генератор отчетов позволяет использовать данные из различных SQL источников. Поскольку чистый JavaScript не имеет встроенных методов для работы с удаленными базами данных, эта функциональность реализуется с помощью серверного PHP кода. Для работы с SQL источниками данных не требуется никаких дополнительных действий, все адаптеры данных уже подключены и настроены для работы.
При необходимости контролировать все возможные параметры подключения к базе данных, предусмотрено событие onDatabaseConnect. В аргументах события будут переданы все необходимые параметры подключения к SQL источнику данных, а также тип и название драйвера используемой базы данных. Все параметры подключения к источнику данных могут быть изменены. Дополнительно, предусмотрена возможность передать в аргументах события уже созданное подключение к базе данных. Подробное описание доступных значений свойств, передаваемых в аргументах события, находится в разделе События генератора отчетов.
Пример создания подключения к MySQL базе данных с указанием приватного SSL ключа:
index.php |
<?php use Stimulsoft\Events\StiConnectionEventArgs; use Stimulsoft\Report\StiReport;
$report = new StiReport(); $report->onDatabaseConnect = function (StiConnectionEventArgs $args) { $args->link = mysqli_init(); mysqli_ssl_set($args->link, null, null, "./private/cert.pem", null, null); $args->link = mysqli_real_connect( $args->link, $args->info->host, $args->info->userId, $args->info->password, $args->info->database, $args->info->port, NULL, MYSQLI_CLIENT_SSL); };
$report->render(); ?>
|
При необходимости обработки параметров, используемых для подключения к базе данных, предусмотрено событие onBeginProcessData. В аргументах события будут переданы все необходимые параметры подключения к SQL источнику данных, а также параметры SQL запроса. Все параметры подключения к источнику данных могут быть изменены как на стороне JavaScript клиента, так и на стороне PHP сервера. Подробное описание доступных значений свойств, передаваемых в аргументах события, находится в разделе События генератора отчетов.
Пример измерения SQL запроса на стороне JavaScript клиента, и строки подключения к базе данных на стороне PHP сервера:
index.php |
<?php use Stimulsoft\Events\StiDataEventArgs; use Stimulsoft\Report\StiReport;
function beginProcessData(StiDataEventArgs $args) { if ($args->connection == 'MyConnectionName') $args->connectionString = 'Server=localhost;Database=test;uid=root;password=******;'; };
$report = new StiReport(); $report->onBeginProcessData->append(beginProcessData); $report->onBeginProcessData->append('beginProcessData'); $report->render(); ?>
...
<script> function beginProcessData(args) { if (args.dataSource == "MyDataSource") args.queryString = "SELECT * FROM ProductsTable"; } </script>
|
Полный код примера доступен на GitHub.
Таким образом, в событии onBeginProcessData можно узнать тип базы данных, имя подключения и имя источника данных, получить и при необходимости скорректировать строку подключения и SQL запрос. При изменении значений любого свойства в аргументах события на стороне PHP сервера, измененные значения не будут переданы на сторону клиента, поэтому в качестве значений можно использовать конфиденциальные данные, такие как логин и пароль в строке подключения, имена и префиксы таблиц и т.п.
Для просмотра либо корректировки загруженных данных перед их регистрацией и построением отчета, предусмотрено событие onEndProcessData. В аргументах события будут переданы все параметры подключения к SQL источнику данных, а также результат выполнения запроса, содержащий названия колонок, типы колонок и строки данных, полученные из SQL источника. Подробное описание доступных значений свойств, передаваемых в аргументах события, находится в разделе События генератора отчетов.
Пример результата выполненного SQL запроса, где результат уже содержит подготовленные для отчета данные:
index.php |
<?php use Stimulsoft\Events\StiDataEventArgs; use Stimulsoft\Report\StiReport;
function endProcessData(StiDataEventArgs $args) { $args->result->columns = ['id', 'username', 'phone']; $args->result->types = ['int', 'string', 'string']; $args->result->rows = [ [1, 'Mario Pontes', '555-6874'], [2, 'Helen Bennett', '555-2376'] ]; };
$report = new StiReport(); $report->onEndProcessData->append(endProcessData); $report->onEndProcessData->append('endProcessData'); $report->render(); ?>
...
<script> function endProcessData(args) { args.result.columns = ["id", "username", "phone"]; args.result.types = ["int", "string", "string"]; args.result.rows = [ [1, "Mario Pontes", "555-6874"], [2, "Helen Bennett", "555-2376"] ]; } </script>
|
Доступные свойства объекта результата выполнения SQL запроса указаны в таблице:
Наименование |
Описание |
count |
Общее количество колонок таблицы SQL источника данных. |
columns |
Имена колонок таблицы SQL источника данных. |
types |
Типы колонок таблицы SQL источника данных, приведенные к известным типам для генератора отчетов. |
rows |
Строки данных SQL источника данных, представляет собой массив из массивов всех строк таблицы. |
Все данные результата выполнения SQL запроса могут быть изменены как на стороне JavaScript клиента, так и на стороне PHP сервера. Количество колонок и типы данных должны совпадать для исключения неверной интерпретации данных генератором отчета.
Использование параметров в SQL запросе
При необходимости, можно использовать параметры в SQL запросе. Для этого, в источнике данных необходимо добавить параметры в специальную коллекцию, для каждого параметра установить необходимый тип и значение по умолчанию. После этого, параметры можно использовать в SQL запросе следующим образом:
SQL Data Source |
SELECT * FROM @Parameter1 WHERE UserID = @Parameter2
|
Все значения параметров хранятся в самом источнике данных в виде коллекции. Коллекция представляет собой массив из объектов, содержащих имя параметра, его тип и значение. Пример структуры массива параметров на стороне JavaScript клиента:
index.php |
args.parameters = [ { name: "ParameterString", type: 752, typeName: "Text", value: "Text value" }, { name: "ParameterInt", type: 3, typeName: "Int32", value: 20 } ];
|
Для доступа к параметрам запроса можно воспользоваться событием onBeginProcessData, коллекция параметров будет передана в аргументах события. Допускается изменение значений любых параметров, находящихся в передаваемой коллекции. Пример изменения значения одного и того же параметра на стороне JavaScript клиента и на стороне PHP сервера:
index.php |
<?php use Stimulsoft\Events\StiDataEventArgs; use Stimulsoft\Report\StiReport;
$report = new StiReport(); $report->onBeginProcessData->append(' args.parameters["Parameter1"] = "TableName"; ');
$report->onBeginProcessData->append(function (StiDataEventArgs $args) { $args->parameters['Parameter1']->value = 'TableName'; });
$report->render(); ?>
|
При изменении значений параметров запроса, тип нового значения должен соответствовать типу изменяемого параметра. В противном случае, выполнение SQL запроса может вернуть некорректные данные либо вызвать внутреннюю ошибку выполнения.
Информация |
При изменении значений параметров на стороне PHP сервера, измененные значения не будут переданы на сторону клиента, поэтому в качестве значений можно использовать конфиденциальные данные.
|
Если в отчете используется несколько источников данных, необходимо выполнять проверку перед присвоением параметров. В противном случае, возникнет ошибка выполнения PHP скрипта, если какой-либо из параметров будет отсутствовать в текущем источнике данных. Например, в отчете создано два источника данных, оба имеют один общий параметр, и один параметр только во втором источнике данных:
index.php |
$report->onBeginProcessData->append(function (StiDataEventArgs $args) { $args->parameters['Parameter1']->value = 'TableName';
if ($args->dataSource == 'DataSource2') $args->parameters['Parameter2']->value = 10; });
|
Использование переменной отчета в качестве SQL параметра
Предусмотрена возможность использования переменной в качестве SQL параметра. Для этого в редакторе переменной отчета достаточно установить свойство Allow using as SQL parameter, после чего её можно использовать в любом SQL запросе. Синтаксис будет точно таким же, как и при использовании параметров в источнике данных.
Информация |
Такая переменная будет передана в коллекции параметров только в том случае, если она используется в запросе. Параметры из коллекции источника данных передаются всегда, даже если в запросе они не использованы.
|
Экранирование значений параметров
Все значения параметров будут автоматически экранированы для исключения возможности SQL инъекций и нарушения безопасности выполнения запросов. Если вам не требуется экранирование, и вы сами контролируете безопасность значений параметров, автоматическое экранирование можно отключить. Для этого достаточно установить свойство escapeQueryParameters в значение false у обработчика событий:
index.php |
<?php use Stimulsoft\Report\StiReport;
$report = new StiReport(); $report->handler->escapeQueryParameters = false; ?>
|
После установки указанного свойства, использование параметров является небезопасным, вам нужно строго контролировать значения перед выполнением SQL запросов.
Информация |
Экранирование применяется только для параметров SQL запросов, а также для переменных, используемых как параметры. Если переменная используется в виде выражения, т.е. в фигурных скобках, например {VariableName}, то экранирование применяться не будет в любом случае. Подробное описание работы переменных находится в разделе Работа с переменными отчета.
|