【问题标题】:Ensure username and email address are unique确保用户名和电子邮件地址是唯一的
【发布时间】:2017-03-10 19:24:46
【问题描述】:

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

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

我最初尝试使用语句声明两个变量以检查 username=$username 和 email_address=$email_address 然后检查从 mysqli_query 返回的行数是否大于 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");
}   

【问题讨论】:

  • 您可以使列具有唯一约束。
  • 在哪里可以注册我的朋友Bobby Tables
  • 永远不要存储纯文本密码!请使用 PHP 的 built-in functions 来处理密码安全问题。如果您使用的 PHP 版本低于 5.5,您可以使用 password_hash() compatibility pack。在散列之前,请确保您 don't escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。
  • @JayBlanchard 密码是 sha512,带有两个用于加密的盐。
  • 这还不够好@Dreamception。 PHP 的函数提供随机盐和比 SHA512 更好的散列方法

标签: php sql


【解决方案1】:

您想要的是对数据进行完整性检查。您应该检查内部数据库。最简单的方法是使用唯一的约束/索引:

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

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

【讨论】:

  • 嗨,我添加了唯一约束,它似乎不接受正在提交的数据(朝着正确的方向前进)。我需要在网页上使用什么 PHP 代码来明确告诉用户出现错误并且电子邮件地址和/或用户名已被使用?
  • 您需要捕获错误并向用户提供适当的消息。
【解决方案2】:

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

CREATE UNIQUE INDEX index_name ON table_name (column_name)

查看此链接了解更多信息:https://www.w3schools.com/sql/sql_create_index.asp

【讨论】:

    【解决方案3】:

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

    $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 
        }
    }   
    

    【讨论】:

    • 因此在数组中使用错误代码 1062 将检查重复条目。我刚刚添加了这个,但它转发到重定向页面:`result = mysqli_query($conn,$sql); if (mysqli_errno($result) == 1062){` echo "username/email address already in use"; ` } else { ` header("Location:confirmation.php"); ` } ` } `
    • 如果您使用 UNIQUE 约束,那么此代码将不起作用 此代码很简单,它只是检查您是否有任何具有相同值的记录传递给它。如果是这样,它将不会插入它,因为else语句中的插入过程。
    • 我刚刚尝试了您的代码,但在第一个 if 语句之后的行中出现了意外的 '}'。
    • 忘记了分号。添加它。
    • 快到了。还要修复一个错误:警告:mysqli_num_rows() 期望参数 1 为 mysqli_result,给定布尔值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2014-03-26
    相关资源
    最近更新 更多