3

ユーザーパスワードを変更するためにユーザーの新しいパスワード文字列を取得するphpコードのページがあり、いくつかの検証コードがユーザーテーブルの更新レコードのプロセスページに送信された後。プロセス ページに新しいパスワード文字列を送信し、更新クエリを実行した後、mysqli_affected_rows は -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 でこれに関するいくつかの質問を見つけ、このhttps://bugs.php.net/bug.php?id=67348のような xdebug でmysqliのバグについて議論しまし たが、私は $connect->stat を使用していません。 xdebugが有効になっているすべてのmysqliのバグについて、php.iniでxdebugを無効にしますが、mysqli_affected_rowsはすべての状態とイベント、およびすべての位置で-1を返します。

以前、phpstorme でのデバッグには Google Chrome を使用していました。

Chrome で何かを無効にする必要がありますか?

更新:(2018/08/01):

Googleでさまざまなサイトを検索し、stackoverflowで検索して、書かれた手順と提案を実行して数日後、解決できませんでした。

「siddharaj solanki」という名前の人は、この質問に次のように書いています。

mysqli_affected_rows は新しい接続を作成します (詳細を読む) 書きました:

問題は、mysqli_affected_rows() 関数でデータベース リンク ($link) を渡す方法がわからないことです。上記で試してみたのですが、新しいデータベース接続を作成するようで、mysqli_affected_rows が 1 ではなく 0 を返します。

したがって、私の調査とこのリンクに基づいて、この機能のバグは簡単には解決されないと思います。

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

更新クエリを確認するための mysqli_affected_rows の代わりに、解決策を教えてください。

良い時間

それを解決するのを手伝ってください。

ありがとう。

4

1 に答える 1