Php 如何将PDO::FETCH_NUM正确格式化为JSON结果

Php 如何将PDO::FETCH_NUM正确格式化为JSON结果,php,json,pdo,Php,Json,Pdo,我返回一个JSON文档,如下所示: ug_gpid: [[4], [2], [3]] 这不是预期的格式,我想要: ug_gpid: [4, 2, 3] 这是我的代码: $user=json\u解码($resp,true); $sql=“从用户组中选择ug_gpid,其中ug_usid=:id和ug_状态=1”; 试一试{ $db=getConnection(); $stmt=$db->prepare($sql); foreach($user as$item=>$value){ $newUse

我返回一个JSON文档,如下所示:

ug_gpid: [[4], [2], [3]]
这不是预期的格式,我想要:

ug_gpid: [4, 2, 3]
这是我的代码:

$user=json\u解码($resp,true);
$sql=“从用户组中选择ug_gpid,其中ug_usid=:id和ug_状态=1”;
试一试{
$db=getConnection();
$stmt=$db->prepare($sql);
foreach($user as$item=>$value){
$newUser[$item]=$value;
$stmt->bindParam(“id”,$value[“us_id”);
$stmt->execute();
$ugroup=$stmt->fetchAll(PDO::FETCH_NUM);
$newUser[$item]['ug_gpid']=$ugroup;
}
$db=null;
$response=$app->response();
$response->header('Content-Type','application/json');
echo json_encode($newUser,json_NUMERIC_CHECK);
}渔获量{
$error=array(“queryGroupError”=>array(“text”=>$e->getMessage());
echo json_编码($error);
}

我将结果存储在
$ugroup
中。如何实现所需的输出?

问题在于
PDOStatement::fetchAll
返回一个数组数组。您希望构建单个值的平面数组

我会用这个来代替

$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $us_id);
foreach ($user as $item => $value) {
    $newUser[$item] = $value;
    $us_id = $value['us_id']; // this is for the bind
    $stmt->execute();
    while ($gpid = $stmt->fetchColumn()) {
        $newUser[$item]['ug_gpid'][] = $gpid;
    }
}

问题是
PDOStatement::fetchAll
返回一个数组数组。您希望构建单个值的平面数组

我会用这个来代替

$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $us_id);
foreach ($user as $item => $value) {
    $newUser[$item] = $value;
    $us_id = $value['us_id']; // this is for the bind
    $stmt->execute();
    while ($gpid = $stmt->fetchColumn()) {
        $newUser[$item]['ug_gpid'][] = $gpid;
    }
}

问题是
PDOStatement::fetchAll
返回一个数组数组。您希望构建单个值的平面数组

我会用这个来代替

$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $us_id);
foreach ($user as $item => $value) {
    $newUser[$item] = $value;
    $us_id = $value['us_id']; // this is for the bind
    $stmt->execute();
    while ($gpid = $stmt->fetchColumn()) {
        $newUser[$item]['ug_gpid'][] = $gpid;
    }
}

问题是
PDOStatement::fetchAll
返回一个数组数组。您希望构建单个值的平面数组

我会用这个来代替

$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $us_id);
foreach ($user as $item => $value) {
    $newUser[$item] = $value;
    $us_id = $value['us_id']; // this is for the bind
    $stmt->execute();
    while ($gpid = $stmt->fetchColumn()) {
        $newUser[$item]['ug_gpid'][] = $gpid;
    }
}

它不能如预期那样工作的原因已经得到了回答;但是,使用单个查询会更有效:

$sql = sprintf(
    "SELECT ug_usid, GROUP_CONCAT(ug_gpid)
       FROM user_group 
       WHERE ug_usid IN (%s) AND ug_status = 1
       GROUP BY ug_usid",
    str_pad('?', count($user) * 2 - 1, ',?');
);

// ...

// run query and build search result map
$stmt = $db->prepare($sql);
$stmt->execute(array_column($user, 'us_id'));
$groups = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);

// extend user information with search results
array_walk($user, function(&$u) use ($groups) {
    if (isset($groups[$user['us_id']])) {
        $u['ug_gpid'] = explode(',', $groups[$user['us_id']]);
    } else {
        $u['ug_gpid'] = [];
    }
});

echo json_encode($user, JSON_NUMERIC_CHECK);

请注意,它假设您使用MySQL作为数据库引擎,因为它使用的是SQL的MySQL扩展
GROUP\u CONCAT

它不能按预期工作的原因已经得到了回答;但是,使用单个查询会更有效:

$sql = sprintf(
    "SELECT ug_usid, GROUP_CONCAT(ug_gpid)
       FROM user_group 
       WHERE ug_usid IN (%s) AND ug_status = 1
       GROUP BY ug_usid",
    str_pad('?', count($user) * 2 - 1, ',?');
);

// ...

// run query and build search result map
$stmt = $db->prepare($sql);
$stmt->execute(array_column($user, 'us_id'));
$groups = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);

// extend user information with search results
array_walk($user, function(&$u) use ($groups) {
    if (isset($groups[$user['us_id']])) {
        $u['ug_gpid'] = explode(',', $groups[$user['us_id']]);
    } else {
        $u['ug_gpid'] = [];
    }
});

