Подключение 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}, то экранирование применяться не будет в любом случае. Подробное описание работы переменных находится в разделе Работа с переменными отчета.
|
Шифрование данных, передаваемых на сторону клиента
Если включено общее шифрование данных при помощи опции $encryptData, то все передаваемые на сторону клиента данные будут зашифрованы, включая данные из SQL источников. Это повышает безопасность, но может замедлить работу на больших объёмах данных. Предусмотрена возможность отдельного отключения шифрования SQL данных, передаваемых на сторону клиента. Для этого достаточно установить свойство $encryptSqlData в значение false у обработчика событий, после этого все данные будут передаваться в открытом виде в JSON формате. Это не должно в значительной мере повлиять на безопасность, т.к. в незашифрованном виде будут переданы только сами данные, которые в том или ином виде отображаются в отчёте.
index.php |
<?php use Stimulsoft\Report\StiReport;
$report = new StiReport(); $report->handler->encryptSqlData = false; $report->process(); ?>
|