Php 根据愿望列表是公共的还是私有的以及愿望列表中是否有0个或多个项目来显示内容

Php 根据愿望列表是公共的还是私有的以及愿望列表中是否有0个或多个项目来显示内容,php,pdo,Php,Pdo,因此,用户可以在一个愿望列表中添加项目。他们也可以选择它是公共的还是私人的。 $wishlistipublic表示1是公共的,0是私有的。 我想要的是根据这些条件显示不同的消息。 我的代码: 因此,首先,如果它是公共的,并且愿望列表中有超过0项,那么我将显示它。这很有效 如果愿望列表是私有的,它会说它是私有的。这很有效 出现问题的地方是当我检查是否有超过0个项目时,参考我的$itemCount变量 如果超过0,则将显示它们。如果有0,我想说它是空的。但是,如果愿望列表是公共的,$itemCoun

因此,用户可以在一个愿望列表中添加项目。他们也可以选择它是公共的还是私人的。 $wishlistipublic表示1是公共的,0是私有的。 我想要的是根据这些条件显示不同的消息。 我的代码:

因此,首先,如果它是公共的,并且愿望列表中有超过0项,那么我将显示它。这很有效

如果愿望列表是私有的,它会说它是私有的。这很有效

出现问题的地方是当我检查是否有超过0个项目时,参考我的$itemCount变量

如果超过0,则将显示它们。如果有0,我想说它是空的。但是,如果愿望列表是公共的,$itemCount为0,则不会显示该else语句。据说愿望清单是私人的

所以我从来没有把这件事表现出来:

else {
 echo "<div class='alert alert-info'>No items in wishlist</div>";
}

不能使用联接来显示此信息

在内部连接的情况下,当没有项目时,将没有关于愿望列表是公共的还是私有的信息。 如果是LEFT LEFT,则在没有项目的情况下,结果中将有一个假阳性行

因此,您必须运行两个查询

$sql = "SELECT wishlistIsPublic FROM oopphp_users WHERE userID = ?";
$stmt = $this->connect->prepare($sql);
$stmt->execute([$userID]);
$wishlistisPublic = $stmt->fetchColumn();

$sql = "SELECT * FROM oopphp_wishlist WHERE userID_fk = ? ORDER BY itemID_fk ASC";
$stmt = $this->connect->prepare($sql);
$stmt->execute([$userID]);
$results = $stmt->fetchAll();


if($wishlistisPublic) {
    if($results) {
        echo "<h1 class='w-100'>There are {$itemCount} items on this users wishlist</h1>";
        foreach ($results as $row) {
             // display results
        }
    } else {
        echo "<div class='alert alert-info'>No items in wishlist</div>";
    }
} else {
    echo "<div class='alert alert-info'>This user has set their wishlist to private.</div>";
}

请注意,您不应多次调用connect。单个连接只能建立一次,然后用于执行脚本中的所有查询

最好使用$itemCount=count$results;我尝试了count,但它有确切的结果@Nigelrenbasic你在这里做什么都是错的。您不能获取包含所有行的数组,同时只能从单个行中单独获取单个列。您应该坚持使用fetchAll,然后从中获取所有信息。用户的愿望列表中可以同时包含私人和公共项目吗?WishListSpulic列属于哪个表?整个wishlist是公共的还是私有的。wishlistIsPublic属于用户表。带有愿望列表的桌子是一张单独的桌子。这就完成了。在此之前,我尝试使用$wishlistipublic和$itemCount进行打印。基本上,如果愿望列表是私有的,那么它是空的,而不是我所期望的0。这可能就是您的意思,因为我尝试获取所有行和1个特定行,所以您无法获取一个包含所有行的数组,同时只能从单个行中单独获取一列。现在$wishlistipublic正确显示1或0。我做到了:$pdo=$this->connect;为了避免多次打电话给connect。如果你不介意我问的话,我有个问题。我看到您编写了$stmt->execute[$userID];我个人更喜欢为自己编写bindParam,并有一个空的execute。因此,我将第一个查询编辑为$stmt->bindParam1,$userID,PDO::PARAM_INT;还有bindColumn:$stmt->bindColumn'wishlistipublic',$wishlistipublic,PDO::PARAM_INT;。我还使用$results更改了第一次获取,而不是使用fetchColumn更改了$wishlistipublic。它似乎有完全相同的结果。只是想知道是否有原因不使用bindColumn,以及您是否认为这看起来足够好。如果您不介意编写两到三次超出需要的代码,那么您可以使用您最喜欢的方法。在结果方面没有区别。
$sql = "SELECT wishlistIsPublic FROM oopphp_users WHERE userID = ?";
$stmt = $this->connect->prepare($sql);
$stmt->execute([$userID]);
$wishlistisPublic = $stmt->fetchColumn();

$sql = "SELECT * FROM oopphp_wishlist WHERE userID_fk = ? ORDER BY itemID_fk ASC";
$stmt = $this->connect->prepare($sql);
$stmt->execute([$userID]);
$results = $stmt->fetchAll();


if($wishlistisPublic) {
    if($results) {
        echo "<h1 class='w-100'>There are {$itemCount} items on this users wishlist</h1>";
        foreach ($results as $row) {
             // display results
        }
    } else {
        echo "<div class='alert alert-info'>No items in wishlist</div>";
    }
} else {
    echo "<div class='alert alert-info'>This user has set their wishlist to private.</div>";
}