【问题标题】:How to remove this mysqli warning?如何删除此 mysqli 警告?
【发布时间】:2012-08-09 12:22:23
【问题描述】:

我正在更新我的 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.";
        }
      ?>

【问题讨论】:

  • 调用 fetch 进行更新查询?
  • @Dr.Dan 我所做的是使用我为之前的 Select 语句制作的相同模板,只是用 update 语句更改了 select 语句。

标签: php mysqli


【解决方案1】:

改变

$stmt->execute(); 

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

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

【讨论】:

  • 嗨,如果我把它改成你所说的,我现在收到这个通知:Warning: mysqli_stmt::bind_result() [mysqli-stmt.bind-result]: Number of bind variables doesn't match number of fields in prepared statement in ... on line 40
【解决方案2】:

UPDATE 语句不会产生结果集。引用the docs:

如果语句是 UPDATEDELETEINSERT,可以使用mysqli_stmt_affected_rows() 函数确定受影响的总行数。同样,如果查询产生结果集,则使用 mysqli_stmt_fetch() 函数。

【讨论】:

  • 我需要一个带有 UPDATE 的 bid_result 吗?
【解决方案3】:

您可以删除 PHP 中的“警告信息”,只需在 php.ini 中替换即可

error_reporting  =  E_ALL & ~E_NOTICE

error_reporting  =  0

但是如果你的代码是完美的,警告信息就不会出现,在 PHP 中不要出现警告的必须是解决 警告信息问题

在您的代码中,您在第 44 行之前遇到了问题。请查看您的“While Loop”...

编辑:我刚刚阅读了您的答案 + 1 Dr. Dan

【讨论】:

    【解决方案4】:

    您可以通过更改脚本顶部的 error_reporting() 函数来删除 PHP 上的任何警告。放:

    error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
    

    除警告或通知外,这都是错误。或者,如果它只是一个函数,您可以在函数调用前加上 at 符号:

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

    例如。

    【讨论】:

    • 抑制警告和错误很少是处理它们的正确方法。
    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2018-12-22
    • 2019-08-04
    • 1970-01-01
    • 2018-10-27
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多