1

データベースに対して SELECT クエリを実行するために準備済みステートメントを使用していますが、SQL 構文の性質が MySQLi で問題を引き起こしています。

準備しようとすると:

SELECT user_id FROM Users WHERE email='?';

エラーが発生します

Warning: mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepared statement

? を引用符で囲むことによってエラーが発生していることはわかっています。しかし問題は、SQL 構文を正しくするためにこれらの引用符が必要なことです。引用符を削除すると、準備されたステートメントは機能しますが、データベースは想定されているものを返しません。

私にできることはありますか、それともインターフェースの制限ですか? それが制限である場合、準備されたステートメントの安全性でこのクエリを実行するにはどうすればよいですか?

完全なコード:

$email = $_POST["email"];    
$sql = "SELECT user_id,fname,city,state,zip FROM Users WHERE email='?';";
            $types = 's';
            $stmt = $db_obj->prepare($sql);
            if (!mysqli_stmt_bind_param($stmt, $types, $email)) {
                echo "SQL Bind Parameter error.<br/>";
                exit;
            }
            if (!mysqli_stmt_execute($stmt)) {
                echo "SQL Statement Execute error.<br/>";
                exit;
            }
if (!isset($row[0]))
    exit ("No such email registered.");
4

3 に答える 3

2

@lc が上に投稿したように、準備されたステートメントは常に電子メールをパラメーターではなく文字列として MySQL に渡しているため、問題を解決するために引用符が必要ないことを認識して引用符を削除しました。

ステートメントの実行後に出力変数をバインドしていないことが判明したため、準備されたステートメントが正しく実行されていたとしても、応答を正しく読み取っていませんでした。

追加した:

mysqli_stmt_bind_result($stmt, $user_id, $fname, $city, $state, $zip);
mysqli_stmt_fetch($stmt);

if (empty($user_id))
    exit ("No such email registered.");

データベースの結果が適切に変数にバインドされたため、 などの変数は、$userid予期されたデータベースからのデータを保持していました。

于 2013-03-06T06:12:33.427 に答える
1

の引用符を削除してください。マーク。

$stmt = $mysqli->prepare("SELECT user_id,fname,city,state,zip FROM Users WHERE email=?");

/* bind parameters for markers */
$stmt->bind_param("s", $email);

/* execute query */
$stmt->execute();

これを試して。

于 2013-03-06T05:38:24.563 に答える
1

正しい構文はSELECT user_id FROM Users WHERE email=?. 「正しい」結果を返さない準備済みステートメントの問題は、次のいずれかの結果である必要があります。

  • 予期しない値を含むパラメーター
  • または、データベース内のデータが期待どおりではない

SELECT user_id FROM Users WHERE email='?'queryでは、はパラメータで?ないことに注意してください。文字列リテラルの「?」です。このクエリは、列に値「?」Usersが含まれるテーブル内の行を検索します。.email

于 2013-03-06T05:14:50.157 に答える