2016-02-12 59 views
0

我已经创建了一个数据库,所以人们可以参加一个竞赛(这是一个学校项目),并且我添加了一些东西,所以你不能有两次同一个电子邮件地址,但是当一个重复的输入,该ID仍然会计数。因此,例如某人想要加入电子邮件“[email protected]”,他得到ID 2,然后他再次尝试,他会得到一个错误信息,该邮件地址已被占用,但下一个想要登录的人,会得到ID 4而不是3。如果你能够让数据库保存一个来自签名者的IP,那么我也很好,因为这就是我正在尝试做的。但只要你解决了这个问题,我很高兴。谢谢! (我不知道为什么,但代码总是弄乱了......当信息双倍时,ID出错MYSQL

<?php 
// Only process the form if $_POST isn't empty 
if (! empty($_POST)) { 

// Connect to MySQL 
$mysqli = new mysqli('***', '***', '***', '***'); 

// Check our connection 
if ($mysqli->connect_error) { 
die('Kan niet verbinden met database. Probeer het later opnieuw. ' . 
$mysqli->connect_errno . ': ' . $mysqli->connect_error); 
} 

// Insert our data 

$sql = "INSERT INTO inschrijven (naam, email, aantal) VALUES ('{$mysqli->real_escape_string($_POST['naam'])}', '{$mysqli->real_escape_string($_POST['email'])}', '{$mysqli->real_escape_string($_POST['aantal'])}')"; 
    // validate agree unless you want to add 'checked' to one of the values 

    $insert = $mysqli->query($sql); 


// Print response from MySQL 
if ($insert) { 
echo "U bent succesvol ingeschreven! U heeft bootnummer: {$mysqli->insert_id}. Op de naam: . U krijgt hiervan nog een bevesteging op uw mail, uw bootnummer kan nog veranderen. Hopelijk zien we u op de BotenBouwDag 2016!"; 
} else { 
die("Error: {$mysqli->errno} : {$mysqli->error}"); 
} 


$mysqli->close(); 
} 
?> 


<HTML> 
<head> 
<title> 
Welkom op de officiëlea site van de BotenBouwDag 2016 
</title> 
</head> 
<body> 

<form method="post" action=""> 
<input name="naam" id="naam" type="text"> 
<input name="email" id="email" type="email"> 
<input name="aantal" id="aantal" type="number"> 
<input type="radio" name="eten"> Ja 
<input type="radio" name="eten"> Nee 
<input type="submit" id="submit" value="Verstuur Informatie"> 
</form> 

+0

嘿,你可能想要隐藏'db连接凭证'; –

+0

@PeterS也许是XD –

+2

为什么它在id序列中有间隙时很重要?无论如何,用户并不需要知道他们的数字ID。 – Shadow

回答

-1

由于从this Q&A采取InnoDB不会增加,因为它们rollback战略。因此,他们允许的Id之间的差距。我看到两个选项现在:

  1. 给大家生成的ID,不关心的差距,并进行查询,询问有多少项有在DB SELECT COUNT(*) FROM table_name;
  2. 询问db在插入前是否已经使用邮件地址。有点像this Q&A

编辑: Take a look at this看看如何得到IP adress。由于大多数人会在学校注册这个,你可能会发现你的学校多次ip地址;)
希望它有帮助!

+0

不。OP应该确保地址是唯一的,不用担心ID。 – Strawberry

-1

将内部自动生成的号码传递给用户并不是一种好的做法。 “

”自动递增代理键对于内部应用程序的使用非常有用,绝对不要将这些键传递给用户。看到这里: - ID Best Practices for Databases

如果你真的想完全控制用户号码,有几个选项。

在表中添加一个新字段。在每次插入新用户之前,请查询数据库,按降序排序以查找当前最高编号。插入新号码+1。

或者您可以使用单独的表来维护“要分配的下一个ID”并将其保存到“inschrijven”表中。你甚至可以用10000开始,所以所有用户都得到一个数字相同的号码。 所有在同一个事务中,读取新表,增加数字和更新并为新订户使用该数字。那将是你给他们的数字。 ISN(内部序列号)仍然是关键。

在这两种情况下,如果您删除用户,将会出现间隙。

+0

这听起来像是一个等待发生的事故 - 试图解决不存在的问题。 – Strawberry

+0

我已经看到它完成。你还能如何控制分配的数字? 在真正的商业应用中,您可能需要仔细格式化数字,并使用不同的范围。 – BryanT

+0

另外 - 我并不是说这是用来计数用户。 – BryanT