mysqli::$affected_rows/mysqli_affected_row() 由于某种原因为我返回 0。 这是我的功能:
function set_timezone_value($sUsername, $sTimeZone){
$_SESSION["timezone_value"] = $sTimeZone;
//get a connection to the LDAP db
$db_con = get_db_con(LDAP, TRUE);
$sQuery = "UPDATE user_info " .
"SET sTimeZone = '". $db_con->real_escape_string($sTimeZone) . "' " .
"WHERE uid = '". $db_con->real_escape_string($sUsername) ."'";
do_query($sQuery, $db_con);
var_dump($db_con->info);
$iAffectedRows = $db_con->affected_rows;
$db_con->close();
return $iAffectedRows;
}
do_query 和 get_db_con 只是 mysqli->query 和新 mysqli 的包装器,带有附加代码,用于在出现错误时发送电子邮件。
var_dump 正在打印 string(40) "Rowsmatched: 1 Changed: 0 warnings: 0"
表示已找到该行但未更改。但这是不正确的,因为当我在代码运行之前和之后查看 phpMyAdmin 中的行时,该行实际上已更新为新时区,并且站点的其余部分具有正确的时区。尽管如此,无论我使用过程式还是面向对象风格,affected_rows 和 info 都表明没有对该行进行任何更改。
我的代码中有什么搞砸了吗?
最佳答案
您描述的行为是默认行为。值与现有行匹配的 UPDATE
语句会导致零行受到影响。这很烦人,因为您不知道要更新的记录是否已同时删除或根本没有任何更改。
如果您使用 PHP PDO 和 PHP 5.3+,可以选择更改该行为:
$options = array('MYSQL_ATTR_FOUND_ROWS' => true);
设置此标志返回找到(匹配)的行数,而不是更改的行数。 请参阅http://www.php.net/manual/en/ref.pdo-mysql.php和 http://www.php.net/manual/en/pdostatement.rowcount.php#104930
关于php - Mysqli 更改行值为 0,而实际上为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26342968/