PHP MYSQL 防止用户或电子邮件被插入两次
PHP MYSQL Prevent user or email inserted twice
我想防止用户输入同一封电子邮件两次,这将创建重复条目。请帮助我解决这个小问题,我已经在 Whosebug 上搜索了这个问题,但每个人都有自己的数据库和自己的方法。
谢谢
<form action="create_subscriber.php" method="post">
<input placeholder="Name" name="inputName" type="name" required/>
<input name="inputEmail" placeholder="example@email.com" name="Submit" type="email" required/>
<input name="Submit" type="submit" value="Subscribe"/>
</form>
create_subscriber.php低于
<?php
//include 'connection.php'
$dbhost = "localhost";
$dbuser = "sampleuser";
$dbpass = "samplepass";
$dbname = "sampledb";
$conn = mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname);
$name = $_POST['inputName'];
$email = $_POST['inputEmail'];
if(!$_POST['Submit']){
echo "Please enter a name & email";
//header('Location: index.php');
}else{
mysql_query("INSERT INTO subscriptions
(`ID`,`Name`, `Email`) VALUES(NULL,'$name', '$email' ) ")
or die(mysql_error());
echo "User has been added";
header('Location: success.php');
}
?>
mysql_query("INSERT INTO subscriptions
(`ID`,`Name`, `Email`) VALUES (NULL,'$name', '$email' )
WHERE NOT EXISTS (
SELECT email FROM subscriptions WHERE email='$email'
)")
由于您没有进行任何验证,您可以将电子邮件用作唯一字段并进行 REPLACE 查询。 http://dev.mysql.com/doc/refman/5.0/en/replace.html
我强烈建议您在尝试进行二次插入之前以查询检查的形式编写验证。它甚至可以通过可用的持久连接变得简单,这样您就没有执行该验证查询所需的几个滴答的开销。
只需执行初步查询以检查电子邮件的唯一性
SELECT * FROM subscriptions WHERE `email` = ?
(我以准备语句
的形式编写查询
http://php.net/manual/en/mysqli.quickstart.prepared-statements.php
您应该使用准备好的语句将值注入查询。
如果您得到任何行,则电子邮件不是唯一的,因此重定向到原始表单页面,可能会显示一条错误消息。
如果您没有得到任何记录,那么您可以继续 insert
,然后呈现一个 "mail registration succeeded" 页面。
顺便说一句:你不能 echo
某些东西然后设置 header。当您开始发送输出时 header 不能是 set/changed.
我想防止用户输入同一封电子邮件两次,这将创建重复条目。请帮助我解决这个小问题,我已经在 Whosebug 上搜索了这个问题,但每个人都有自己的数据库和自己的方法。
谢谢
<form action="create_subscriber.php" method="post">
<input placeholder="Name" name="inputName" type="name" required/>
<input name="inputEmail" placeholder="example@email.com" name="Submit" type="email" required/>
<input name="Submit" type="submit" value="Subscribe"/>
</form>
create_subscriber.php低于
<?php
//include 'connection.php'
$dbhost = "localhost";
$dbuser = "sampleuser";
$dbpass = "samplepass";
$dbname = "sampledb";
$conn = mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname);
$name = $_POST['inputName'];
$email = $_POST['inputEmail'];
if(!$_POST['Submit']){
echo "Please enter a name & email";
//header('Location: index.php');
}else{
mysql_query("INSERT INTO subscriptions
(`ID`,`Name`, `Email`) VALUES(NULL,'$name', '$email' ) ")
or die(mysql_error());
echo "User has been added";
header('Location: success.php');
}
?>
mysql_query("INSERT INTO subscriptions
(`ID`,`Name`, `Email`) VALUES (NULL,'$name', '$email' )
WHERE NOT EXISTS (
SELECT email FROM subscriptions WHERE email='$email'
)")
由于您没有进行任何验证,您可以将电子邮件用作唯一字段并进行 REPLACE 查询。 http://dev.mysql.com/doc/refman/5.0/en/replace.html
我强烈建议您在尝试进行二次插入之前以查询检查的形式编写验证。它甚至可以通过可用的持久连接变得简单,这样您就没有执行该验证查询所需的几个滴答的开销。
只需执行初步查询以检查电子邮件的唯一性
SELECT * FROM subscriptions WHERE `email` = ?
(我以准备语句
的形式编写查询http://php.net/manual/en/mysqli.quickstart.prepared-statements.php
您应该使用准备好的语句将值注入查询。
如果您得到任何行,则电子邮件不是唯一的,因此重定向到原始表单页面,可能会显示一条错误消息。
如果您没有得到任何记录,那么您可以继续 insert
,然后呈现一个 "mail registration succeeded" 页面。
顺便说一句:你不能 echo
某些东西然后设置 header。当您开始发送输出时 header 不能是 set/changed.