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->查询和新mysqli的包装器,如果出现错误,还会附加代码来发送电子邮件。
var_dump正在打印string(40) "Rows matched: 1 Changed: 0 Warnings: 0"
,表示正在找到该行但未更改。这是不正确的,因为当我在代码运行之前和之后查看phpMyAdmin中的行时,该行实际上更新为新的时区,并且其余的站点使用正确的时区。尽管如此,无论我使用过程还是OO样式,affected_rows和info都表明没有对该行进行任何更改。
我的代码中有什么问题吗?
答案 0 :(得分:0)
您描述的行为是默认行为。值与现有行匹配的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