SQL / PHP - 检查用户是否已经喜欢发帖,如果是的话不同?

时间:2018-05-03 13:51:33

标签: php sql ajax pdo

所以我有这些表格。

表:喜欢

user_id:登录的用户

post_id:用户点击的文章。

enter image description here

然后我有一个Like.class.php,它存储getter和setter以及函数。

我现在有两个, Addlike(); 输入id(自动增量)以及他喜欢的文章/帖子的user_id和post_id。

Countlike();使用所有行的简单rowCount();对条目进行计数。

public function Addlike($postid){

        $conn = db::getInstance();
        $query = "insert into likes (post_id, user_id) values (:post_id, :user_id)";
        $statement = $conn->prepare($query);
        $statement->bindValue(':post_id',$postid);
        $statement->bindValue(':user_id',$this->getUserId());
        $statement->execute();
        $result = $statement->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }

    public static function Countlike(){
        $conn = db::getInstance();
        $statement = $conn->prepare("SELECT * from likes");
        $statement->execute();
        $likecount =  $statement->rowCount();
        return $likecount;
    }

我的问题:我现在如何检查用户是否已经喜欢这个帖子(在数据库之外),如果他再次按下它应该从数据库中删除他的条目,任何想法如何我可以把它变成代码吗?此外,喜欢需要绑定到帖子,例如,每个帖子都有自己喜欢的计数器/数字

2 个答案:

答案 0 :(得分:1)

您可以在数据库中查看

SELECT COUNT(*) FROM likes WHERE post_id=:post_id AND user_id=:user_id

另一种方法是写入COOKIES或用户喜欢的帖子的更好的Web存储ID。

更多代码:

private function Addlike($postid){
    $conn = db::getInstance();
    $query = "insert into likes (post_id, user_id) values (:post_id, :user_id)";
    $statement = $conn->prepare($query);
    $statement->bindValue(':post_id',$postid);
    $statement->bindValue(':user_id',$this->getUserId());
    $statement->execute();
}
private function Deletelike($postid){
    $conn = db::getInstance();
    $query = "DELETE FROM likes WHERE post_id = :post_id AND user_id =:user_id";
    $statement = $conn->prepare($query);
    $statement->bindValue(':post_id',$postid);
    $statement->bindValue(':user_id',$this->getUserId());
    $statement->execute();
}

public function CheckLike($postid){
    $conn = db::getInstance();
    $query = "LECT COUNT(*) FROM likes WHERE post_id=:post_id AND user_id=:user_id";
    $statement = $conn->prepare($query);
    $statement->bindValue(':post_id',$postid);
    $statement->bindValue(':user_id',$this->getUserId());
    $statement->execute();
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
    if($result["COUNT(*)"] == 0){
        $this->Addlike($postid);
    }else{
        $this->Deletelike($postid);
    }
    return $result;
}

答案 1 :(得分:0)

正如我在评论中所说,最简单的SQL术语是使用2个单独的查询。对于您的用例,这应该没问题,查询不处理多行/值。

在您的查询之后实际上应该进行一些验证,如果您有SQL错误,我还没有添加它们。

注意:在良好实践中,以大写字母开头的名称通常是为类保留的,函数通常是驼峰式的,如下所示:

public function delLike($postid){
    $conn = db::getInstance();
    $query = "SELECT id from likes WHERE post_id=:post_id AND user_id=:user_id";
    $statement = $conn->prepare($query);
    $statement->bindValue(':post_id',$postid);
    $statement->bindValue(':user_id',$this->getUserId());
    $statement->execute();
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
    //there should be only one result at this point
    if(!empty($result)){
        $query = "DELETE from likes WHERE id=:id";
        $statement = $conn->prepare($query);
        $statement->bindValue(':id',$result[0]['id']);
        $statement->execute();
        return true;
    }
    return false;
}

作为旁注,您可以使用单个查询合并selectdeleteexists,您有examples here