我正在数据库系统上工作,我正在尝试避免电子邮件和用户名的重复条目。 我已经尝试过,但它仍然被拒绝,但无法确切看到被拒绝的内容。有人可以解释我错在哪里吗?
if(isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$sql="INSERT into users (username,password,email) VALUES('$username','$password','$email')";
$result = mysql_query("INSERT INTO users VALUES ('duplicate')");
if (!$result) {
echo "Enter a different value";
} else {
echo "Save successful.";
}
}
我制定这个答案只是为了向您展示检查重复项和插入的基础知识。
最终应在给定列上设置 UNIQUE 约束,并根据错误结果使用条件语句。
请参阅下面有关安全性的脚注。
旁注#1:如果您不想检查电子邮件和用户名是否存在,则可以删除OR Username= '".$username."'
。
旁注#2: - 我不确定您的列名称是否大小写混合,因此您可能需要进行一些调整。
- 电子邮件或电子邮件 - 密码或
- 密码 - 用户名或用户名
旁注 #2: - 确保所有元素都包含 name 属性,并且表单确实使用 POST 方法。
首先查询,然后如果用户/电子邮件不存在,则执行插入。
假设您已经建立了数据库连接:(请参阅脚注下方"建立数据库连接"下的其他注释)。
if(isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$query = "SELECT * FROM users
where email='".$email."'
OR Username= '".$username."'";
$result = mysql_query($query);
if(mysql_num_rows($result) > 0){
echo "A record already exists.";
exit;
}
else{
$insert = mysql_query("INSERT into users (email, Username, Password)
VALUES ('".$email."','".$username."', '".$password."')");
}
if($insert){
echo "Success";
}
else{
echo "There was an error " . mysql_error();
}
mysql_close();
} // brace for if(isset($_POST['submit']))
您也可以替换
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
跟
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$email = mysql_real_escape_string($_POST['email']);
以增加安全性,直到开始使用预准备语句。
脚注:
关于安全。
不要使用较旧的mysql_
API,也不应以纯文本形式存储密码。
将 mysqli
与预准备语句一起使用,或将 PDO 与预准备语句一起使用。
对于密码存储,请使用CRYPT_BLOWFISH或 PHP 5.5 的password_hash()
函数。
对于 PHP <5.5,请使用 password_hash() compatibility pack
.
将错误报告添加到文件顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告只应在暂存中完成,而不应在生产环境中完成。
建立数据库连接:
即从mysql_select_db()
手册:
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Not connected : ' . mysql_error());
}
// make foo the current db
$db_selected = mysql_select_db('foo', $link);
if (!$db_selected) {
die ('Can''t use foo : ' . mysql_error());
}
检查您的 mysql 表定义,如果电子邮件和用户名列设置了唯一键。如果没有此标志表,仍接受所有电子邮件和用户名。
如果发生不好的事情,还要尝试获取信息。
if (!$result) {
die('Invalid query: ' . mysql_error());
}
只需将电子邮件和用户名的表列的结构设置为唯一那么一切都会好起来的。如果您尝试插入重复数据它不会插入,mysql_query会返回假
创建表时...
CREATE TABLE table_name (
column_name data_type(size) constraint_name
)
。您可以使用UNIQUE
约束,如下所示:
CREATE TABLE table_name (
column_name data_type(size) UNIQUE
)
此约束不区分大小写,这意味着"UsErNaMe"和"用户名"被视为相同。
单击此处了解有关此约束的更多信息。