3

私の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>

ENCRYPTED PASSWORDなしでフォームをテストすると、正常に機能するため、パスワードを挿入しようとすると、次の行で問題が発生します。

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

パスワードの文字列を別のものに変更する必要がありますか?

ありがとう

4

3 に答える 3

2
$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']);

すべてのための ?bind_param で変数を渡す必要がある準備済み SQL ステートメントに挿入します。

于 2013-01-30T13:26:09.377 に答える
2

ここでは 4 つの変数を渡しています。

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

しかし、そのうちの 3 つだけが必要です

 $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)))';
于 2013-01-30T13:28:09.640 に答える
1

クエリで取得されるパラメータの数は?、クエリ内の数によって決まります。

クエリに3つ?あります:

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

そしてあなたは5つのパラメータを渡しますbind_param

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

可能な2つの解決策があります:

  1. クエリで5つのパラメータを取ります:

    $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password) 
            VALUES(?, ?, ?, ?, des_encrypt(?))';
    
  2. 関数に3つのパラメータのみを渡しbind_paramます:

    $stmt->bind_param('ssss', $_POST['user_email'], $_POST['user_name'], $_POST['user_pref'], $_POST['user_password']);
    
于 2013-01-30T14:06:10.560 に答える