2016-12-27 14 views
1

現在、私はブラウザのゲームのログインフォームを作成しようとしています。まず、PHPとMySQLを使用してクエリを実行する通常の手順から始めましたが、すぐにSQLインジェクションのために最適な方法ではないことがわかりました。mysqli_stmt(手続き型)の問題がある

私はstackoverflowによればより安全なstmtを使用することに決めました。

私のコードは、これよりも大きいですが、私はちょうどここに盗聴される部分(私は、コードの残りの部分をデバッグしているし、他のすべては、MySQLサーバへの接続を含め、結構です)

$stmt = mysqli_prepare($conn, "SELECT username FROM users WHERE username='$playername'"); 
    ´ 
//Im pretty sure this is where the bug is 
mysqli_stmt_bind_param($stmt, "s", $playername); 
//---------------------------------------- 

mysqli_stmt_execute($stmt); 

mysqli_stmt_bind_result($stmt, $dbusername); 

mysqli_stmt_fetch($stmt); 

$row_cnt = mysqli_stmt_num_rows($stmt); 

if($row_cnt === 0) { 

    mysqli_stmt_close($stmt); 
    $error = true; 
    $errorid = "There is no player registered with that username."; 
    echo $errorid; 

    } 
を置きます

私は現時点でテストしているユーザー名 "Syvered"と、ログインフォームでそのユーザー名を使用しようとしているときにデータベースにエントリを作成しました($ playernameはユーザーが入力したユーザー名です)それはまだ "そのユーザ名を持つユーザはいません"と言います。これは、何らかの理由でmysqli_stmt_num_rows($ stmt)が0を返すことを意味します。これは私が理解していないものです。

私は本当にあなたに十分なことを希望しています、あなたの助けを事前に感謝します。私は残念ながら確認したが

質問は役に立ちませんでした:

答えて

4

あなたはWHERE句で変数を渡している。代わりに、プレースホルダの

WHERE username='$playername' 

、変更する必要があります:

WHERE username=? 

あなたは準備済みのステートメントを使用したいからです。

$playernameが値を持っているし、あなたが成功しmysqli_ APIを使用して接続したことことを確認します。適切なエラーチェックを使用して

は役立ったでしょう:

あなたが行が(ここではケースのように思われる)が存在するかどうかを確認するために探しているなら、準備された声明を使用して私の答えの1つを参照してください:

およびPDO法もある。

あなたが、あなたは、クエリおよび変数(複数可)で使用しているものと交換するために必要なもので、私の答え、のいずれかから取ら例:

$query = "SELECT `email` FROM `tblUser` WHERE email=?"; 

if ($stmt = $dbl->prepare($query)){ 

     $stmt->bind_param("s", $email); 

     if($stmt->execute()){ 
      $stmt->store_result(); 

      $email_check= "";   
      $stmt->bind_result($email_check); 
      $stmt->fetch(); 

      if ($stmt->num_rows == 1){ 

      echo "That Email already exists."; 
      exit; 

      } 
     } 
    } 

編集:

コードをテストした後、ここで正しく実行していないことがあります。

コードに見つからなかった結果を「保存」する必要があります。

、のは、わずかに異なるアプローチを試してみて、それが存在し、それがないことをエコーし​​、もしいない場合はチェックしてみましょう。それがそうでないことを示す。

サイドノート:複数の一致がある場合はをif($row_cnt >= 1)に使用しました。必要に応じて変更することができます。

$playername = "Syvered"; // This could also be case-sensitive. 

$stmt = mysqli_prepare($conn, "SELECT username FROM users WHERE username = ?"); 

    mysqli_stmt_bind_param($stmt, "s", $playername); 
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_store_result($stmt); // Store the results which was missing. 
    mysqli_stmt_bind_result($stmt, $dbusername); 
    mysqli_stmt_fetch($stmt); 

$row_cnt = mysqli_stmt_num_rows($stmt); 

if($row_cnt >= 1) { 

    $error = false; // Changed from true 
    $errorid = "It exists."; 
    echo $errorid; 

    mysqli_stmt_close($stmt); 

    } 

else{ 

echo "It does not exist."; 

} 
  • あなたは、条件を使用する方法に戻すが、「ストア」に結果を思い出すことができます。
+0

ありがとうございました!残念ながら、私はあなたが私に言ったことをやったが、それはまだ動作していません。質問のコードを編集しました。 – Syvered

+0

@私は私の答えで言ったように、私の答えの別のを参照してくださいhttp://stackoverflow.com/questions/22252904/check-if-row-exists-with-mysql/22253579#22253579動作し、基本的に同じことを行う。あなたがうまくいかなかった場合は、何かが失敗しています。なぜ失敗したのかについてエラーをチェックする必要があります。 –

+0

@Syveredあなたは元の投稿にロールバックをしなければなりませんでした。なぜなら、あなたは追加の編集としてそれを作ったはずですから。私は、人々が自分自身に言っただろうそれのためにdownvotedされていただろう:* "彼らはプレースホルダーを使用している、なぜ答え?" *。 –

関連する問題