2015-12-28 2 views
1

Недавно я столкнулся с некоторыми проблемами с моей системой регистрации, я пытался предотвратить дублирование имен во многих отношениях, И уже просматривал stackoverflow. Но я не могу найти решение.Как-то не удается предотвратить дублирование имен

Вот мой код

<?php 
    if (isset($_POST['registerBtn'])) 
    { 
     $username = $_POST['username']; 
     $password = $_POST['password']; 
     $rpassword = $_POST['rpassword']; 
     $email = $_POST['email']; 
     $errors = array(); 
     $checkUsername = $odb -> prepare("SELECT COUNT(*) as total from FROM `users` WHERE `username` = :username"); 
     $checkUsername -> execute(array(':username' => $username)); 
     $countUsername = $checkUsername -> fetchColumn(0); 
     if ($checkUsername > 0) 
     { 
      $errors['Username is already taken']; 
     } 
     if (!ctype_alnum($username) || strlen($username) < 4 || strlen($username) > 15) 
     { 
      $errors[] = 'Username Must Be Alphanumberic And 4-15 characters in length'; 
     } 
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) 
     { 
      $errors[] = 'Email is invalid'; 
     } 
     if (empty($username) || empty($password) || empty($rpassword) || empty($email)) 
     { 
      $errors[] = 'Please fill in all fields'; 
     } 
     if ($password != $rpassword) 
     { 
      $errors[] = 'Passwords do not match'; 
     } 
     if (empty($errors)) 
     { 
      $insertUser = $odb -> prepare("INSERT INTO `users` VALUES(NULL, :username, :password, :email, 0, 0, 0, 0)"); 
      $insertUser -> execute(array(':username' => $username, ':password' => SHA1($password), ':email' => $email)); 
      echo '<div class="nNote nSuccess hideit"><p><strong>SUCCESS: </strong>User has been registered. Redirecting....</p></div><meta http-equiv="refresh" content="3;url=login.php">'; 
     } 
     else 
     { 
      echo '<div class="nNote nFailure hideit"><p><strong>ERROR:</strong><br />'; 
      foreach($errors as $error) 
      { 
       echo '-'.$error.'<br />'; 
      } 
      echo '</div>'; 
     } 
    } 
    ?> 
+0

Возможно, ваш запрос вызывает ошибку: у вас есть 'from' там дважды. – kittykittybangbang

+0

Не могли бы вы рассказать мне, как это исправить? –

+1

** У вас есть «от» там дважды. ** – kittykittybangbang

ответ

0

Вы можете поставить UNIQUE ограничение на имя пользователя, как например:

CREATE TABLE users 
(
    id int NOT NULL AUTO_INCREMENT, 
    username varchar(30), 
    password varchar(80), 
    email varchar(80), 
    PRIMARY KEY (id), 
    UNIQUE KEY username (username) 
) 
+0

Как это делается? Извините, я довольно новичок в этом –

+0

'CREATE TABLE users (id int NOT NULL AUTO_INCREMENT, username varchar (30), пароль varchar (80), адрес электронной почты varchar (80), PRIMARY KEY (id), UNIQUE KEY имя пользователя (имя пользователя) ' – SKY

0

Вы должны быть по сравнению с $countUsername, не $checkUsername.

if ($checkUsername > 0) 

Изменения в

if ($countUsername> 0) 

Кроме того, эта линия должна быть изменена:

if ($checkUsername > 0) 
    { 
     $errors['Username is already taken']; 
    } 

Для

if ($checkUsername > 0) 
    { 
     $errors[] = 'Username is already taken'; 
    } 

Смотрите ниже:

<?php 
    if (isset($_POST['registerBtn'])) 
    { 
     $username = $_POST['username']; 
     $password = $_POST['password']; 
     $rpassword = $_POST['rpassword']; 
     $email = $_POST['email']; 
     $errors = array(); 
     $checkUsername = $odb -> prepare("SELECT COUNT(*) as total from FROM `users` WHERE `username` = :username"); 
     $checkUsername -> execute(array(':username' => $username)); 
     $countUsername = $checkUsername -> fetchColumn(0); 
     $errors = []; 
     if ($countUsername > 0) 
     { 
      $errors[] = 'Username is already taken'; 
     } 
     if (!ctype_alnum($username) || strlen($username) < 4 || strlen($username) > 15) 
     { 
      $errors[] = 'Username Must Be Alphanumberic And 4-15 characters in length'; 
     } 
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) 
     { 
      $errors[] = 'Email is invalid'; 
     } 
     if (empty($username) || empty($password) || empty($rpassword) || empty($email)) 
     { 
      $errors[] = 'Please fill in all fields'; 
     } 
     if ($password != $rpassword) 
     { 
      $errors[] = 'Passwords do not match'; 
     } 
     if (count($errors) > 0) 
     { 
      $insertUser = $odb -> prepare("INSERT INTO `users` VALUES(NULL, :username, :password, :email, 0, 0, 0, 0)"); 
      $insertUser -> execute(array(':username' => $username, ':password' => SHA1($password), ':email' => $email)); 
      echo '<div class="nNote nSuccess hideit"><p><strong>SUCCESS: </strong>User has been registered. Redirecting....</p></div><meta http-equiv="refresh" content="3;url=login.php">'; 
     } 
     else 
     { 
      echo '<div class="nNote nFailure hideit"><p><strong>ERROR:</strong><br />'; 
      foreach($errors as $error) 
      { 
       echo '-'.$error.'<br />'; 
      } 
      echo '</div>'; 
     } 
    } 
    ?> 
+0

Кажется, что не работает. –

+0

Вам нужно начать делать еще одну отладку. Начните с того, что сделайте что-то вроде' echo $ countUsername'; exit; 'в некоторых частях вашего кода и посмотрите, какое значение для ваших переменных во время выполнения. Сделайте это с именем пользователя, которое, как вы знаете, уже существует. Должно быть очень легко найти, где ваш код идет не так. – Lock

+0

В любом случае вы можете опубликовать фиксированную версию кода sir? Извините, Im all новый в этом. –

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