所以我有这些表格。
表:喜欢
user_id:登录的用户
post_id:用户点击的文章。
然后我有一个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;
}
我的问题:我现在如何检查用户是否已经喜欢这个帖子(在数据库之外),如果他再次按下它应该从数据库中删除他的条目,任何想法如何我可以把它变成代码吗?此外,喜欢需要绑定到帖子,例如,每个帖子都有自己喜欢的计数器/数字
答案 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;
}
作为旁注,您可以使用单个查询合并select
,delete
和exists
,您有examples here