Php MySQL替换字段a等于x、字段b等于y的行
我试图构建一个“新评论”功能,向用户显示自上次访问以来的新评论数量。 我构建了一个“视图”表,其中包含主题id、用户id和时间戳。在用户每次访问该主题时更新时间戳的最佳方式是什么?如果不存在,则插入新的行?目前我有:Php MySQL替换字段a等于x、字段b等于y的行,php,mysql,replace,where,Php,Mysql,Replace,Where,我试图构建一个“新评论”功能,向用户显示自上次访问以来的新评论数量。 我构建了一个“视图”表,其中包含主题id、用户id和时间戳。在用户每次访问该主题时更新时间戳的最佳方式是什么?如果不存在,则插入新的行?目前我有: REPLACE INTO Views (MemberID, TopicID, Visited) SET ('$_SESSION[SESS_MEMBER_ID]', '$threadid', '$t') WHERE MemberID = $_SESSION[SESS_MEMBER_I
REPLACE INTO Views (MemberID, TopicID, Visited)
SET ('$_SESSION[SESS_MEMBER_ID]', '$threadid', '$t')
WHERE MemberID = $_SESSION[SESS_MEMBER_ID] AND TopicID = $threadid
然而,这是行不通的。是否可以在一个查询中执行此操作?尝试用
值替换设置。语法是:
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')
或
(当然,您应该使用适当的占位符,这样小Bobby Tables就不会访问并破坏您的数据库)我想不出只使用一个查询的方法,但您可以尝试以下方法:
<?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."')");
?>
如果您使用的是时间戳
数据类型,它将在每次更改行时自动更新自身。因此,只需在行上调用update(如果它存在,则创建它)并只更改topicId。数据库将处理更改时间的操作
真的,我不会用替换。相反,您可以创建一个存储过程来检查行是否存在(只需传递memberId和topicId),如果不存在,则创建它,然后将时间戳返回给您。这更有意义
使用存储的proc意味着只需要一次数据库访问。我尝试了第二次,它只是不断添加行,而不是替换行。我还尝试了“在重复键上更新MemberID=”$\u会话[SESS\u MEMBER\u ID]”,TopicID=“$threadid”。@Miles:您需要先将这两个键设置为表上的组合唯一键。然后,如果您尝试插入一个具有相同唯一键的行,它将更新已访问的
的值,而不是抛出错误。因此,您是说最好有多个查询,一个检查是否存在,然后一个更新是否存在,如果不存在则插入?我可以这样做如果。。。除此之外,我认为如果有一种方法可以在一个查询中完成,那么效率会更高
<?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."')");
?>