3

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

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

我的进程页面代码是这样的:

 $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中的错误与xdebug这样的https://bugs.php.net/bug.php?id=67348 但我不使用$connect->stat和一些页面写关于 mysqli 中每个启用 xdebug 的错误,所以我在 php.ini 中禁用 xdebug 但 mysqli_affected_rows 在所有状态和事件以及所有位置都返回 -1。

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

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

更新:(2018/08/01):

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

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

mysqli_affected_rows 创建新连接(阅读详细信息) 写道:

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

因此,根据我的研究和此链接,我认为该错误不会轻易解决此功能:

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

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

美好时光

请帮我解决这个问题。

谢谢。

4

1 回答 1

3

上面的评论确实解释了问题所在,但我会在这里总结一下,并将其标记为社区 wiki 答案。

您的代码创建了与数据库的连接,但您说您的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()自己,并返回值。

于 2018-01-08T00:11:59.637 回答