Php mysql\u infected\u rows()为UPDATE语句返回0,即使在实际发生更新时也是如此
我试图在一个简单的mysql更新查询中获得受影响的行数。但是,当我运行下面的代码时,PHP的mysql_impacted_rows()总是等于0。不管foo=1(在这种情况下,函数应该正确地返回0,因为没有行被更改),或者如果foo当前等于某个其他整数(在这种情况下,函数应该返回1) UPDATE语句本身可以工作。INT在我的数据库中被更改。我还仔细检查了数据库连接是否事先没有关闭或有什么问题。请记住,mysql受影响的行不一定需要传递连接链接标识符,尽管我也尝试过 有关该功能的详细信息: 有什么想法吗?是我的主意 我正要告诉你检查函数是否被多次调用 只是一个小小的建议: 尝试使用isset()&POST/GET或类似的工具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受影响的行不一定需要传递连接链接标识符,尽管我也尝试过 有关该功能的详细信息: 有什
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";
}