PHP受影响的行= 1将无法正常工作

时间:2010-02-15 19:54:13

标签: php mysql

我的剧本:

<?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影响的行来检查它是否有影响,但这似乎没有用。

3 个答案:

答案 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。我建议您在更新后立即检查受影响的行