Php Mysqli在实际为1时更改了行值0

Php Mysqli在实际为1时更改了行值0,php,mysql,mysqli,Php,Mysql,Mysqli,mysqli::$infected_rows/mysqli_infected_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); $sQ

mysqli::$infected_rows/mysqli_infected_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和new mysqli的包装器,如果出现错误,可以使用附加代码发送电子邮件

该var_dump正在打印
string(40)“匹配的行:1已更改:0警告:0”
,这表示该行已找到但未更改。这是不正确的,因为当我在运行代码之前和之后查看phpMyAdmin中的行时,该行实际上会更新为新时区,并且站点的其余部分会使用正确的时区运行。尽管如此,无论我使用过程还是OO样式,受影响的_行和信息都表明没有对行进行任何更改


我的代码中有什么地方弄乱了吗?

您描述的行为是默认行为。值与现有行匹配的
UPDATE
语句将导致零行受影响。这是相当烦人的,因为您不知道要更新的记录是否同时被删除,或者根本没有更改

如果使用PHP PDO和PHP 5.3+,则有一个选项可以更改该行为:

$options = array('MYSQL_ATTR_FOUND_ROWS' => true);
设置此标志将返回找到的(匹配的)行数,而不是更改的行数。
请参见和

该行与值不匹配,我通过phpmyadmin运行了生成的sql命令,它返回了一个受影响的行。当前值为“America/Chicago”并被更改为“America/Los_Angeles”仍会生成匹配的1,更改为0。您确定在执行查询和调用受影响的行数之间没有SQL查询吗?执行的任何其他查询(例如,对于填充
$db\u con->info
变量)都可以更改
mysqli\u infected\u row()
的返回值,因为此函数绑定到最后一个查询。没有其他调用,这是在单线程系统上运行的,函数调用紧随其后。我还隔离了只调用该函数的问题,但这种情况仍然存在。奇怪的是,我在其他地方以完全相同的方式使用相同的函数,但结果不同。