即使更新实际发生,mysql_affected_rows()也会为UPDATE语句返回0

时间:2012-02-22 15:03:56

标签: php mysql

我试图在一个简单的mysql更新查询中获取受影响的行数。但是,当我在下面运行此代码时,PHP的mysql_affected_rows()总是等于0.无论foo = 1已经存在(在这种情况下函数应该正确返回0,因为没有更改行),或者如果foo当前等于某个其他整数(在这种情况下函数应返回1)。

$updateQuery = "UPDATE myTable SET foo=1 WHERE bar=2";
mysql_query($updateQuery);
if (mysql_affected_rows() > 0) {
    echo "affected!";
}
else {
    echo "not affected"; // always prints not affected
}

UPDATE语句本身有效。 INT在我的数据库中被更改。我还仔细检查了数据库连接没有事先关闭或任何时髦。请记住,mysql_affected_rows并不一定要求您传递连接链接标识符,尽管我也尝试过。

有关功能的详细信息:mysql_affected_rows

有什么想法吗?

9 个答案:

答案 0 :(得分:21)

较新版本的MySQL非常聪明,可以查看修改是否完成。让我们说你发了一个UPDATE声明:

UPDATE tb_Employee_Stats SET lazy = 1 WHERE ep_id = 1234

假设列的值已经为1;然后没有更新过程发生,因此 mysql_affected_rows()将返回0;否则如果列惰性具有其他值而不是1,则返回1。除人为错误外没有其他可能性。

答案 1 :(得分:1)

您是否尝试过直接使用MySQL函数ROW_COUNT

mysql_query('UPDATE myTable SET foo = 1 WHERE bar = 2');
if(mysql_result(mysql_query('SELECT ROW_COUNT()'), 0, 0)) {
  print "updated";
}
else {
  print "no updates made";
}

有关使用ROW_COUNT和其他MySQL信息功能的更多信息,请访问:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

答案 2 :(得分:1)

mysqli_affected_rows要求您将对数据库连接的引用作为唯一参数传递,而不是对mysqli查询的引用。例如

$dbref=mysqli_connect("dbserver","dbusername","dbpassword","dbname");

$updateQuery = mysqli_query($dbref,"UPDATE myTable SET foo=1 WHERE bar=2");

echo mysqli_affected_rows($dbref);

不是

echo mysqli_affected_rows($updateQuery);

答案 3 :(得分:0)

尝试像这样连接:

$connection = mysql_connect(...,...,...);

然后像这样打电话

if(mysql_affected_rows($connection) > 0)
    echo "affected";
} else { ...

答案 4 :(得分:0)

我认为您需要在更新中尝试其他内容,然后foo = 1。把一些东西完全不同然后你会看到它是否更新或没有if循环。如果确实如此,你的if循环应该有效。

答案 5 :(得分:0)

你这样做?

$timestamp=mktime();
$updateQuery = "UPDATE myTable SET foo=1, timestamp={$timestamp} WHERE bar=2";
mysql_query($updateQuery);

$updateQuery = "SELECT COUNT(*) FROM myTable WHERE timestamp={$timestamp}";
$res=mysql_query($updateQuery);
$row=mysql_fetch_row($res);
if ($row[0]>0) {
    echo "affected!";
}
else {
    echo "not affected";
}

答案 6 :(得分:0)

以下注释对您有所帮助,

mysql_affected_rows()返回

  • +0:未更新或插入行(可能是因为该行已存在, 但在UPDATE期间没有实际更改任何字段值。

  • +1:插入了一行

  • +2:行已更新

  • -1:如果有错误。

mysqli affected rows developer notes

答案 7 :(得分:0)

这是因为mySql正在检查该字段是否进行了任何更改, 为了解决这个问题,我在表中创建了一个新的TINY字段'DIDUPDATE'。

将此添加到查询'DIDUPDATE = DIDUPDATE * -1'

看起来像。

<div>
  <input name="age" type="number" placeholder="age">
</div>
<div>
  <input name="price" type="number" placeholder="price">
</div>
<div>
  Good condition?
  <input name="condition" type="radio" value="true" checked>yes
  <input name="condition" type="radio" value="false">no
</div>
<button onclick="calculateValue()">Compute</button>

它工作正常!!!

答案 8 :(得分:-1)

我的选择了吗?

我正要告诉检查该函数是否被多次调用!

只是一点建议:

尝试使用isset()&amp; POST / GET或类似的东西;

if ( isset( $_POST['Update'] == 'yes' ) ) :

// your code goes here ...

endif;

希望它清楚有用,Ciao:)