php - 使用户能够收藏帖子

Posted

技术标签:

【中文标题】php - 使用户能够收藏帖子【英文标题】:php - Enabling users to favorite posts 【发布时间】:2014-04-30 06:27:18 【问题描述】:

在我的网站上,我想允许用户收藏帖子。登录的用户被定向到显示所有帖子的页面,在每个帖子下我放置了一个指向收藏夹的超链接。我希望文本从收藏变为收藏,反之亦然。我该怎么做?

HTML 和 PHP

<?php
session_start();
require_once('connection.php');

mysql_select_db($database_connection, $connection);
$query_favorite = "SELECT username, post_id FROM favorite";
$favorite = mysql_query($query_favorite, $connection) or die(mysql_error());
$row_favorite = mysql_fetch_assoc($favorite);
$totalRows_favorite = mysql_num_rows($favorite);
?>

<a href="#" class="favourite">Favourite</a>

我的数据库中的表

CREATE TABLE `user` (
  `username` varchar(45) NOT NULL,
  `email` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  `profilepic` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `post` (
  `post_id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `dato` date NOT NULL,
  `category` varchar(100) NOT NULL,
  `description` varchar(500) NOT NULL,
  `text` longtext NOT NULL,
  PRIMARY KEY (`post_id`),
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

CREATE TABLE `favorite` (
  `username` varchar(45) NOT NULL,
  `post_id` int(11) NOT NULL,
  PRIMARY KEY (`username`,`post_id`),
  KEY `fk_favorite_post1_idx` (`post_id`),
  CONSTRAINT `fk_favorite_user` FOREIGN KEY (`username`) REFERENCES `user` (`username`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_favorite_post1` FOREIGN KEY (`post_id`) REFERENCES `post` (`post_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8

【问题讨论】:

【参考方案1】:

PHP

<?php
session_start();
require_once('connection.php');

mysql_select_db($database_connection, $connection);
$query_favorite = "SELECT username, post_id FROM favorite";
$favorite = mysql_query($query_favorite, $connection) or die(mysql_error());
$row_favorite = mysql_fetch_assoc($favorite);
$totalRows_favorite = mysql_num_rows($favorite);

if(in_array($_POST['id'], $row_favorite))

   //is already favourited, run a query to remove that row from the db, so it won't be favorited anymore


else

   //post is not favourited already, run a query to add a new favourite to the db.


?>

html

<a href="#" class="favourite" data-id="<?php echo $post_id; ?>">Favourite</a>

jQuery

$(document).ready(function() 
    $('.favourite').on('click', null, function() 
        var _this = $(this);
        var post_id = _this.data('id');
        $.ajax(
          type     : 'POST',
          url      : '/file.php',
          dataType : 'json',
          data     : 'id='+ post_id,
          complete : function(data) 
               if(_this.siblings('.typcn-star-outline'))
               
                 _this.html('<span class="typcn typcn-star-full-outline"></span>Favourite');
               
               else
               
                 _this.html('<span class="typcn typcn-star-outline"></span>Favourited');
               
            
        );
    );
);

另外,请注意 PHP 中的 mysql_* 函数已被弃用并且使用起来不安全(它们允许 SQL 注入攻击)。在此处了解有关 PDO 的更多信息:http://code.tutsplus.com/tutorials/why-you-should-be-using-phps-pdo-for-database-access--net-12059

【讨论】:

谢谢!我没有提到这一点,但我使用了 typicons,以便在“收藏”文本旁边有一个星号(满为收藏的帖子,为未收藏的帖子加上轮廓) - &lt;a href="#" class="favourite"&gt;&lt;span class="typcn typcn-star-full-outline"&gt;&lt;/span&gt;Favourite&lt;/a&gt;&lt;a href="#" class="favourite"&gt;&lt;span class="typcn typcn-star-outline"&gt;&lt;/span&gt;Favourite&lt;/a&gt;。如果我想把它包括在内,那是否意味着很大的复杂性?如果没有,你能编辑你的答案吗? :) 我真的很感激! 我已经编辑了我的答案。稍微玩一下 if 语句。我不太确定哪个 typicon 意味着哪个。但是,这将是一个好的开始。如果您满意,请不要忘记接受我的回答:)。 谢谢!我还想知道这段代码是否会将有关收藏帖子的数据发送到我的数据库? 另外,第一个代码(没有 typicons)工作正常,但新代码只收藏了没有启用“取消收藏”。这是为什么呢? 尝试更改 jQuery if 语句中的 typcn-star-outline 和 typcn-star-full-outline。我已经更新了您上面的代码,让您开始使用 PHP。您需要在锚标记中添加一个 data-id 属性,这样当您使用 AJAX 发送到 PHP 时,PHP 会知道您想要收藏哪个帖子。

以上是关于php - 使用户能够收藏帖子的主要内容,如果未能解决你的问题,请参考以下文章

如何将项目/帖子添加到收藏夹

nosql 表上非常简单的关系的最佳实践

php 更改重力表单管理权限,使作者能够导出或编辑表单

php 使单个帖子和页面标题也链接到他们的URL(有人说这对SEO有好处,但是它不能成为好的用户体验我会说......)

推特和脸书的帖子可以链接吗?

灵活运用分布式锁解决数据重复插入问题