使用sqlsrv_rows_infected时出现问题,即使为true,它也会不断返回false


Issues using sqlsrv_rows_affected, it keeps returning false even when its true

我有一个更改用户密码的查询,我想在更改之前检查用户是否知道他们的当前密码。所以它是有效的,我需要在进行更改之前输入当前密码,但我的输出仍然总是错误的,这是我的代码:

$passwordnew=$_POST['passwordnew'];
$password=$_POST['password'];

$password_hash = md5($passwordnew);     
$sql = "UPDATE cryptuser  SET password='" . $password_hash."'  WHERE  password = '".md5($password)."' AND userID ='" . $userid ."' ";   
//Check SQL Query       
$stmt = sqlsrv_query( $conn, $sql,array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET ));
    var_dump(sqlsrv_rows_affected($stmt));

    $rows_affected = sqlsrv_rows_affected( $stmt);
    if( $rows_affected === false) {
         die('password incorrect');
    } 
    else{
        echo $rows_affected." the password was updated.<br />";
    }

if(!$stmt) 
{
    die('An error has occured with your registration. If this is an indeliberate occurance, 
         please report this to us through the contact us page with details of the error.');
}

有人能看到这不会输出"密码已更新"吗?它总是返回密码不正确(false)

可能不再与作者相关,但对于发现这个问题的人来说,答案是:

sqlsrv_errors()返回一条消息:"此函数仅适用于不可滚动的语句"。可以通过将SQLSRV_CURSOR_KEYSET更改为SQLSRV_URSOR_FORWARD或完全删除"Scrollable"参数来修复上述代码。

Astax是对的。。。

这是一个让sqlsrv_rows_affected()工作的完整示例查询。关键是将sqlsrv_query()$选项设置为查询中的数组('Crollable'=>sqlsrv_CURSOR_FORWARD)。如果你没有任何parm,只需在中放入array()

    $sql = "UPDATE TOP (1) MyTable SET name=? WHERE id=$id";
    $params = array($name);
    $options =  array('Scrollable' => SQLSRV_CURSOR_FORWARD);
    $stmt = db_mssql_query($db, $sql, $params, $options);
    $updated_rows = sqlsrv_rows_affected($stmt);

    if($updated_rows === false) {
        die(print_r(sqlsrv_errors(), true));
    } elseif($updated_rows == -1) {
        print "No Info available<br>";
    } else {
        print "Updated: $updated_rows rows<br>";
    }