mysql автоинкремент и уникальное поле

Я пишу следующую команду в php:

$query="insert into tableone (user_name, password, name, email) values('$user_name', '$password',   '$name', '$email')";
if(mysql_query($query))
{
header("Location:thislocation.php");
} else {
echo '<br><br><font color="red"><strong>Username or EmailId already exists. Please try different Username.<br> If you have forgotten your Password <a href="forgotmypassword.php" title="Forgot Password?" alt="Forgot Password?"><u><i>click here</i></u></a>.</strong></font><br>';
}

Здесь, в mysql-db, я сделал имя и поле электронной почты уникальными, а идентификатор — автоматическим приращением, чтобы ни у одного человека не было одинаковых регистрационных записей. Проблема в том, что, если кто-то использует то же имя пользователя или адрес электронной почты, запрос не выполняется и выполняется оператор else. Но он автоматически увеличивает идентификатор без добавления записей в БД. Если кто-то после этого успешно регистрируется, он получает идентификатор не на 2 больше, чем предыдущий.

Как получить автоинкремент только один раз?

0

Решение

Что вам нужно сделать, это запустить num_rows на нем, прежде чем вставить его. что делает num_rows, он подсчитывает, сколько записей возвращает SELECT, поэтому, если он возвращает 1, в базе данных есть место, где есть совпадение, если он возвращает 0, совпадения нет

$selectSql = "SELECT * FROM tableone WHERE name= '".$name."' OR email = '".$email."'";
$result = mysql_query($selectSql, $YOUR_DATABASECONNECTION);
$num_rows = mysql_num_rows($result);
if($num_rows){
echo "email or name is already taken";
}else{
$query="insert into tableone (user_name, password, name, email) values('$user_name', '$password',   '$name', '$email')";
if(mysql_query($query))
{
header("Location:thislocation.php");
} else {
echo '<br><br><font color="red"><strong>Username or EmailId already exists. Please try different Username.<br> If you have forgotten your Password <a href="forgotmypassword.php" title="Forgot Password?" alt="Forgot Password?"><u><i>click here</i></u></a>.</strong></font><br>';
}
}

Это хороший способ убедиться, что ошибка, о которой вы говорите, не произойдет

0

Другие решения

Там нет реального решения; так работают идентификаторы автоинкремента. Идентификаторы не предназначены для того, чтобы быть «чистыми», они предназначены для полного удовлетворения потребности в возможности связывать данные вместе.

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

Единственная причина, по которой они «в порядке» — это простой способ их создания.

3