在相同的函数中从同一个表中获取两次会导致问题吗?
我试图从已登录的用户获取所有“项目”,如果用户没有项目,该函数应返回false,否则,如果数据库中有项目,则应该返回false并回显“nothing”用户应返回true并回显所有项目名称。 一切正常,但第一项被切断,所以如果用户X有项目一,二,三,四,输出将是:TwoThreeFour。
我猜它是因为我在表格中使用了两次Fetch,如果是这样,我该如何修复它呢?
继承人的职能:
public function myitems() {
$user_user_id = $_SESSION['userSession'];
$stmt = $this->db->prepare("SELECT * FROM item WHERE user_user_id=:user_user_id");
$stmt->execute(array(":user_user_id" => $user_user_id));
if ($itemRow = $stmt->fetch(PDO::FETCH_ASSOC) == 0) {
echo "nothing";
return false;
} else {
while ($itemRow = $stmt->fetch(PDO::FETCH_ASSOC)) {
$item_item_id = $itemRow['item_id'];
$stmt2 = $this->db->prepare("SELECT * FROM picture WHERE item_item_id=:item_item_id");
$stmt2->execute(array(":item_item_id" => $item_item_id));
$imgRow = $stmt2->fetch(PDO::FETCH_ASSOC);
echo $itemRow['itemname'];
}
return true;
}
}
答案 0 :(得分:3)
当你fetch
一次时,你的指针会移动一行。因此,在按while
进行迭代时,您将无法获得第一行。您可以更好地将所有行提取到数组中并计算数组以了解数据是否存在。另外,我建议JOIN
而不是为每个item_id
运行多个查询。所以它可以是这样的:
$stmt = $this->db->prepare("SELECT * FROM item JOIN picture ON item.item_id = picture.item_item_id WHERE item.user_user_id=:user_user_id");
$stmt->execute(array(":user_user_id" => $user_user_id));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (count($rows) == 0) {
echo "nothing";
return false;
} else {
foreach ($rows as $itemRow) {
$item_item_id = $itemRow['item_id'];
//You can get your picture details also from $itemRow
echo $itemRow['itemname'];
}
return true;
}
注意:使用
LEFT OUTER JOIN
代替JOIN
,如果您希望某些项目在图片表中没有任何条目,并且您想获取数据项目至少在那种情况下。 (图片字段将在此处提供NULL
值)