【问题标题】:mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of variables doesn't match number of parametersmysqli_stmt::bind_param() [mysqli-stmt.bind-param]:变量数与参数数不匹配
【发布时间】:2013-01-14 07:58:56
【问题描述】:

我的 php 表单在我的表中插入了几列和一个加密密码。但是,当我运行它时,它说变量数与参数数不匹配。这是我的代码:

<?php
if (isset($_POST['insert'])) {
require_once 'login.php'; 

  $OK = false;
  $conn = new mysqli ($host, $user, $password, $database) or die("Connection Failed");
  $stmt = $conn->stmt_init();


  $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password)
          VALUES(?, ?, ?, des_encrypt(substring(md5(rand()),1,8)))';
  if ($stmt->prepare($sql)) {
    // bind parameters and execute statement
    $stmt->bind_param('ssss', $_POST['user_email'], $_POST['user_name'], $_POST['user_pref'], $_POST['user_password']);
    // execute and get number of affected rows
    $stmt->execute();
    if ($stmt->affected_rows > 0) {
      $OK = true;
    }
  }
  if ($OK) {
    header('Location: confirm.php');
    exit;
  } else {
    $error = $stmt->error;
  }
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Add User</title>
</head>

<body>
<h1>Add User</h1>
<?php if (isset($error)) {
  echo "<p>Error: $error</p>";
} ?>
<form id="form1" method="post" action="">
  <p>
    <label for="user_email">User email:</label>
    <input name="user_email" type="text" class="widebox" id="user_email">
  </p>
    <p>
    <label for="user_name">User name:</label>
    <input name="user_name" type="text" class="widebox" id="user_name">
  </p>
    <p>
    User role: <select name = "user_pref">
    <option value = "BLU">Blue</option>
    <option value = "YEL">Yellow<option>
    <option value = "GRE">GREEN</option>
    </select>
</p>
  <p>
    <input type="submit" name="insert" value="Register New User" id="insert">
  </p>
</form>
</body>
</html>

当我在没有加密密码的情况下测试表单时,它工作正常,所以当我尝试插入密码时,这一行会导致问题:

$stmt->bind_param('ssss', $_POST['user_email'], $_POST['user_name'], $_POST['user_pref'], $_POST['user_password']);

我应该将字符串更改为其他密码吗?

谢谢

【问题讨论】:

    标签: php mysql md5


    【解决方案1】:
    $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password)
          VALUES(?, ?, ?, des_encrypt(substring(md5(rand()),1,8)))';
    

    仅定义 3 个占位符,但您尝试写入 4 个。

    $stmt->bind_param('ssss', $_POST['user_email'], $_POST['user_name'], $_POST['user_pref'], $_POST['user_password']);
    

    对于每个 ?你插入准备好的 SQL 语句,你必须在 bind_param 中传递一个变量。

    【讨论】:

      【解决方案2】:

      你在这里传递了四个变量:

      $stmt->bind_param('ssss', $_POST['user_email'], $_POST['user_name'], $_POST['user_pref'], $_POST['user_password']);
      

      但只需要其中三个

       $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password)
            VALUES(?, ?, ?, des_encrypt(substring(md5(rand()),1,8)))';
      

      看到“?”标记,它将被替换为 bild_params。 您可能希望将 SQL 查询替换为下一个:

           $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password)
            VALUES(?, ?, ?, des_encrypt(substring(md5(?),1,8)))';
      

      【讨论】:

        【解决方案3】:

        您的查询要采用的参数数量取决于您查询中? 的数量。

        您的查询中有 3 个?

        $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password) 
                VALUES(?, ?, ?, des_encrypt(substring(md5(rand()),1,8)))';
        

        你在 bind_param 中传递了 5 个参数:

        $stmt->bind_param($_POST['user_email'], $_POST['user_name'], $_POST['user_pref']);
        

        有两种可能的解决方案:

        1. 在查询中取5个参数:

          $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password) 
                  VALUES(?, ?, ?, ?, des_encrypt(?))';
          
        2. bind_param 函数中只传递 3 个参数:

          $stmt->bind_param('ssss', $_POST['user_email'], $_POST['user_name'], $_POST['user_pref'], $_POST['user_password']);
          

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 2011-06-11
          • 2016-10-08
          • 2015-05-17
          • 2013-05-27
          相关资源
          最近更新 更多