0

php/mysqli で更新を行っています。更新は正常に機能しますが、問題は次の警告が表示されることです。

警告: mysqli_stmt::fetch() [mysqli-stmt.fetch]: (HY000/2053): 行 44 のステートメントに関連付けられた結果セットがないときに行を読み取ろうとしました。

この警告が何度も表示されるため、ユーザーがフォームを送信した後、正しいユーザー名を入力しても、「入力したユーザー名は有効ではありません。もう一度入力してください」というメッセージが表示されます。実際には、ユーザーを thankyou.php ページに移動する必要があります。

私の質問は、この警告を削除するにはどうすればよいですか?

 $username = (isset($_POST['username'])) ? $_POST['username'] : '';
      $newpassword = (isset($_POST['newpassword'])) ? $_POST['newpassword'] : '';
      $loggedIn = false;

      if (isset($_POST['submit'])) {

        // don't use $mysqli->prepare here
        $query = "UPDATE Teacher SET TeacherSalt = ?, TeacherPassword = SHA1(CONCAT(?,?)) WHERE TeacherUsername = ? LIMIT 1";
        // prepare query
        $stmt=$mysqli->prepare($query);
        // You only need to call bind_param once
        $stmt->bind_param("ssss",$salt,$newpassword,$salt,$username);
        // execute query
//bind results
$stmt->bind_result($dbTeacherUsername,$dbTeacherPassword,$dbTeacherSalt);
        $stmt->execute(); 

        while($stmt->fetch()) {
          if ($username == $dbTeacherUsername) {
            $loggedIn = true;
          }
        }

        /* close statement */
        $stmt->close();

        /* close connection */
        $mysqli->close();

        if ($loggedIn == true){
          $_SESSION['username'] = $dbTeacherUsername;
          header( 'Location: thankyou.php' ) ;
          die();
        }
      }
     if ($loggedIn == false && $_POST) {
        echo "The Username you Entered is not Valid. Try Entering it Again.";
        }
      ?>
4

4 に答える 4

1

変化する

$stmt->execute(); 

        while($stmt->fetch()) {
          if ($username == $dbTeacherUsername) {
            $loggedIn = true;
          }
        }

    if($stmt->execute()) {
      if ($username == $dbTeacherUsername) {
        $loggedIn = true;
      }
    }
于 2012-08-09T12:29:57.760 に答える
0

UPDATEステートメントは結果セットを生成しません。ドキュメントからの引用:

ステートメントがUPDATEDELETE、またはINSERTの場合、影響を受ける行の総数はmysqli_stmt_affected_rows()関数を使用して判別できます。同様に、クエリが結果セットを生成する場合、mysqli_stmt_fetch()関数が使用されます。

于 2012-08-09T12:24:41.103 に答える
-1

PHPの「警告情報」を削除する可能性があります。php.iniで置き換えるだけです。

error_reporting  =  E_ALL & ~E_NOTICE

error_reporting  =  0

ただし、コードが完全である場合、警告情報は表示されません。PHPで警告が表示されないようにする必要があるのは、警告メッセージの問題を解決することです

コードでは、44行目の直前に問題があります。「WhileLoop」で見てください...

編集:私はあなたの答えを読んだだけです+1ダン博士

于 2012-08-09T12:37:52.977 に答える
-3

スクリプトの先頭にある error_reporting() 関数を変更することで、PHP の警告を削除できます。置く:

error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);

警告または通知を除くすべてのエラーです。または、関数が 1 つだけの場合は、関数呼び出しの前にアット マークを付けることができます。

while (@$stmt->fetch()) {
    //do stuff
}

例えば。

于 2012-08-09T12:28:29.303 に答える