一个'谁用过它'的问题

时间:2010-01-28 14:15:03

标签: php mysql

好的......所以,我遇到了以下问题:我有一个表格可以正常工作 - 它包含用户的ID,帖子的ID,帖子的内容,帖子发布的时间。

我用它打印出以下内容:帖子的内容,帖子的作者以及帖子的制作时间。到目前为止一切正常。

现在......我有一个按钮,允许用户为某个帖子投票 - 一切都在这里工作得很好。但是,现在我想再制作一个能够显示谁和何时投票的功能。你知道,所以在每个帖子下面会有一个喜欢这个帖子的人列表以及他们什么时候按了按钮。

我的想法是有两个表 - 一个持有帖子的信息 post_table ,还有一个表 voted_table 将拥有用户ID,按钮的时间是按下并且 post_id 表示投票已经完成......但我不知道如何实际投票。 我的问题几乎就是:

如何从另一个表中插入表信息+点击按钮的其他信息?

3 个答案:

答案 0 :(得分:1)

如果您的数据库支持事务,则可以。在mysql中查找关键字BEGIN COMMIT和ABORT。但是,如果这样做,您将在两个地方存储数据。

或者,您可以将您的投票总数存储在voted_table中,并且您可以更改您的第一个查询以加入到voted_table以计算投票。

select P.post_id, sum(V.votes) # add other post_table fields
from post_table as P, voted_table as V
where P.post_id=V.post_id
group by P.post_id #add other post_table fields you need here also

答案 1 :(得分:1)

CREATE TABLE `user` (
  `id` INTEGER UNSIGNED NOT NULL auto_increment,
  `username` varchar(32) default NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE `post` (
  `id` INTEGER UNSIGNED NOT NULL auto_increment,
  `owner_id` INTEGER UNSIGNED default NULL,
  `content` TEXT default NULL,
 PRIMARY KEY (`id`),
 KEY `post_I_owner` (`owner_id`),
 CONSTRAINT `post_FK_user`
   FOREIGN KEY (`owner_id`)
   REFERENCES `user` (`id`)
   ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE `vote` (
  `id` INTEGER UNSIGNED NOT NULL auto_increment,
  `user_id` INTEGER UNSIGNED default NULL,
  `post_id` INTEGER UNSIGNED,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`),
   UNIQUE KEY `vote_IU_user_post` (`user_id`,`post_id`),
   CONSTRAINT `vote_FK_user`
     FOREIGN KEY (`user_id`)
     REFERENCES  `user` (`id`)
     ON DELETE SET NULL,
   CONSTRAINT `vote_FK_post`
     FOREIGN KEY (`post_id`)
     REFERENCES  `post` (`id`)
     ON DELETE CASCADE
) ENGINE=InnoDB;

因此,使用上面的架构,我们可以执行以下操作...

在您的html / php中,您可以拥有viewPost页面

<form name="vote_form" action="postVote.php" method="POST">
  <input type="hidden" name="post_id" value="1" />
  <input type="submit" value="Vote for this Post" />
</form>

然后在votePost.php中,您可以执行以下操作:

if(isset($_SESSION['user']['user_id']))
{
   $userid = $_SESSION['user']['user_id'];
}
else
{
  // redirect to a login or something
}

$sql = "INSERT INTO vote (user_id, post_id) VALUES (%s,%s)"
$sql = sprintf($sql, $userid, $_POST['post_id']);
mysql_query($sql);

这样mysql会为你处理时间戳。请注意,在将输入数据插入数据库以及所有有趣的安全性内容之前,您需要验证/验证输入数据(我在这里没有真正做过)。我还建议使用Mysqli或PDO Mysql而不是旧的mysql库,并使用准备好的stament(它将自己处理大部分值的quouting / escaping功能)

答案 2 :(得分:1)

要在用户单击按钮时运行插入查询,您需要一个移动部件。首先,您需要使用按钮添加表单。您需要使用“隐藏”字段(post_id和user_id)向表单添加足够的信息,除非您可以从其他地方获取该信息。您必须将表单上的操作设置为另一个PHP页面。在第二个PHP页面上,您将获得指定的表单变量并使用它来生成插入查询。 (您应该考虑安全问题,比如信任user_id的值并检查用户输入,但我不会进入。)如果您在表单上使用method =“POST”,那么您将获得$ _POST的值[$ formFieldName]。