【问题标题】:How to remove this mysqli warning on bind result?如何在绑定结果中删除此 mysqli 警告?
【发布时间】:2012-08-10 13:57:07
【问题描述】:

我在错误报告中收到一条 mysqli 警告,指出 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 36 有谁知道我如何正确绑定结果以使该警告消失?我真的看不出问题出在哪里,但是说我是使用 mysqli 的初学者。

下面是代码:

<?php
  // PHP code
  session_start(); 

//connected to db

  // required variables (make them explciit no need for foreach loop)
  $teacherusername = (isset($_POST['teacherusername'])) ? $_POST['teacherusername'] : '';
  $teacherpassword = (isset($_POST['teacherpassword'])) ? $_POST['teacherpassword'] : '';
  $loggedIn = false;

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

    $teacherpassword = md5(md5("j3Jf92".$teacherpassword."D203djS"));  

    // don't use $mysqli->prepare here
    $query = "SELECT * FROM Teacher WHERE TeacherUsername = ? AND TeacherPassword = ? LIMIT 1";
    // prepare query
    $stmt=$mysqli->prepare($query);
    // You only need to call bind_param once
    $stmt->bind_param("ss",$teacherusername,$teacherpassword);
    // execute query
    $stmt->execute(); 
    // get result and assign variables (prefix with db)
    $stmt->bind_result($dbTeacherForename,$dbTeacherSurname,$dbTeacherUsername,$dbTeacherPassword);

    while($stmt->fetch()) {
      if ($teacherusername == $dbTeacherUsername && $teacherpassword == $dbTeacherPassword) {
        $loggedIn = true;
      }
    }

    if ($loggedIn == true){
      // left your session code as is - but think wisely about using
      $_SESSION['teacherforename'] = $dbTeacherForename;
      $_SESSION['teachersurname'] = $dbTeacherSurname;
      header( 'Location: menu.php' ) ;
      die();
    }

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

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

【问题讨论】:

    标签: php mysql database mysqli


    【解决方案1】:

    不推荐使用通配符 *。表中的列可能比您需要的 4 列还多?

    我会选择

    SELECT TeacherForname, TeacherSurname, TeacherUsername, TeacherPassword FROM Teacher WHERE TeacherUsername = ? AND TeacherPassword = ? LIMIT 1
    

    【讨论】:

    • 密码不是明文存储的$teacherpassword = md5(md5("j3Jf92".$teacherpassword."D203djS"));
    • @Quentin 没有帮助,但不建议使用 MD5 存储密码。
    • @Matt 使用 md5 能够安全存储密码的最佳方法是什么?
    【解决方案2】:

    发生错误是因为您要求 mysqli 将 x 列绑定到 y 变量,其中 x != yTeacher 表中有多少列?

    【讨论】:

    • 有 8 列,但我删除了通配符,只包含了 Leon Kramer 提到的字段名称
    • @user1517628 这就是原因。您正在尝试将 8 列绑定到 4 个变量,这是不允许的。菜鸟的错误,没什么大不了的。安全密码 q/a 有帮助吗?
    • 我能问你一些关于加盐密码的问题吗,在阅读你链接到我的文章时,如果我仍然使用 md5 但能够使用这个 php 代码创建 $salt = ""; for ($i = 0; $i &lt; 40; $i++) { $salt .= substr( "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); } 每次随机生成盐.这可以使它更安全吗?如果可以,我如何将随机盐生成器包含到$teacherpassword = md5(md5("".$teacherpassword.""));。如果你知道?
    • @user1517628 老实说,我只是扫描了答案。我还没有实现任何这些(目前没有处理任何需要密码存储的东西)。对不起:-/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2018-12-22
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多