php - Mysqli 更改行值为 0,而实际上为 1

标签 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->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.phphttp://www.php.net/manual/en/pdostatement.rowcount.php#104930

关于php - Mysqli 更改行值为 0,而实际上为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26342968/

相关文章:

php - Mysql 在一个查询中替换两个值?

php - 如何使用meta_keys获取meta_values

javascript - 计算字符串长度,包括 'invisible characters' 就像 javascript 和 php 中的\r\n

php - PHP Codeigniter 中的 URL 重写。

php - PHP MYSQL 中的日期格式

mysql - 在 MySQL 中计算频率

Php 跳过第一个 MySQL 行。不是常见的 double fetch() 错误

javascript - 我如何将我的 php 连接到 mysql 进行 ajax 查询

php - 我试图用 PHP、MySQL、jQuery 和 css 处理的乱七八糟的事

php - 使用 php(mysqli) 的连续 mysql 过程调用不会产生结果