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中怎么查看正在执行的SQL

在MS SQL Server中怎么查看正在执行的SQL?

json-server增删改查排序小结

MS SQL Server 中的标量 UDF 在查询中仅返回一个值

在将 MS Access 拆分为 SQL Server 以执行查询后使用哪个引擎

MS SQL Server 中 JSON 函数路径中的重音字符导致错误