2017-02-21 143 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,所以我不清楚所有的,但我會研究你的代碼並提供現在的鏈接。輕輕一碰!附: $ _POST之前沒有必要使用「addslashes」嗎? –

+0

這是MySQLi的面向對象的方法,是的。你也可以使用程序,如果你想,每個函數的手冊顯示你如何(如'mysqli_prepare($ link,「...」)''而不是'$ link-> prepare(「..」)')而不是,'addslashes()'是一個可怕的函數,使用像上面這樣的參數化查詢,你不必在查詢中轉義引號。 – Qirel