mysqli_affected_rows返回-1但更新查询成功

时间:2018-01-06 19:22:17

标签: php mysqli sql-update rows-affected

我有一个php代码页面,用户的新密码字符串更改用户密码,并在一些验证代码发送到用户表中的更新记录的进程页面后。在向进程页面发送新密码字符串并执行更新查询后,mysqli_affected_rows返回-1但更新查询成功并且密码已更改或者如果先前的密码字符串与先前的密码相同,则更新查询不会进行任何更改但仍返回-1

我在所有代码中使用mysqli函数。 db_conncet_fnc(),db_query_func(),db_fetch_assoc_func(),...这些函数包含相同的mysqli函数。

我的proccess页面代码是这样的:

 $link_con=db_conncet_fnc();
 require_once("PassHash.php");
 $query = "SELECT * FROM mdr WHERE m_id='$md_id'";
 $result = db_query_func($query);
 $affecteds= mysqli_affected_rows($link_con);
 $_SESSION["affecteds"]=$affecteds; //this is for test before UPDATE query
 $_SESSION["affected-s-oop"]=$link_con->affected_rows; //this is for test before UPDATE query
 $rec = db_fetch_assoc_func($result);
 $p_hasher = new PassHsh(25, FALSE);
 $ans = "2"; //answer without error is 2
 if($rec)
 {
     if ($pass != "" && $newpsw != "" && $check = $p_hasher->checkpss($newpsw, $rec["userpass"])) {
         if ($chngpsw_err < 2) {
             $_SESSION["chngpsw_err"] = "has";
         }
         $_SESSION["pass_nwpass_is_equal"] = "yes";
         header("location:index.php?page=chngpass");
         exit();

     } elseif ($check = $p_hasher->checkpss($pass, $rec["userpass"])) {
         $hashed_psw = $p_hasher->HashPassword($newpsw);
         $query = "UPDATE `mdr` SET `userpass`='$hashed_psw' WHERE m_id='" . $md_id . "' ";
         $result = db_query_func($query);
         $affect_upd = mysqli_affected_rows($link_con);
         $_SESSION["affect_upd"] = $affect_upd; //by function
         $_SESSION["affect_upd-oop"] = $link_con->affected_rows; //by object
         if ($affect_upd == 0) {
             $_SESSION["update_result"] = "err0";

             header("location: index.php?page=chngpass");
             exit();

         }
         if ($affect_upd == -1) {
             $_SESSION["update_result"] = "err-1";

             header("location: index.php?page=chngpass");
             exit();

         }
         if ($affect_upd > 0) {
             $_SESSION["update_result"] = "ok";

             header("location: index.php?page=chngpass");
             exit();

         }

     } else {
         $ans = "1";
         header("location: index.php?page=chngpass&ans=$ans");
     }
 }

我在stackoverflow和google中发现了一些关于这个问题的问题,并讨论了mysqli中的bug与 xdebug 这样的https://bugs.php.net/bug.php?id=67348,但我没有使用$ connect-&gt; stat和一些页面写的关于mysqli中每个启用xdebug的错误,所以我在php.ini中禁用了xdebug,但mysqli_affected_rows在所有状态和事件以及所有位置都返回-1。

之前我使用谷歌浏览器进行phpstorme调试。

我应该在Chrome中禁用某些内容吗?

更新:(2018年8月1日):

经过几天Google搜索各种网站并在stackoverflow中搜索并执行所写的步骤和建议后,我无法解决。

一个名叫“siddharaj solanki”的人在这个问题中写道:

mysqli_affected_rows creates new connection (read details)  写道:

  

现在问题是我不明白如何传递数据库链接   mysqli_affected_rows()函数中的($ link)。我试过上面,但它   似乎创建了一个新的数据库连接,所以mysqli_affected_rows   返回0而不是1。

所以我认为基于我的研究和这个链接,这个bug不会轻易解决这个问题:

https://www.google.com/search?q=bug+mysqli_affected_rows

请指导我最新的解决方案或什么是好的或最好的方式而不是mysqli_affected_rows来检查更新查询?

美好时光

请帮我解决。

感谢。

1 个答案:

答案 0 :(得分:2)

上面的评论确实解释了什么是错的,但我会在这里总结并将此标记为社区维基的答案。

您的代码创建了与数据库的连接,但您说您的db_query_func()函数创建了与数据库的单独连接以运行查询。

受影响的行计数只能报告同一连接中受查询影响的行。但是你在另一个连接中执行了UPDATE。

考虑这个类比:您打开两个单独的ssh会话到远程服务器。您在一个shell中运行命令,然后在其他 shell中使用!!重复该命令。第二个shell不知道来自第一个shell的命令历史记录,因此它不能重复相同的命令。

您需要使用相同的数据库连接来执行查询,然后报告受影响的行。也许上面的评论没有说清楚,但你可以通过将连接传递给查询函数来解决这个问题:

 $result = db_query_func($link_con, $query);

在该函数中,不要创建新的mysqli连接,而是使用您作为参数传递的连接。

然后当它返回时,它具有适当的上下文,因此您可以从同一连接获取mysqli_affected_rows($link_con)

还有其他可行的解决方案:

  • 目前尚不清楚为什么需要db_query_func()。也许您应该从主代码中调用mysqli_query()

  • 否则db_query_func()应调用mysqli_affected_rows()本身,并返回该值。