mysqli_connection上的json_encode vs var_dump

时间:2017-10-07 13:31:38

标签: php json

我们有一个$link变量,如下所示:

$link = mysqli_connect('localhost', 'user', 'pass', 'db');

var_dump($link);返回键的正确值:

["affected_rows"]=>  int(0)
["client_info"]=> string(79) "mysqlnd 5.0.11-dev - ..."
["client_version"]=> int(50011)
...

json_encode($link)返回所有空值:

"affected_rows": null,
"client_info": null,
"client_version": null,
...

有没有办法让json_encoded字符串具有相同的值?

2 个答案:

答案 0 :(得分:1)

来自official documentation

  

参数

     

     

正在编码的值。可以是除资源之外的任何类型。

您提供的$linkresource

source code来看,似乎对于不受支持的类型(如资源),它会产生"null"值:

    default:
        encoder->error_code = PHP_JSON_ERROR_UNSUPPORTED_TYPE;
        if (options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR) {
            smart_str_appendl(buf, "null", 4);
   }

答案 1 :(得分:0)

我希望有人这样做并且可以分享解决方案。到目前为止还没有解决方案,所以我试了一下。

正如@rkosegi所指出的那样,$link是一种资源。因此,我们应该期待以下内容:

  

var_export会将资源投射到数组(mysqli::__set_state) - 所以再次null   foreach也将其视为一个数组,并为我们提供null个   var_dump可以获取值(but could not be easily captured
  但是,print_r为我们提供了价值并可以保存

所以,让我们使用print_r

$raw = print_r($link, true);

通过一些字符串解析,我们可以得到我们想要的东西。

更新 - 添加字符串解析并提出警告(error_list):

$link = mysqli_connect('localhost', 'root', 'lilo123', 'm1_s1');
$raw = print_r($link, true);
$raw = explode(PHP_EOL, $raw);
$link_arr = [];
foreach($link as $k => $v) {
  $match = array_filter($raw, function($var) use ($k) { return strpos($var, '['.$k.']'); });
  $val = array_values($match)[0];
  if(strpos($val, ' => ')) {
    $val = explode(' => ', $val)[1];
    $link_arr[$k] = $val;
  }
}
$link_json = json_encode($link_arr, JSON_PRETTY_PRINT);
echo $link_json;

输出:

{
    "affected_rows": "0",
    "client_info": "mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $",
    "client_version": "50011",
    "connect_errno": "0",
    "connect_error": "",
    "errno": "0",
    "error": "",
    "error_list": "Array", <-- no good
    "field_count": "0",
    "host_info": "Localhost via UNIX socket",
    "info": "",
    "insert_id": "0",
    "server_info": "5.7.19-0ubuntu0.16.04.1",
    "server_version": "50719",
    "stat": "Uptime: 52396  Threads: 1  Questions: 36754  Slow queries: 0  Opens: 133  Flush tables: 1  Open tables: 60  Queries per second avg: 0.701",
    "sqlstate": "00000",
    "protocol_version": "10",
    "thread_id": "5274",
    "warning_count": "0"
}