数据源在第二个while循环内不可用

时间:2019-01-09 10:41:41

标签: php mysql stored-procedures

我有以下php代码:

$user_id = $user["id_user_key"];
$stmt = $db->prepare("CALL spGetUserProducts(?)");
$stmt->bind_param('i', $user_id);
$stmt->execute();
$result = $stmt->get_result();

$data = array();

while($row = $result->fetch_assoc()) {
    $row_array = array();
    $row_array["id"] = $row["id"];
    $row_array["pname"] = $row["pname"];
    $row_array["picon"] = $row["picon"];
    $row_array["menuItems"] = array();
    $product = $row["id"];
    //loop
    $result_opt = $db->query("CALL spGetUserProductViews($user_id, $product)");
    while ($opt_fet = $result_opt->fetch_assoc()) {
        $row_array["menuItems"][] = array(
            "id" => $opt_fet["id"],
            "vname" => $opt_fet["vname"],
            "isheader" => $opt_fet["isheader"]
        );
    }
    array_push($data, $row_array);
}

$stmt->close();

echo json_encode($data);

第一个循环可以保留$db,换句话说:第一个准备好的语句正在执行中,并给我结果。第二个:

$result_opt = $db->query("CALL spGetUserProductViews($user_id, $product)");

给我false。当我在循环外尝试此语句时,它确实起作用。

他有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我发现df.pivot_table('items', 'store', 'day', fill_value=0, aggfunc='count') 无法同时处理两个查询,因为df.groupby(['store', 'day']).count().unstack().fillna(0) 默认使用无缓冲查询。现在,我本可以进行深入研究(例如,使用mysqli),但是我也意识到我希望将数据库的负载保持在最低水平。

我的解决方案:

mysqli

因此,现在我首先从两个对象中生成$stmt->store-result()。然后我对菜单进行遍历,然后对各项进行遍历。当$data = array(); $user_id = $user["id_user_key"]; //menus -> products $stmt = $db->prepare("CALL spGetUserProducts(?)"); $stmt->bind_param("i", $user_id); $stmt->execute(); $result = $stmt->get_result(); $menus = array(); while($row = $result->fetch_assoc()) { $menus[] = $row; } $stmt->close(); //items -> views $stmt = $db->prepare("CALL spGetUserProductViews(?)"); $stmt->bind_param("i", $user_id); $stmt->execute(); $result = $stmt->get_result(); $items = array(); while($row = $result->fetch_assoc()) { $items[] = $row; } $stmt->close(); //generate object //loop menus foreach($menus as $m){ $row_array = array(); $row_array["id"] = $m["id"]; $row_array["pname"] = $m["pname"]; $row_array["picon"] = $m["picon"]; $row_array["menuItems"] = array(); //loop items foreach($items as $i) { if($m["id"] == $i["id_product"]) { $row_array["menuItems"][] = array( "id" => $i["id"], "vname" => $i["vname"], "isheader" => $i["isheader"] ); } } array_push($data, $row_array); } echo json_encode($data); 等于arrays时,将生成带有该特定菜单项的$menu["id"]

编辑

从数据库中提取数据后,我首先必须检查$items["id_product"]是否包含数据:

array