2017-02-21 2 views
1

Добрый день! Im пытается сделать регистрацию на моей веб-странице, и у меня есть проблема - происходит регистрация, но она может создавать несколько пользователей с одинаковыми символами, а также одинаковые электронные письма и не давать ошибку, если пароли не совпадают.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

Вт шляпа, вы имеете в виду под «* несколько пользователей с одинаковыми символами»? Можете привести несколько примеров? И вы не * на самом деле * выполняете запрос для проверки по электронной почте, вы используете '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-программирование и скоро начну ООП, поэтому я не совсем понимаю все, но сейчас изучу ваш код и предоставил ссылки. Hudge thanx! Постскриптум Нет необходимости в «addlashes» перед $ _POST? –

+0

Это объектно-ориентированный подход MySQLi, да. Вы также можете использовать процедурный, если хотите, руководство каждой функции показывает вам, как (например, 'mysqli_prepare ($ link," ... ")' вместо '$ link-> prepare (" .. ")') И нет , 'addslashes()' - это ужасная функция для использования подобным образом, используйте параметризованные запросы, как описано выше, и вам не придется скрывать кавычки в запросе. – Qirel

Смежные вопросы