PHP 5.6 升级后 SQLSRV 未获取数据
SQLSRV Not Getting Data after PHP 5.6 Upgrade
我遇到了一个问题,我似乎无法解决自己的问题,所以 SO 社区似乎是我要去的地方!
我有 3 个 PHP 服务,它们非常简单地 return 来自同一数据库的不同表的数据,并将其输出为 json。这 3 个服务都使用完全相同的代码和不同的 select 语句。问题是我能够在其中两项服务上获取我的数据,但不能在一项服务上获取数据(恰好拥有最大的数据集)。我已经将我的资源配置从 PHP 5.4 匹配到 5.6,但仍然没有结果。所有这三个服务在 PHP 5.4 上都可以正常工作,但是在 5.6 升级之后,只有一个不能(再次,相同的代码)。
我在下面附加了这两项服务,以便您进行比较。我已经验证了我的 SQL 语句,并检查了所有日志文件。 PHP 未显示任何错误,IIS 显示 200(两种服务均已完成 GET)。
服务失败
include "config/db.php";
$detailsConn = sqlsrv_connect($serverName, $connectionInfo);
if (!$detailsConn)
{
die('Connection failed!');
}
do
{
$json = array();
$detailsSql = "SELECT * from dbo.DeviceTypeTable_Desktop LEFT JOIN dbo.IPAddresses ON dbo.DeviceTypeTable_Desktop.IPAddressId=dbo.IPAddresses.IPAddressid WHERE IsDeleted = 'false'";
$detailsStmt = sqlsrv_query($detailsConn, $detailsSql);
while ($row = sqlsrv_fetch_array($detailsStmt, SQLSRV_FETCH_ASSOC))
{
$json[] = $row;
}
$detailsSql = "SELECT * from dbo.DeviceTypeTable_Laptop LEFT JOIN dbo.IPAddresses ON dbo.DeviceTypeTable_Laptop.IPAddressId=dbo.IPAddresses.IPAddressid WHERE IsDeleted = 'false'";
$detailsStmt = sqlsrv_query($detailsConn, $detailsSql);
while ($row = sqlsrv_fetch_array($detailsStmt, SQLSRV_FETCH_ASSOC))
{
$json[] = $row;
}
}
while (sqlsrv_next_result($detailsStmt));
echo json_encode($json);
sqlsrv_free_stmt($detailsStmt);
sqlsrv_close($detailsConn);
工作服务
include "config/db.php";
$detailsConn = sqlsrv_connect($serverName, $connectionInfo);
if (!$detailsConn)
{
die('Connection failed!');
}
do
{
$json = array();
$detailsSql = "SELECT * from dbo.DeviceTypeTable_Yuma LEFT JOIN dbo.IPAddresses ON dbo.DeviceTypeTable_Yuma.IPAddressId=dbo.IPAddresses.IPAddressid WHERE IsDeleted = 'false'";
$detailsStmt = sqlsrv_query($detailsConn, $detailsSql);
while ($row = sqlsrv_fetch_array($detailsStmt, SQLSRV_FETCH_ASSOC))
{
$json[] = $row;
}
$detailsSql = "SELECT * from dbo.DeviceTypeTable_iPad LEFT JOIN dbo.IPAddresses ON dbo.DeviceTypeTable_iPad.IPAddressId=dbo.IPAddresses.IPAddressid WHERE IsDeleted = 'false'";
$detailsStmt = sqlsrv_query($detailsConn, $detailsSql);
while ($row = sqlsrv_fetch_array($detailsStmt, SQLSRV_FETCH_ASSOC))
{
$json[] = $row;
}
}
while (sqlsrv_next_result($detailsStmt));
echo json_encode($json);
sqlsrv_free_stmt($detailsStmt);
sqlsrv_close($detailsConn);
编辑:我已经在机器上重新安装了 PHP 5.6,并确保我的 SQLSRV 驱动程序已正确安装(因为它可以在另外 2 个上运行!)。
我也重新启动了 IIS 来验证这一切。
我找到了我的问题。显然有来自 table 的数据不是 UTF-8 编码的,因此导致一项服务失败。对此的解决方案是将 "CharacterSet" => "UTF-8"
放入 SQLSRV 的连接详细信息数组中。出于某种原因,这种编码在 PHP 5.4 上不是问题,但从那以后是。然而,最佳做法是确保您在数据库连接详细信息中删除该编码。
我遇到了一个问题,我似乎无法解决自己的问题,所以 SO 社区似乎是我要去的地方!
我有 3 个 PHP 服务,它们非常简单地 return 来自同一数据库的不同表的数据,并将其输出为 json。这 3 个服务都使用完全相同的代码和不同的 select 语句。问题是我能够在其中两项服务上获取我的数据,但不能在一项服务上获取数据(恰好拥有最大的数据集)。我已经将我的资源配置从 PHP 5.4 匹配到 5.6,但仍然没有结果。所有这三个服务在 PHP 5.4 上都可以正常工作,但是在 5.6 升级之后,只有一个不能(再次,相同的代码)。
我在下面附加了这两项服务,以便您进行比较。我已经验证了我的 SQL 语句,并检查了所有日志文件。 PHP 未显示任何错误,IIS 显示 200(两种服务均已完成 GET)。
服务失败
include "config/db.php";
$detailsConn = sqlsrv_connect($serverName, $connectionInfo);
if (!$detailsConn)
{
die('Connection failed!');
}
do
{
$json = array();
$detailsSql = "SELECT * from dbo.DeviceTypeTable_Desktop LEFT JOIN dbo.IPAddresses ON dbo.DeviceTypeTable_Desktop.IPAddressId=dbo.IPAddresses.IPAddressid WHERE IsDeleted = 'false'";
$detailsStmt = sqlsrv_query($detailsConn, $detailsSql);
while ($row = sqlsrv_fetch_array($detailsStmt, SQLSRV_FETCH_ASSOC))
{
$json[] = $row;
}
$detailsSql = "SELECT * from dbo.DeviceTypeTable_Laptop LEFT JOIN dbo.IPAddresses ON dbo.DeviceTypeTable_Laptop.IPAddressId=dbo.IPAddresses.IPAddressid WHERE IsDeleted = 'false'";
$detailsStmt = sqlsrv_query($detailsConn, $detailsSql);
while ($row = sqlsrv_fetch_array($detailsStmt, SQLSRV_FETCH_ASSOC))
{
$json[] = $row;
}
}
while (sqlsrv_next_result($detailsStmt));
echo json_encode($json);
sqlsrv_free_stmt($detailsStmt);
sqlsrv_close($detailsConn);
工作服务
include "config/db.php";
$detailsConn = sqlsrv_connect($serverName, $connectionInfo);
if (!$detailsConn)
{
die('Connection failed!');
}
do
{
$json = array();
$detailsSql = "SELECT * from dbo.DeviceTypeTable_Yuma LEFT JOIN dbo.IPAddresses ON dbo.DeviceTypeTable_Yuma.IPAddressId=dbo.IPAddresses.IPAddressid WHERE IsDeleted = 'false'";
$detailsStmt = sqlsrv_query($detailsConn, $detailsSql);
while ($row = sqlsrv_fetch_array($detailsStmt, SQLSRV_FETCH_ASSOC))
{
$json[] = $row;
}
$detailsSql = "SELECT * from dbo.DeviceTypeTable_iPad LEFT JOIN dbo.IPAddresses ON dbo.DeviceTypeTable_iPad.IPAddressId=dbo.IPAddresses.IPAddressid WHERE IsDeleted = 'false'";
$detailsStmt = sqlsrv_query($detailsConn, $detailsSql);
while ($row = sqlsrv_fetch_array($detailsStmt, SQLSRV_FETCH_ASSOC))
{
$json[] = $row;
}
}
while (sqlsrv_next_result($detailsStmt));
echo json_encode($json);
sqlsrv_free_stmt($detailsStmt);
sqlsrv_close($detailsConn);
编辑:我已经在机器上重新安装了 PHP 5.6,并确保我的 SQLSRV 驱动程序已正确安装(因为它可以在另外 2 个上运行!)。
我也重新启动了 IIS 来验证这一切。
我找到了我的问题。显然有来自 table 的数据不是 UTF-8 编码的,因此导致一项服务失败。对此的解决方案是将 "CharacterSet" => "UTF-8"
放入 SQLSRV 的连接详细信息数组中。出于某种原因,这种编码在 PHP 5.4 上不是问题,但从那以后是。然而,最佳做法是确保您在数据库连接详细信息中删除该编码。