使用php将sql server数据转换为json

Posted

技术标签:

【中文标题】使用php将sql server数据转换为json【英文标题】:sql server data to json using php 【发布时间】:2018-05-25 13:47:30 【问题描述】:

我的 json 代码没有显示任何内容,我已经尝试了很多代码但没有任何帮助。

include('connect.php');
$sql = "SELECT *  FROM items";  
$stmt = sqlsrv_query( $conn, $sql);

if( $stmt === false)

   echo "Error in query preparation/execution.\n";  
   die( print_r( sqlsrv_errors(), true));  


while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))  //this loop is working
    
  echo $row['item_id'].", ".$row['item_name'].", ".$row['Barcode']."<br>"; 


$json = array();
do 
   while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) 
     $json[] = $row;
   
 while ( sqlsrv_next_result($stmt) );

echo json_encode($json);  //empty?!
sqlsrv_free_stmt( $stmt);

【问题讨论】:

$json = array();移动到第一个while循环之前。 每次迭代都重置数组。 @aynber 更好地格式化了代码我不认为这是问题 @OscarZarrus 更好地格式化了代码我不认为这是问题 @ADyson 不错。格式化使事情变得更容易阅读。 【参考方案1】:

这有很多可能的问题:

1) 您是否检查过您的查询实际上返回了行?

2) 您将数据循环两次(两个while( $row = sqlsrv_fetch_array... 循环),这既无用也无效率。

3) the do...while ( sqlsrv_next_result($stmt) ); 子句也应该是不必要的,因为 fetch_array 会知道它什么时候到达数据的末尾,而且你只有一个结果集,所以你不需要在它们之间移动

4) 您正在回显原始数据以及 JSON,因此如果您对该脚本进行 ajax 调用,它将失败,因为响应将部分包含非 JSON 数据

我认为这足以让您获得一些明智的数据:

include('connect.php');
$sql = "SELECT *  FROM items";  
$stmt = sqlsrv_query( $conn, $sql);

if( $stmt === false)

   echo "Error in query preparation/execution.\n";  
   die( print_r( sqlsrv_errors(), true));  


$json = array();

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
    
     $json[] = $row;


echo json_encode($json);

【讨论】:

对,我正要回答同样的问题。有一个奇怪的嵌套循环和数组重置每个语句+1 我的查询正在运行,我尝试了您的代码,但它也没有显示任何内容。 json 还是空的 @EnasAK 只是为了测试然后,在循环结束后,写var_dump($json); 它会在你的输出中显示一些结果吗?如果是这样,那么你肯定有一些数据。唯一合乎逻辑的可能性是 json_encode 操作失败。您可以轻松地对此进行测试,因为您可以检查它是否返回 false 并查看错误是什么:写 $encodedJSON = json_encode($json); if ($encodedJSON === false) echo json_last_error_msg(); else echo $encodedJSON;。请参阅php.net/manual/en/function.json-last-error-msg.php(json_last_error() 将为您提供错误 ID) 这是一个谜。您可以在每次交互时对 $row 变量进行 var_dump 吗?结果是什么?我们必须召唤驱魔人。如果 $row 是一个数组并且 echo $row['item_id'] 打印了一些东西,则必须填充 $json var。【参考方案2】:

如果有效:

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))  //this loop is working
    
  echo $row['item_id'].", ".$row['item_name'].", ".$row['Barcode']."<br>"; 

其余的也必须工作。

正如 ADyson 所说:

if( $stmt === false)

   echo "Error in query preparation/execution.\n";  
   die( print_r( sqlsrv_errors(), true));  


$json = array();

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
    
     $json[] = $row;


echo json_encode($json);

为了仔细检查,请在此代码中添加您的回声,如下所示:

if( $stmt === false)

   echo "Error in query preparation/execution.\n";  
   die( print_r( sqlsrv_errors(), true));  


$json = array();

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
    
     echo $row['item_id'].", ".$row['item_name'].", ".$row['Barcode']."<br>";
     $json[] = $row;


echo json_encode($json);

如果此代码有效,接受 ADyson 回答

【讨论】:

【参考方案3】:

这是解决问题的一种方法。希望您的查询写得很好。

$dataFinal= array();//final variable that will contain total array for json   
for($k=0;$k<count(variable_that_contents_the_resutl_array_query);$k++)

$ligne = array("item_id"=> $row['item_id'],
"item_name"=>$row['item_name'],"Barcode"=> $row['Barcode']); 
array_push($dataFinal, $ligne);//add line in array datafinal         

     //end for loop
    $result = array($dataFinal);
    $response = new Response(json_encode($dataFinal));
    $response->headers->set('Content-Type', 'application/json');
    return $response;

【讨论】:

以上是关于使用php将sql server数据转换为json的主要内容,如果未能解决你的问题,请参考以下文章

通过 PHP 将 Sql 数据库转换为具有正确格式的 JSON,并在 PHP 脚本本身中对值进行排序

将 geoJson 数据转换为 sql server 空间数据类型(GIS)

SQL Server 中的 JSON 数据

如何用C#将序列化为json的字符串导入到sql server中数据库

PHP 将 SQL 请求转换为 JSON

在 SQL Server 中读取 JSON 数据时无法从字符串转换为日期时间