2015-12-23 38 views
2

从相同函数的同一个表中获取两次会导致问题吗?使用PDO在if语句中获取

我试图从记录的用户提取所有“项目”,如果用户没有项目该函数应该返回false,否则,它应该返回false并回显“没有”,如果从数据库中的项目记录的用户应该返回true并回显所有的项目名称。 除第一个项目之外的所有东西都会被切断,所以如果用户X有项目1,2,3,4,输出将是:TwoThreeFour。

我猜是因为即时通讯使用两次从表中获取,如果是的话,我该如何解决它,所以它的工作原理?

继承人的功能:

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; 
    } 
} 
+1

是的,fetch会将行光标向前移动,因此您正确地认为这是您的问题。在我看来,如果fetch松散地等于0,那么检查是否存在任何行是一种不好的做法。 – Devon

回答

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值)