2017-02-21 17 views
1

おはようございます! 私のウェブページに登録しようとしていますが、問題があります - 登録が行われていますが、パスワードが一致していない場合、同じ記号と同じ電子メールで複数のユーザーを作成し、PHP mysql登録ページの問題

<form action = "register.php" method = "post"> 
        Select username:<br> 
        <input type = "text" name = "username"><br> 
        Your e-mail:<br> 
        <input type = "email" name = "email"><br> 
        Set password:<br> 
        <input type = "password" name = "password1"><br> 
        Repeat password:<br> 
        <input type = "password" name = "password2"><br> 
        <button>&nbsp;</button> 
       </form> 

、ここでPHPのコードです - - ここで

フォームで

<?php 



     if (isset($_POST['username']) && isset($_POST['email']) && isset($_POST['password1']) && isset($_POST['password2'])){ 


      $query = 'select * from users where username = "'.addslashes($_POST['username']).'"'; 
      $numrows = mysqli_num_rows($link,$query); 
      if($numrows == 0){ 
        $query_mail = 'select * from users where email = "'.addslashes($_POST['email']).'"'; 
        $numrows_mail = mysqli_num_rows($link,$query_mail); 
        if($numrows_mail == 0){ 
         if(isset($_POST['password1']) == isset($_POST['password2'])){ 
          $sql = 'INSERT INTO users (username,password,email) VALUES("'.addslashes($_POST['username']).'","'.addslashes($_POST['password1']).'","'.addslashes($_POST['email']).'")'; 

          $result = mysqli_query($link,$sql) or die(mysqli_error($link)); 

        if($result){ 
         echo 'Account sucsessfully created! You can now log in.'; 
        }else{ 
         var_dump($result); 
        } 
       }else { 
        echo 'Passwords must match!'; 
       } 
       }else { 
        echo 'E-mail allready registered!'; 
       } 
      }else{ 
       echo 'Username allready in use!'; 
      } 
     } 
    ?> 

誰かがここで間違っているかを説明することはできますか?

+0

Wあなたは "*同じシンボルを持つ複数のユーザー*"を意味しますか?いくつか例を挙げることができますか?そしてあなたは電子メールに対してチェックするために実際にクエリを実行しているわけではありません。あなたはmysqli_num_rows($ link、$ query_mail);を使用します。 – Qirel

+0

また、変数の使用、特にユーザー入力は、クエリで直接安全でないことに注意してください。代わりに、mysqli :: prepare()を使ってクエリのプレースホルダを使うべきです - このマニュアルには例がありますhttp://php.net/mysqli.prepare – Qirel

+0

そして 'if(isset($ _ POST ['password1'] )== isset($ _ POST ['password2'])) 'はパスワードが一致しているかどうかをチェックしていません。 – Qirel

答えて

0

このif(isset($_POST['password1']) == isset($_POST['password2']))を行うとあなたの両方が存在する、またはその両方が存在しない、パスワードが一致するかどうかを確認したい場合、あなたはif($_POST['password1'] == $_POST['password2'])のためにそれを変更しなければならないことを確認しています。

+0

ありがとうございます! –

1

プレースホルダでパラメータ付きクエリを使用する方法を確認するために、コードをいくつか変更しました。 これはセキュリティ上の重要な意味を持ちますであり、これは決して完了しない可能性が高いため「後で追加する」べきではありません。以下のスニペットでは、パスワードも正しくハッシュされています。も非常に重要です。です。セキュリティは決して無視されるべきではなく、常にアプリケーションを構築する際に最初に考えるべきものです。

<?php 
if (isset($_POST['username'], $_POST['email'], $_POST['password1'], $_POST['password2'])) { 
    $errors = array(); 

    $stmt = $link->prepare("SELECT COUNT(id) FROM users WHERE username=?"); 
    $stmt->bind_param("s", $_POST['username']); 
    $stmt->execute(); 
    $stmt->bind_result($count_username); 
    $stmt->fetch(); 
    $stmt->close; 

    $stmt = $link->prepare("SELECT COUNT(id) FROM users WHERE email=?"); 
    $stmt->bind_param("s", $_POST['email']); 
    $stmt->execute(); 
    $stmt->bind_result($count_email); 
    $stmt->fetch(); 
    $stmt->close; 

    if ($count_username) 
     $error[] = "That username already exists"; 

    if ($count_email) 
     $error[] = "That email already exists"; 

    if ($_POST['password1'] !==$_POST['password2']) 
     $errors[] = "Passwords doesn't match"; 

    if (empty($errors)) { 
     $password = password_hash($_POST['password1'], PASSWORD_DEFAULT); 

     $stmt = $link->prepare("INSERT INTO users (username, password, email) VALUES (?, ?, ?)"); 
     $stmt->bind_param("sss", $_POST['username'], $_POST['email'], $password); 
     if (!$stmt->execute()) { 
      if ($db->errno == 1062) { 
       /* Some unique values in the database was attempted inserted, might want to add some error-handling */ 
      } 
     } else { 
      /* Execution of query failed, TODO: add error-handling */ 
     } 
     $stmt->close(); 
    } else { 
     foreach ($errors as $e) 
      echo $e."\n"; 
    } 
} 

注:password_hash()の使用で、パスワード欄には、少なくとも長さ255のものであるべきである、と後でログインを検証しているとき、あなたはpassword_verify()でそれを確認する必要が - マニュアルには、上の例を保持していますちょうどそれをする方法。

これらのリンクは、ログインシステムとの関連性が高く、一般的なユーザー入力とパスワードを扱うため、お読みください。

Readingmaterialと参照

+0

これはOOP PHPだと思いますか?それでは、私はPHPプログラミングだけを学んでおり、すぐにOOPを開始するので、私はすべてをはっきりと理解できていませんが、私はあなたのコードを研究し、リンクを提供します。 Hudgeよろしく! P.S. $ _POSTの前に "addslashes"の必要はありませんか? –

+0

これはMySQLiのオブジェクト指向のアプローチです。必要に応じて手続き型を使うこともできますが、各関数のマニュアルは '$ link-> prepare(" .. ")'ではなく 'mysqli_prepare($ link、" ... ")' 'addslashes()'は、このような使い方をする恐ろしい関数です。上記のようなパラメータ化されたクエリを使用すると、クエリで引用符をエスケープする必要はありません。 – Qirel

関連する問題