信息双MYSQL时ID出错

时间:2016-02-12 15:55:36

标签: php html mysql

我已经创建了一个数据库,所以人们可以参加比赛(这是一个学校项目),我添加了一些东西,所以你不能有两倍相同的电子邮件地址,但是当有重复的输入时,ID将会还算数。因此,例如有人想要加入电子邮件“helloworld@gmail.com”并且他获得ID 2然后他再次尝试,他将得到一个错误,该电子邮件已经被采取,但下一个想要登录的人,将获得ID 4而不是3.如果你能够这样做,那么数据库从签名的人那里保存了一个IP,我对它也很好,导致那就是我实际想做的。但只要你解决问题,我很高兴。谢谢! (我不知道为什么,但代码总是混乱......

<?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>

    

2 个答案:

答案 0 :(得分:-1)

this Q&A开始,InnoDB由于rollback策略而增加。所以他们允许Id之间的差距。我现在看到两个选择:

  1. 为每个人提供生成的id,不关心差距并询问db中有多少条目 SELECT COUNT(*) FROM table_name;
  2. 在插入之前询问数据库是否已经采取了邮件地址。有点像this Q&A
  3. 编辑: Take a look at this了解获取IP adress的方式。由于大多数人都会在学校注册,你可能会发现你的学校ip多次出现;) 希望它有所帮助!

答案 1 :(得分:-1)

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

&#34;自动增量代理键对内部应用程序使用很有用。永远不要将这些传递给用户。&#34;见这里: - ID Best Practices for Databases

如果您真的想完全控制用户号码,可以选择几种方式。

向表中添加新字段。在每次插入新用户之前,查询数据库,排序,降序以查找当前最高编号。插入具有该数字的新用户+1。

或者您可以使用单独的表来维护&#34;下一个id来分配&#34;并将其保存在你的&#34; inschrijven&#34;表。你甚至可以用10,000开始,所以所有用户都得到一个数字相同的数字。 所有在同一个事务中,读取新表,增加数字和UPDATE并将该数字用于新订户。那就是你给他们的数字。 ISN(内部序列号)仍然是关键。

在这两种情况下,如果删除用户,都会有间隙。