2013-03-07 1 views
0

Я делаю страницу регистрации PHP для своего сайта, и в настоящее время я использую этот код ниже для действия регистрационной формы. В настоящее время, если вы обновите страницу, после отправки данных в базу данных, она будет повторно отправлена. Я знаю, как использовать перенаправление заголовка, и я также буду использовать его. Хотя я хочу сделать это там, где есть другой пользователь с тем же именем пользователя, чтобы сценарий не отправлялся в базу данных. Как я буду делать это с помощью функции IF?Страница регистрации PHP, прекращение дублирования материалов

<?php 
include 'dbconnect.php'; 
$birth_year= $_POST['year']; 
$birth_month= $_POST['month']; 
$birth_day= $_POST['day']; 
$birthday=$_POST['year'].'-'.$_POST['month'].'-'.$_POST['day']; 
$password=md5($_POST['password']); 
$sql = "INSERT INTO users  (first_name,last_name,username,password,email,gender,birthday) VALUES (:first_name,:last_name,:username,:password,:email,:gender,:birthday)"; 
$q = $conn->prepare($sql); 
$q->execute(array(':first_name'=>$_POST['first_name'], 
      ':last_name'=>$_POST['last_name'], 
      ':username'=>$_POST['username'], 
      ':password'=>$password, 
      ':email'=>$_POST['email'], 
      ':gender'=>$_POST['gender'], 
      ':birthday'=>$birthday)); 
?> 
+0

@UnholyRanger Что это значит? –

+0

«Уникальный индекс» предотвратит использование нескольких строк с одинаковым значением. Поэтому, если пользователь A имеет имя пользователя: альфа и пользователь B пытается его использовать, вставка не будет выполнена. Это также предотвратит повторную отправку (не полностью, но в БД) – UnholyRanger

+0

@unholyranger Хорошо, это хорошо! Но как я могу показать это пользователю? –

ответ

0

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

Лучше всего обойти это использование POST/REDIRECT/GET pattern. Я использовал его в примере около processing payments that I wrote for Authorize.Net. Надеюсь, это указывает на то, что вы в правильном направлении.

2

Получить количество строк, где username=$_POST['username']:

$username = $_POST['username']; 
$checkexisting = $conn->prepare("SELECT COUNT(*) FROM users WHERE username=:username"); 

if($checkexisting->execute(array(':username' => $username))->fetchColumn() == 0) { 
    // username does not exist 
    // fetch column returns the first column from the select statement, which is COUNT(*) 
} 

Или сделать столбец имя пользователя уникальный идентификатор. Это предотвратит любые повторяющиеся значения для этого столбца непосредственно в базе данных. Вы должны быть готовы к вашим операторам SQL, чтобы затем выдавать ошибку.

Также, чтобы помочь с обновлением и повторной отправкой формы, посмотрите на ответ Джона с помощью POST/REDIRECT/GET.

+0

Подождите, откуда будет идти запрос? Если вы не возражаете сделать это в моем коде? Это было бы прекрасно. –

+0

Запрос выполняется в условии if. Если количество '$ username' в базе данных равно 0, то вы хотите продолжить вставку пользователя. Таким образом, заключительная инструкция 'INSERT' будет проходить между условным. – Sam

1

Сценарий не будет «отправляться в базу данных». Ваш скрипт будет запускать запрос, чтобы попытаться вставить строку в базу данных. Если имя пользователя должно быть уникальным, то сделайте его уникальным индексом, и оператор SQL INSERT завершится с ошибкой и вернет вам код, сообщающий вам, что эта конкретная запись уже существует.

+0

Итак, если я сделаю имя пользователя уникальным, это предотвратит другую учетную запись с тем же именем пользователя? Как я могу показать это пользователю? –

+0

Как вы просили, ответ: echo 'Это имя пользователя уже используется'; но я не могу поверить, что это именно то, что вы хотели спросить. Можете ли вы расширить свой вопрос? –

+0

хорошо с уникальным, он не позволит дублировать имена пользователей. Но какой будет код для ошибки? Как мой код знает, когда это показывать? –