echo json_encode($user, JSON_NUMERIC_CHECK);

请注意,它假设您使用MySQL作为数据库引擎,因为它使用的是SQL的MySQL扩展
GROUP\u CONCAT

它不能按预期工作的原因已经得到了回答;但是,使用单个查询会更有效:

$sql = sprintf(
    "SELECT ug_usid, GROUP_CONCAT(ug_gpid)
       FROM user_group 
       WHERE ug_usid IN (%s) AND ug_status = 1
       GROUP BY ug_usid",
    str_pad('?', count($user) * 2 - 1, ',?');
);

// ...

// run query and build search result map
$stmt = $db->prepare($sql);
$stmt->execute(array_column($user, 'us_id'));
$groups = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);

// extend user information with search results
array_walk($user, function(&$u) use ($groups) {
    if (isset($groups[$user['us_id']])) {
        $u['ug_gpid'] = explode(',', $groups[$user['us_id']]);
    } else {
        $u['ug_gpid'] = [];
    }
});

echo json_encode($user, JSON_NUMERIC_CHECK);

请注意,它假设您使用MySQL作为数据库引擎,因为它使用的是SQL的MySQL扩展
GROUP\u CONCAT

它不能按预期工作的原因已经得到了回答;但是,使用单个查询会更有效:

$sql = sprintf(
    "SELECT ug_usid, GROUP_CONCAT(ug_gpid)
       FROM user_group 
       WHERE ug_usid IN (%s) AND ug_status = 1
       GROUP BY ug_usid",
    str_pad('?', count($user) * 2 - 1, ',?');
);

// ...

// run query and build search result map
$stmt = $db->prepare($sql);
$stmt->execute(array_column($user, 'us_id'));
$groups = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);

// extend user information with search results
array_walk($user, function(&$u) use ($groups) {
    if (isset($groups[$user['us_id']])) {
        $u['ug_gpid'] = explode(',', $groups[$user['us_id']]);
    } else {
        $u['ug_gpid'] = [];
    }
});

echo json_encode($user, JSON_NUMERIC_CHECK);



注意,它假设您使用MySQL作为数据库引擎,因为它使用的是SQL的MySQL扩展
GROUP\u CONCAT

这只会返回
[4]
,而不是
[4,2,3]
@MuhaiminAbdul-Oops,我稍微误解了您的代码。多亏了你@phil,现在应该可以修好了。我修改了你的代码。你救了我一天。。感谢你,这可能是一个基于先前内容版本的dv;向上投票。@Jack没有,它在最终编辑后很久才出现。我怀疑drive by downvoter是否会回来评论这只会返回
[4]
而不是
[4,2,3]
@MuhaiminAbdul噢,我有点误解了你的代码。多亏了你@phil,现在应该可以修好了。我修改了你的代码。你救了我一天。。感谢你,这可能是一个基于先前内容版本的dv;向上投票。@Jack没有,它在最终编辑后很久才出现。我怀疑drive by downvoter是否会回来评论这只会返回
[4]
而不是
[4,2,3]
@MuhaiminAbdul噢,我有点误解了你的代码。多亏了你@phil,现在应该可以修好了。我修改了你的代码。你救了我一天。。感谢你,这可能是一个基于先前内容版本的dv;向上投票。@Jack没有,它在最终编辑后很久才出现。我怀疑drive by downvoter是否会回来评论这只会返回
[4]
而不是
[4,2,3]
@MuhaiminAbdul噢,我有点误解了你的代码。多亏了你@phil,现在应该可以修好了。我修改了你的代码。你救了我一天。。感谢你,这可能是一个基于先前内容版本的dv;向上投票。@Jack没有,它在最终编辑后很久才出现。我怀疑drive by downvoter是否会回来并考虑在
catch
块中返回HTTP错误状态代码(4xx/5xx)。这样,任何API客户机都可以更好地捕获错误,请考虑在
catch
块中返回HTTP错误状态代码(4xx/5xx)。这样,任何API客户机都可以更好地捕获错误,请考虑在
catch
块中返回HTTP错误状态代码(4xx/5xx)。这样,任何API客户机都可以更好地捕获错误,请考虑在
catch
块中返回HTTP错误状态代码(4xx/5xx)。这样,任何API客户端都可以更好地捕获错误hanks@Jack。你的比菲尔的稍微长一点。除非你说你的表现更好。谢谢again@MuhaiminAbdul从理论上讲,性能应该比多个查询更好,但只有一个基准才能给出最终的结论。实际上,我希望看到一个基准。我感觉数组和字符串函数所涉及的额外处理时间可能会降低单次查询的好处。准备好的语句经过优化,可以在AllThank@Jack之后循环运行。你的比菲尔的稍微长一点。除非你说你的表现更好。谢谢again@MuhaiminAbdul从理论上讲,性能应该比多个查询更好,但只有一个基准才能给出最终的结论。实际上,我希望看到一个基准。我感觉数组和字符串函数所涉及的额外处理时间可能会降低单次查询的好处。准备好的语句经过优化,可以在AllThank@Jack之后循环运行。你的比菲尔的稍微长一点。除非你说的是你的