存储过程在 MSQL Studio 中工作正常,但现在 PHP
Stored Procedures work fine in MSQL Studio, but now in PHP
SQL 存储过程 returns 当我从我的移动应用程序或网络浏览器调用它时为 NULL,但相同的过程 returns 当使用 SQLPro for MSSQL 软件
if( $conn == FALSE ) {
echo "Connection failed.";
die( print_r( sqlsrv_errors(), true));
}
$query = "EXEC dbo.sp_Pok_Details @oe=17,@code='5907769000409'";
$getProducts = sqlsrv_query($conn, $query);
if ($getProducts == FALSE)
{
die(FormatErrors(sqlsrv_errors()));
}
while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC))
{
$returnArray[] = $row;
}
echo json_encode($returnArray);
说明:
您需要将 SET NOCOUNT ON
作为存储过程的第一行,以防止返回受 T-SQL 语句影响的行数作为结果集的一部分。这就是您的 NULL 结果的原因。
如果您无法更改存储过程,请使用sqlsrv_next_result()
激活下一个结果,然后获取数据。
请注意,始终使用准备好的语句和参数化查询来防止 SQL 注入。对于 SQL 服务器的 PHP 驱动程序,函数 sqlsrv_query()
同时进行语句准备和语句执行,可用于执行参数化查询。
示例(基于您的代码):
<?php
if( $conn === false ) {
echo "Connection failed.";
die( print_r( sqlsrv_errors(), true));
}
$query = "EXEC dbo.sp_Pok_Details @oe = ?, @code = ?";
$params = array(17, '5907769000409');
$getProducts = sqlsrv_query($conn, $query, $params);
if ($getProducts === false) {
die( print_r( sqlsrv_errors(), true));
}
// Just for test - make additional call(s) to get the count of the active result sets
do {
while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) {
echo 'Current rowset'.'<br>';
}
} while (sqlsrv_next_result($getProducts));
// Or if you have only one result set
//while ($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) {
// $returnArray[] = $row;
//}
echo json_encode($returnArray);
?>
SQL 存储过程 returns 当我从我的移动应用程序或网络浏览器调用它时为 NULL,但相同的过程 returns 当使用 SQLPro for MSSQL 软件
if( $conn == FALSE ) {
echo "Connection failed.";
die( print_r( sqlsrv_errors(), true));
}
$query = "EXEC dbo.sp_Pok_Details @oe=17,@code='5907769000409'";
$getProducts = sqlsrv_query($conn, $query);
if ($getProducts == FALSE)
{
die(FormatErrors(sqlsrv_errors()));
}
while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC))
{
$returnArray[] = $row;
}
echo json_encode($returnArray);
说明:
您需要将 SET NOCOUNT ON
作为存储过程的第一行,以防止返回受 T-SQL 语句影响的行数作为结果集的一部分。这就是您的 NULL 结果的原因。
如果您无法更改存储过程,请使用sqlsrv_next_result()
激活下一个结果,然后获取数据。
请注意,始终使用准备好的语句和参数化查询来防止 SQL 注入。对于 SQL 服务器的 PHP 驱动程序,函数 sqlsrv_query()
同时进行语句准备和语句执行,可用于执行参数化查询。
示例(基于您的代码):
<?php
if( $conn === false ) {
echo "Connection failed.";
die( print_r( sqlsrv_errors(), true));
}
$query = "EXEC dbo.sp_Pok_Details @oe = ?, @code = ?";
$params = array(17, '5907769000409');
$getProducts = sqlsrv_query($conn, $query, $params);
if ($getProducts === false) {
die( print_r( sqlsrv_errors(), true));
}
// Just for test - make additional call(s) to get the count of the active result sets
do {
while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) {
echo 'Current rowset'.'<br>';
}
} while (sqlsrv_next_result($getProducts));
// Or if you have only one result set
//while ($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) {
// $returnArray[] = $row;
//}
echo json_encode($returnArray);
?>