我们有一个$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字符串具有相同的值?
答案 0 :(得分:1)
参数
值
正在编码的值。可以是除资源之外的任何类型。
您提供的$link
是resource
从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"
}