Как предотвратить дублирование имен пользователей в php / mysql

(Это моя первая попытка с php)

У меня очень простая страница регистрации. http://graves-incorporated.com/test_sites/member_test/register/register.php

* Я только что вспомнил, что PHP-код не отображается в источнике, поэтому вот он:

enter code here <?php include('connection.php'); if(isset($_POST['form'])){ if(empty($_POST['username']) || empty($_POST['password']) || empty($_POST['conf_pass']) || empty($_POST['email'])){ echo '<b>Please fill out all fields.</b>'; }elseif($_POST['password'] != $_POST['conf_pass']){ echo '<b>Your Passwords do not match.</b>'; }else{ $url = 'http://graves-incorporated.com/test_sites/plantation_park_2012/'; echo '<META HTTP-EQUIV=Refresh CONTENT="2; URL='.$url.'">'; echo '<b>Congrats, You are now Registered.</b>'; mysql_query("INSERT INTO users VALUES(NULL, '$_POST[username]', '$_POST[password]', '$_POST[email]')"); } } ?> 

Я хочу убедиться, что я не получаю дубликатов пользователей и / или адресов электронной почты в базе данных. Я создал уникальный ключ в MySQL для имени пользователя и электронной почты, что предотвращает его, но пользователь в реальной форме не знает этого, он все еще говорит им: «Поздравляем, вы подписались» или что там сказано … ха-ха

Итак, что я могу добавить к php-коду (и где в коде), что помешало бы этому?

Спасибо, что помогли этому главному нубу, Дэн Грейвз

     <?php include('connection.php'); if(isset($_POST['form'])){ if(empty($_POST['username']) || empty($_POST['password']) || empty($_POST['conf_pass']) || empty($_POST['email'])){ echo '<b>Please fill out all fields.</b>'; }elseif($_POST['password'] != $_POST['conf_pass']){ echo '<b>Your Passwords do not match.</b>'; }else{ $dup = mysql_query("SELECT username FROM users WHERE username='".$_POST['username']."'"); if(mysql_num_rows($dup) >0){ echo '<b>username Already Used.</b>'; } else{ $url = 'http://graves-incorporated.com/test_sites/plantation_park_2012/'; echo '<META HTTP-EQUIV=Refresh CONTENT="2; URL='.$url.'">'; $sql = mysql_query("INSERT INTO users VALUES(NULL, '$_POST[username]', '$_POST[password]', '$_POST[email]')"); if($sql){ echo '<b>Congrats, You are now Registered.</b>'; } else{ echo '<b>Error Registeration.</b>'; } } } } ?> в <?php include('connection.php'); if(isset($_POST['form'])){ if(empty($_POST['username']) || empty($_POST['password']) || empty($_POST['conf_pass']) || empty($_POST['email'])){ echo '<b>Please fill out all fields.</b>'; }elseif($_POST['password'] != $_POST['conf_pass']){ echo '<b>Your Passwords do not match.</b>'; }else{ $dup = mysql_query("SELECT username FROM users WHERE username='".$_POST['username']."'"); if(mysql_num_rows($dup) >0){ echo '<b>username Already Used.</b>'; } else{ $url = 'http://graves-incorporated.com/test_sites/plantation_park_2012/'; echo '<META HTTP-EQUIV=Refresh CONTENT="2; URL='.$url.'">'; $sql = mysql_query("INSERT INTO users VALUES(NULL, '$_POST[username]', '$_POST[password]', '$_POST[email]')"); if($sql){ echo '<b>Congrats, You are now Registered.</b>'; } else{ echo '<b>Error Registeration.</b>'; } } } } ?> 

    Какой драйвер DB вы используете? Вы ищете ошибки БД? Некоторые из них просто счастливо проплывают мимо ошибок БД, и вам нужно вызвать функцию специально для проверки ошибок БД. ваша БД должна выбросить ошибку при дублировании данных, и вы можете выбрать эту ошибку и предупредить пользователя.

    С точки зрения пользовательского интерфейса, я думаю, было бы здорово, если бы у них была возможность проверить через ajax-запрос, если имя пользователя существует в db или нет, вроде как проверка доступности.

    Это также сэкономит вам время процессора, если вы изолируете процесс проверки доступности имени пользователя, а не обрабатываете все, только чтобы узнать, что имя пользователя недоступно.

    Чтобы сделать это через jquery, я бы порекомендовал:

     $('#checkAvailabilityButton').click(function() { var usernameVal = $('#usernameField').val(); // assuming this is a input text field $.post('checkusername.php', {username=usernameVal}, function(data) { alert('data'); }); }); 

    И на вашем php end запустите запрос в своей базе данных, который будет выглядеть так:

     "SELECT Username FROM users WHERE Username = 'POSTVALUE'" if (mysql_num_rows > 0) { echo "Username is taken" } 

    Также будьте очень осторожны, чтобы не допускать несанкционированных почтовых переменных в вашу базу данных, чтобы предотвратить инъекции SQL.

    Наконец, попробуйте использовать расширенную расшифровку PHP-базы данных, такую ​​как MySQLi, большинство запросов STMT автоматически дезинфицируют переменные через mysqli_prepare.

    Удачи!

    Вы можете использовать ajax-запрос перед отправкой для проверки / предотвращения уже существует. Также в фоновом режиме после INSERT INTO … вы можете сделать SELECT FOUND_ROWS (), чтобы проверить, действительно ли оно равно 1, это означает, что одна строка вставлена. Затем перенаправьте пользователя на страницу с информацией о том, что не так. Для лучшего удобства пользователей я рекомендую первый вариант, с JQuery для реализации не потребуется много времени.