当实际为1时,Mysqli将行值改为0

时间:2014-10-13 14:58:01

标签: php mysql mysqli

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都表明没有对该行进行任何更改。

我的代码中有什么问题吗?

1 个答案:

答案 0 :(得分:0)

您描述的行为是默认行为。值与现有行匹配的UPDATE语句会导致受影响的行数为零。这很烦人,因为您不知道在此期间是否删除了要更新的记录,或者根本没有更改。

如果您使用PHP PDO和PHP 5.3+,则可以选择更改该行为:

$options = array('MYSQL_ATTR_FOUND_ROWS' => true);

设置此标志将返回找到的(匹配的)行数,而不是更改的行数。 请参阅http://www.php.net/manual/en/ref.pdo-mysql.phphttp://www.php.net/manual/en/pdostatement.rowcount.php#104930