Php mysql\u infected\u rows()为UPDATE语句返回0,即使在实际发生更新时也是如此

Php mysql\u infected\u rows()为UPDATE语句返回0,即使在实际发生更新时也是如此,php,mysql,Php,Mysql,我试图在一个简单的mysql更新查询中获得受影响的行数。但是,当我运行下面的代码时,PHP的mysql_impacted_rows()总是等于0。不管foo=1(在这种情况下,函数应该正确地返回0,因为没有行被更改),或者如果foo当前等于某个其他整数(在这种情况下,函数应该返回1) UPDATE语句本身可以工作。INT在我的数据库中被更改。我还仔细检查了数据库连接是否事先没有关闭或有什么问题。请记住,mysql受影响的行不一定需要传递连接链接标识符,尽管我也尝试过 有关该功能的详细信息: 有什

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

UPDATE语句本身可以工作。INT在我的数据库中被更改。我还仔细检查了数据库连接是否事先没有关闭或有什么问题。请记住,mysql受影响的行不一定需要传递连接链接标识符,尽管我也尝试过

有关该功能的详细信息:

有什么想法吗?

是我的主意

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

只是一个小小的建议:

尝试使用isset()&POST/GET或类似的工具

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

// your code goes here ...

endif;

希望它清晰有用,再见:)

试着这样连接:

$connection = mysql_connect(...,...,...);
然后像这样打电话

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

我认为您需要在更新中尝试其他内容,然后foo=1。放一些完全不同的东西,然后你会看到它是更新还是没有if循环。如果是这样的话,你的if循环应该可以工作。

你可以这样做吗

$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";
}

您是否尝试过直接使用MySQL函数
ROW\u 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\u COUNT
和其他MySQL信息函数的更多信息,请访问:

较新版本的MySQL足够聪明,可以查看是否进行了修改。假设您启动了一个更新语句:

UPDATE tb_Employee_Stats SET lazy = 1 WHERE ep_id = 1234

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

mysqli\u受影响的行要求您将对数据库连接的引用作为唯一参数传递,而不是对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);
不是


以下注释将对您有所帮助

mysql\u受影响的\u行()返回

  • +0:未更新或插入行(可能是因为该行已存在, 但在更新过程中没有实际更改字段值)

  • +1:插入了一行

  • +2:更新了一行

  • -1:如果出现错误


这是因为mySql正在检查字段是否有任何更改, 为了解决这个问题,我在表中创建了一个新的小字段“DIDUPDATE”

将此添加到您的查询“DIDUPDATE=DIDUPDATE*-1”

看起来像

    $updateQuery = "UPDATE myTable SET foo=1, DIDUPDATE=DIDUPDATE*-1  WHERE bar=2";
    mysql_query($updateQuery);

    if (mysql_affected_rows() > 0) 
    {
            echo "affected!";
    }
    else 
    {
            echo "not affected"; 
    }

它很好用

您确定记录正在更新吗?在运行测试之前,请确保将foo设置为1以外的值。您的页面是否可能会被调用两次,比如因为重写规则?这将导致第一次更新数据,而不是在看到最终输出时第二次更新数据。。。查看您的web服务器日志不会有什么坏处。添加@Michael所说的内容,而不是echo,请尝试放置
die(“受影响”)这可能会让它在双重重写之前工作,如果是这样的话。。。你可能不会相信,但是页面实际上是通过一个AJAX调用连续加载了十次,而我只是查看了上一次调用的回调。那是一个愚蠢的举动。从堆栈溢出开始是一种多么好的方式啊非常感谢你的帮助@Alex,一定要把你的解决方案放进去,并描述你如何解决的实际问题,以便其他人可以使用。很高兴你发现了问题,就是这样,让我的生活很困难。现在我可以更新代码来解决这个问题。不能对表达式的结果使用isset()。
echo mysqli_affected_rows($updateQuery);
    $updateQuery = "UPDATE myTable SET foo=1, DIDUPDATE=DIDUPDATE*-1  WHERE bar=2";
    mysql_query($updateQuery);

    if (mysql_affected_rows() > 0) 
    {
            echo "affected!";
    }
    else 
    {
            echo "not affected"; 
    }