Php 确保用户名和电子邮件地址是唯一的

Php 确保用户名和电子邮件地址是唯一的,php,sql,Php,Sql,我正在尝试验证我的数据库中是否存在用户名和电子邮件地址,并尝试执行if、elseif、else语句,但均无效 我想首先运行一个检查,看看用户名是否正确-显然,如果不正确,将出现一个echo语句。如果用户名不存在,请运行elseif语句以查看电子邮件地址是否唯一-如果不唯一,将再次显示另一个echo语句。对于最终语句,如果所有其他条件返回false,我希望运行下面的代码,以便将用户的输入提交到数据库 我最初试图用一条语句声明两个变量,以检查username=$username和email_addr

我正在尝试验证我的数据库中是否存在用户名和电子邮件地址,并尝试执行if、elseif、else语句,但均无效

我想首先运行一个检查,看看用户名是否正确-显然,如果不正确,将出现一个echo语句。如果用户名不存在,请运行elseif语句以查看电子邮件地址是否唯一-如果不唯一,将再次显示另一个echo语句。对于最终语句,如果所有其他条件返回false,我希望运行下面的代码,以便将用户的输入提交到数据库

我最初试图用一条语句声明两个变量,以检查username=$username和email_address=$email_address,然后检查mysqli_查询返回的行数是否超过用户名的1。我输入了一个elseif语句,该语句与电子邮件地址相同,但在{}括号中有一个else语句,代码如下

我删除了原始代码,因为抛出了太多的错误,而且可能太复杂和混乱了,因为有一种更优雅的方式来完成我的工作

任何帮助都将不胜感激

if(isset($_POST['submit']))
    {
$sql = "INSERT INTO users (first_name, last_name, username, email_address, password,    gender, city, country, verification_code, verified, sign_up_date) VALUES (
'$first_name',
'$last_name',
'$username',
'$email_address',
'$password',
'$gender',
'$city',
'$country',
'$verification_code',
'1',
'$sign_up_date')";
    $result = mysqli_query($conn,$sql);
    header("Location:confirmation.php");
}   
您需要的是对数据进行完整性检查。您应该在数据库中执行此检查。最简单的方法是使用唯一的约束/索引:

create unique index unq_users_username on users(username);
create unique index unq_users_email on users(email);

如果您试图插入或更新一行,使其违反这些约束,则数据修改步骤将失败并出现错误。

您需要为它们创建索引。 使用以下命令创建索引:

CREATE UNIQUE INDEX index_name ON table_name (column_name)

查看此链接了解更多信息:

您可以先编写一个函数来检查数据库,例如:

$errors = []; // you can add errors to this array.
if (isset($_POST['submit']))
{
    // first do your validation here against empty values and invalid email

    $sql = "SELECT * from users where email='$email' and username='$username'";
    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result) > 0) {
       $errors[] = "Username and email has been taken.";
    }

    if (!empty($errors))
    {
       // loop through your errors and echo them
    } else {
      // insert your values into the database 
    }
}   

您可以使列具有唯一的约束。我可以在哪里注册我的朋友,永远不要存储纯文本密码!请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,请确保对它们进行了清理或使用了任何其他清理机制。这样做会更改密码并导致不必要的额外编码。@JayBlanchard密码是sha512,带有两种盐用于加密。这还不够@DreamException。PHP函数提供了随机盐和比SHA512Hi更好的散列方法,我添加了唯一约束,它似乎不接受提交的数据(朝着正确的方向迈出了一步)。我需要在网页上有什么PHP代码来明确地告诉用户有错误,并且电子邮件地址和/或用户名已经在使用中?您需要捕获错误并给用户一条适当的消息。因此,在数组中使用错误代码1062将检查重复条目。我刚刚添加了这个,但它会转发到重定向页面:`
result=mysqli\u query($conn,$sql)如果(mysqli_errno($result)==1062){`echo“用户名/电子邮件地址已在使用”`}或者{`header(“Location:confirmation.php”);`}}}}}`如果使用唯一约束,则此代码无效此代码很简单,它只检查是否有任何具有相同值的记录传递给它。如果是,它将不会插入它,因为插入过程在
else
语句中进行。我刚刚尝试了您的代码,在第一个if语句后面的行中得到了意外的“}”。忘记了分号。加上去了,快到了。只需再修复一个错误:警告:mysqli_num_rows()期望参数1是mysqli_result,给定布尔值