MS SQL Server 查询后返回 JSON
Posted
技术标签:
【中文标题】MS SQL Server 查询后返回 JSON【英文标题】:Return JSON after MS SQL Server query 【发布时间】:2016-07-15 13:35:24 【问题描述】:我正在尝试将 MS SQL Server 查询的结果作为 JSON 对象返回。
查询是正确的,我也可以看到echo $row ['name']
的结果,但我没有得到echo json_encode ( $arr )
的任何结果。该页面仍然是空的。
这是我的代码:
$sql = "SELECT * FROM tab1";
$stmt = sqlsrv_query ( $conn, $sql );
if ($stmt === false)
die ( print_r ( sqlsrv_errors (), true ) );
$arr = array ();
while ( $row = sqlsrv_fetch_array ( $stmt ) )
// echo $row ['name'] . "\n"; // <- this works
array_push ( $arr, $row );
echo json_encode ( $arr );
sqlsrv_free_stmt ( $stmt );
sqlsrv_close ( $conn );
header ( "Content-type: application/json; charset=utf-8" );
die ( json_encode ( $arr ) );
exit ();
【问题讨论】:
你应该移动 echo json_encode ( $arr );在 header(...) 之后并删除线 die(...) 没用。 你能在echo
之前用error_log(json_encode($arr));
记录数组输出吗?
@alalp:无论我尝试什么,如果没有错误,就像在这种情况下,我总是得到一个空页面。
我的意思是日志文件,而不是页面。您可以使用error_log()
方法记录许多内容。我们应该了解问题是否与数组或标题定义等其他问题有关。
【参考方案1】:
标头必须发送到输出。检查已安装的扩展(需要 php5-json)。 启用错误报告:
error_reporting(E_ALL);
【讨论】:
heeu 这与标题无关,但您的建议 error_reporting 仍然是调试问题的好主意。【参考方案2】:将标头放在 json_encode 之前。
header ( "Content-type: application/json;" );
echo json_encode ( $arr );
Returning JSON from a PHP Script
接收页面示例的错误报告。在 AJAX 的 jQuery 脚本中,我将包含如下控制台错误报告:
.fail(function( jqxhr, textStatus, error )
console.log(arguments);
var err = textStatus + ", " + error;
console.log( "Request Failed: " + err );
);
要在浏览器中查看该控制台,我经常使用 Chrome 中的“开发者工具”窗口或类似的工具。这对于调试通信中的基本错误非常宝贵。如果您处于未返回预期结果的情况,这种类型的控制台报告会有所帮助。 JSON 与 javascript 中的其他一切一样挑剔。它通常会陷入沉默。
同样,要显示返回的成功数据,您可以通过一个常见的警报框进行报告:
success: function (data)
alert(data+" was received.");
,
var_dump 该 arr 并自行运行页面;将该结果与 JSON 中的成功和失败进行比较。使用这些成功和失败的例程,您应该在空白页上查看是否返回以及返回了什么。
我注意到的另一个变化是我通常只以 echo json 编码行结束;除非您对最后一位建立一些流量控制并将其放在自己的块中,否则可能会以这种方式结束。
【讨论】:
谢谢,但我的情况并没有改变。 那个数组推送怎么样?尝试推动 $row ['name'] 而不是仅仅行?实际上,您不是将数组放入数组中吗?大多数 JSON 都是关于解析单级键/值对字符串。 是的,但很遗憾,没有任何更改。 在对 JSON 进行故障排除时,我经常使用另一个纯 PHP 程序来调用脚本。当我看到我加载到 json 命令中的值独立工作时,我就开始使用 JSON。 这是我为你准备的最好的。祝你好运。【参考方案3】:好的,我终于想通了。问题在于表格中的特殊字符。
只需将characterSet
添加到connectionInfo
即可:
$connectionInfo = array (
"Database" => "myDB",
"CharacterSet" => "UTF-8"
);
【讨论】:
以上是关于MS SQL Server 查询后返回 JSON的主要内容,如果未能解决你的问题,请参考以下文章
MS SQL Server 中的标量 UDF 在查询中仅返回一个值