Пояснения:
Вам необходимо поставить SET NOCOUNT ON
в качестве первой строки в вашей хранимой процедуре, чтобы предотвратить возвращение количества строк, на которые влияют операторы T-SQL, как части результата. установлен. Это является причиной ваших NULL
результатов.
Как примечание, всегда используйте подготовленные операторы и параметризованные запросы для предотвращения внедрения SQL. В PHP Driver для SQL Server функция sqlsrv_query()
выполняет как подготовку операторов, так и их выполнение и может использоваться для выполнения параметризованных запросов.
Пример:
Есть ошибкив вашем скрипте, которые исправлены в примере:
sqlsrv_free_stmt($stmt)
заменен на sqlsrv_free_stmt($result)
- переменная
$flag
не определена $serverresponse = $serverresponse=JSON_encode($response)
изменено на $serverresponse = json_encode($response)
T-SQL:
CREATE procedure [dbo].[tester]
@id nvarchar(max)
as
begin
SET NOCOUNT ON
declare @tab table (myxml xml)
insert into @tab(myxml)
select map from forms where mapid=@id
select * from @tab
end
PHP:
<?php
$flag = "";
$serverName = "servername";
$connectionInfo = array("UID" => "sa", "PWD" => "mypass", "Database" => "database");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if ($conn) {
$tsql = "exec tester ?";
$params = array('FORMgRGVL7bfpEnpBpg7vz2sHoKAs5zxU5LW');
$result = sqlsrv_query($conn, $tsql, $params);
if ($result === false) {
die( print_r( sqlsrv_errors(), true) );
$response = array('response'=>'notok', 'data'=>'loyo');
$serverresponse = json_encode($response);
} else {
$row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_NUMERIC);
$response = array('response'=>'ok', 'data'=>$row[0]);
$serverresponse = json_encode($response);
}
sqlsrv_free_stmt($result);
} else {
$response = array('response'=>'notok', 'flag'=>$flag, 'data'=>'cc');
$serverresponse = json_encode($response);
}
echo ($serverresponse);
?>