Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL替换字段a等于x、字段b等于y的行_Php_Mysql_Replace_Where - Fatal编程技术网

Php MySQL替换字段a等于x、字段b等于y的行

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

我试图构建一个“新评论”功能,向用户显示自上次访问以来的新评论数量。 我构建了一个“视图”表,其中包含主题id、用户id和时间戳。在用户每次访问该主题时更新时间戳的最佳方式是什么?如果不存在,则插入新的行?目前我有:

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."')");
?>