我正在尝试构建一个“新评论”功能,向用户显示自上次访问以来新评论的数量。 我构建了一个'Views'表,其中包含主题id,用户ID和时间戳。每次用户访问该主题或插入新行(如果不存在)时,更新时间戳的最佳方法是什么?目前我有:
REPLACE INTO Views (MemberID, TopicID, Visited)
SET ('$_SESSION[SESS_MEMBER_ID]', '$threadid', '$t')
WHERE MemberID = $_SESSION[SESS_MEMBER_ID] AND TopicID = $threadid
然而,这不起作用。是否可以在一个查询中执行此操作?
答案 0 :(得分:1)
尝试将SET
替换为VALUES
。语法是:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
修改:请注意,只有将MemberID
和TopicID
设置为表格中的唯一键时,才能生效。如果你这样做,那么你应该能够做到:
REPLACE INTO Views (MemberID, TopicID, Visited)
VALUES ('$_SESSION[SESS_MEMBER_ID]', '$threadid', '$t')
或
INSERT INTO Views (MemberID, TopicID, Visited)
VALUES ('$_SESSION[SESS_MEMBER_ID]', '$threadid', '$t')
ON DUPLICATE KEY UPDATE Visited = '$t'
(当然,你应该使用适当的占位符,所以Little Bobby Tables不会访问并破坏你的数据库)
答案 1 :(得分:0)
我想不出只有一个查询的方法,但你可以试试这个:
<?php
$where = "where `MemberID`=".$_SESSION['SESS_MEMBER_ID']." and `TopicID`=".$threadid;
if( mysql_fetch_assoc( mysql_query( "select * from `Views` ".$where)))
mysql_query( "update `Views` set `Visited`='".$t."' ".$where);
else
mysql_query( "insert into `Views` (`MemberID`, `TopicID`, `Visited`) values ('".$_SESSION['SESS_MEMBER_ID']."', '".$threadid."', '".$t."')");
?>
这将总共运行两个查询。
答案 2 :(得分:0)
如果您使用的是TIMESTAMP
数据类型,则每次更改行时它都会自动更新。因此,只需在行上调用update(如果存在,否则创建它)并仅更改topicId。数据库将处理更改时间。
真的,我不会使用REPLACE。相反,也许您可以创建一个存储过程来检查该行是否存在(只传递memberId和topicId),如果没有则创建它,然后将时间戳返回给您。这更有意义。
使用存储过程只意味着一次访问数据库。