我的剧本:
<?php
ob_start();
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header('Content-type: text/html; charset=utf-8');
include "tilslut.php";
$userid = $_GET["userid"];
$s = mysql_query("SELECT points, lastpoint FROM member_profile WHERE user_id = '".$userid."'");
$n = mysql_fetch_array($s);
$tid = time();
mysql_query("UPDATE member_profile set points = points+1, lastpoint=$tid WHERE lastpoint<=$tid-60 AND user_id = '".$userid."'");
$e = mysql_query("SELECT points FROM member_profile WHERE user_id = '".$userid."'");
$f = mysql_fetch_array($e);
if (mysql_affected_rows() == 1) {
$s = mysql_query("SELECT points FROM member_profile WHERE user_id = '".$userid."'");
$n = mysql_fetch_array($s);
?>
Inserted!
<?
}else{
echo "Already got";
}
ob_flush();
?>
我有这个给点。 更新查询有效,并且仅在lastpoint&lt; = time() - 60时给出点,但即使它没有插入,它仍然会说“已插入”。 我曾尝试使用受mysql影响的行来检查它是否有影响,但这似乎没有用。
答案 0 :(得分:3)
在进行另一次选择之前,必须在更新后立即调用mysql_affected_rows。 mysql_affected_rows仅适用于在连接上执行的最后一次查询。
答案 1 :(得分:3)
你是:
update
查询select
查询mysql_affected_rows
如果您在mysql_affected_rows
查询后立即调用update
,而在这些查询之间没有其他查询,则可能会更好:mysql_affected_rows
应该使用上一个查询中的数据< em> - 即使文档没有说明select
个查询,我想这可能会导致一些问题。
作为旁注:你有一些SQL注入风险,在这里:你应该在注入SQL查询(我正在考虑$_GET["userid"]
)之前转义你的数据,或者,至少,确保它是一个整数。
您应该使用更具描述性的变量名称:$e
,$f
,$n
,$s
,...这会使您的代码更难以阅读/理解/维护:-(
答案 2 :(得分:1)
你的查询
$e = mysql_query("SELECT points FROM member_profile WHERE user_id = '".$userid."'");
导致受影响的行等于1。我建议您在更新后立即检查受影响的行