Php 数据源在第二个while循环内不可用
我有以下Php 数据源在第二个while循环内不可用,php,mysql,stored-procedures,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()) {
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\u opt=$db->query(“调用spgetuserproductview($user\u id,$product)”)代码>
给我false
。当我在循环外尝试此语句时,它确实有效
有什么想法吗?我发现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);
现在我首先从这两个对象中生成数组
。然后我在菜单上做了一个foreach,然后在项目上做了一个foreach。当$menu[“id”]
等于$items[“id\u product”]
时,将生成包含该特定菜单项的数组
编辑
从数据库中提取数据后,我首先必须检查数组是否包含数据:
if(!empty($menus) && !empty($items)) {
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);
}
}
已经这样做了:在
中调用布尔值上的成员函数fetch_assoc(),这就是为什么我说:它给了我false
,所以查询或在本例中存储的过程失败了。或者可能名称错误,或者参数错误wrong@RiggsFollyI没有打开mysqli_报告
,谢谢!