mysqli_stmt::bind_param()[mysqli stmt.bind param]:变量数与参数数不匹配

wn9m85ua  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(389)

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

  1. <?php
  2. if (isset($_POST['insert'])) {
  3. require_once 'login.php';
  4. $OK = false;
  5. $conn = new mysqli ($host, $user, $password, $database) or die("Connection Failed");
  6. $stmt = $conn->stmt_init();
  7. $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password)
  8. VALUES(?, ?, ?, des_encrypt(substring(md5(rand()),1,8)))';
  9. if ($stmt->prepare($sql)) {
  10. // bind parameters and execute statement
  11. $stmt->bind_param('ssss', $_POST['user_email'], $_POST['user_name'], $_POST['user_pref'], $_POST['user_password']);
  12. // execute and get number of affected rows
  13. $stmt->execute();
  14. if ($stmt->affected_rows > 0) {
  15. $OK = true;
  16. }
  17. }
  18. if ($OK) {
  19. header('Location: confirm.php');
  20. exit;
  21. } else {
  22. $error = $stmt->error;
  23. }
  24. }
  25. ?>
  26. <!DOCTYPE HTML>
  27. <html>
  28. <head>
  29. <meta charset="utf-8">
  30. <title>Add User</title>
  31. </head>
  32. <body>
  33. <h1>Add User</h1>
  34. <?php if (isset($error)) {
  35. echo "<p>Error: $error</p>";
  36. } ?>
  37. <form id="form1" method="post" action="">
  38. <p>
  39. <label for="user_email">User email:</label>
  40. <input name="user_email" type="text" class="widebox" id="user_email">
  41. </p>
  42. <p>
  43. <label for="user_name">User name:</label>
  44. <input name="user_name" type="text" class="widebox" id="user_name">
  45. </p>
  46. <p>
  47. User role: <select name = "user_pref">
  48. <option value = "BLU">Blue</option>
  49. <option value = "YEL">Yellow<option>
  50. <option value = "GRE">GREEN</option>
  51. </select>
  52. </p>
  53. <p>
  54. <input type="submit" name="insert" value="Register New User" id="insert">
  55. </p>
  56. </form>
  57. </body>
  58. </html>

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

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

我应该把字符串改成别的密码吗?
谢谢

zqry0prt

zqry0prt1#

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

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

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

每一天?在准备好的sql语句中插入时,必须在bind_param中传递一个变量。

vm0i2vca

vm0i2vca2#

在这里传递四个变量:

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

但只需要三个

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

请参阅“?”标记,它将替换为bildïu参数。您可能希望将sql查询替换为下一个查询:

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

knpiaxh13#

您的查询将采用的参数数由 ? 在您的查询中。
你有3个 ? 在您的查询中:

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

你正在传入5个参数 bind_param :

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

有两种可能的解决方案:
在查询中取5个参数:

  1. $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password)
  2. VALUES(?, ?, ?, ?, des_encrypt(?))';

只传递3个参数 bind_param 功能:

  1. $stmt->bind_param('ssss', $_POST['user_email'], $_POST['user_name'], $_POST['user_pref'], $_POST['user_password']);
展开查看全部

相关问题