【问题标题】:PHP json_encode & SQL server callback function returns only one resultPHP json_encode & SQL server 回调函数只返回一个结果
【发布时间】:2018-02-27 00:28:12
【问题描述】:

我正在尝试设置一个 PHP 回调函数以在我们的应用程序中使用。它需要从 SQL 服务器中提取数据,虽然我一开始可以让它工作,但它并没有达到我想要的效果。

代码:

//Callback function for passing queries

function queryCallback($conn, $query) {
  $response = sqlsrv_query($conn, $query);

  while ($row = sqlsrv_fetch_array($response)){
    if ($row === false) {
       die(print_r(sqlsrv_errors(), true));
    }
    $responseData[] = $row;
  }
  foreach($responseData as $v) {
    $output[key($v)] = current($v);
  }
  $responseDataJSON = JSON_encode($output, 128);
  return $responseDataJSON;
}

在上面,$conn 代表我们的服务器凭据,传递给 sqlsrv_connect(),$query 是包含传递给 SQL 的查询的字符串。两者都已被验证为正常工作。

问题:

此代码正确联系服务器,并运行查询,但它只返回一个结果。这显然是循环设置的问题,但我无法发现它

【问题讨论】:

  • “一个结果”总是最后一行吗? $output[key($v)] = current($v); 在我看来根本不对,你能解释一下这个结构以及你为什么要执行这个操作吗?如果您只是执行JSON_encode($responseData,128); 并跳过了那个额外的循环会发生什么?
  • 您的代码向我显示“对于每一行,获取唯一的第一列并将其设置为 $output['firstcolumnname'] 覆盖现有的设置值。
  • 这是为了解决我遇到的 JSON_encode() 从 SQL 返回每个返回值的重复项时遇到的问题。没有它,我得到的对象看起来像这样: (3303) [{...}, {...},...] [0 ... 99] 0:{0: "Person's name here", "": "Person's name here again “}。此外,返回的结果始终是表中的第一个
  • 问题不在于json_encode(),而在于您提供给它的数据。关注$output[key($v)],这段代码没有做你认为它在做的事情。
  • 我同意这一点,我需要再看看我的查询

标签: php sql json foreach callback


【解决方案1】:

我的感觉是下面的$row = sqlsrv_fetch_array($response) 将整行作为一个数组获取,但您对$output[key($v)] = current($v) 的使用只返回具有相同键的第一列,并在每次迭代时覆盖 $output 索引。

foreach($responseData as $v) {
  $output[key($v)] = current($v);
}

假设你执行了

foreach($responseData as $k => $v) {
  $output[$k] = $v;
}

此时这是多余的,因为$responseData[] 已经是这个结构了。

如果您打算只从行中提取第一列,您可能确实需要这个。

foreach($responseData as $v) {
  $output[] = current($v);
}

【讨论】:

  • 谢谢,这是一个非常好的解释 :) 看来我需要重新考虑我正在传递的查询并找出解决它正在创建的重复项的方法。
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 2015-10-08
  • 2015-09-29
  • 1970-01-01
  • 2023-02-06
  • 2012-10-17
  • 2016-02-24
  • 1970-01-01
相关资源
最近更新 更多