【问题标题】:Unique entry verification using MySQL and PHP使用 MySQL 和 PHP 的唯一条目验证
【发布时间】:2012-04-16 13:04:49
【问题描述】:

我需要验证注册网站的用户是否输入了一个唯一的 16 位数字,在他/她之前没有其他人输入过。

相关的数据库信息是16位数字存储在一个名为card1的列中,整个表的名称为users,用户输入的数字存储在$card1中。

这是我目前所拥有的......

$query2 = "SELECT card1 FROM users WHERE card1='$card1' LIMIT 1";
$result2 = smart_mysql_query($query2);

if (mysql_num_rows($result2) != 0)
{               
    header ("Location: register.php?msg=exists");
    exit();
}

这个想法是它会找到数据库中已经存在的任何示例,如果找到重复项,它将显示并显示错误消息。

问题在于,即使存在重复,它仍继续允许用户注册(将他们的注册表单提交到数据库)。紧随此代码块之后是对数据库的插入调用,其中包含从表单中收集的所有用户信息。

注意:我对处理 PHP 错误消息不是很熟悉,我使用的只是我在示例代码的另一个实例中找到的一个示例。

【问题讨论】:

    标签: php mysql database select


    【解决方案1】:

    像这样制作 if 语句:

    $query2 = "SELECT * FROM users WHERE card1='$card1'";
    $result2 = mysql_query($query2);
    
    if ($result2 !== false)
    {               
       header ("Location: register.php?msg=exists");
       exit();
    }
    

    应该解决问题:)

    【讨论】:

    • 我已经尝试了你回答的两个版本,但它还没有奏效。不同的 if 语句有什么作用?
    • 当 mysql 数据库返回 0 行时,php 脚本会给你一个布尔值,它会被设置为 false。此 if 语句将检查查询结果是否为 false 以及是否抛出错误。
    • 试试新的代码。我稍微改变了查询,现在 smart_mysql_query 是 mysql_query
    • 我也尝试了新查询,但没有成功。新用户帐户仍在创建中,并且已成功导航到新页面。
    • hmmm 你能做一个var_dump($_POST)var_dump($_GET) 看看表单/用户给出了什么吗?也许$card1 变量没有正确设置?
    【解决方案2】:

    执行此操作的正确方法是在包含用户输入的数字的字段上添加唯一索引 (card1)。

    然后您将尝试INSERT 新行,而不是先尝试SELECT,如果此操作失败,您会将用户重定向到msg=exists 页面。这让数据库可以处理重复检测并消除您方法中固有的问题 - 如果两个用户同时提交相同的号码,则无法保证 SELECT -> INSERT 会检测到它。唯一索引将检测并防止这种情况发生。

    这还具有减少数据库流量的优势,因为只需执行一个查询即可实现这一点。

    【讨论】:

    • 虽然此解决方案可行,但它的一个问题是很难确定 INSERT 语句失败的原因并根据错误状态向用户返回有意义的消息
    • 这个想法是否类似于@rkosegi 在下面发布的答案?
    • @AndreLackmann 我不知道这是否会造成这么大的问题。是不是有可能已经有一个用户在里面有相同的号码,我可以通知用户并让他们重新提交另一个?
    • @Mike - 以非常简单的方式确定。我并不是说您错了,只是恕我直言,这不是最佳做法。我这样说是因为您可能在用户表中有其他具有类似约束的字段(可能是电子邮件字段上的唯一索引)。如果是这种情况并且您的查询失败,您将无法轻松确定是哪个约束导致 INSERT 失败。也就是说,将相应的 INSERT 更改为 UPDATE,您就有了更具体的解决方案
    • @AndreLackmann 够公平的。实际上,我确实有一个针对同一表单的电子邮件验证的工作示例,但问题的处理方式与我上面的代码相同。事实上,我使用该结构作为如何处理数字唯一性问题的模型。
    【解决方案3】:

    首先,在该列的数据库中创建唯一索引。 这是最佳做法:

    ALTER TABLE `users`
    ADD UNIQUE INDEX `card1` (`card1`);
    

    我应该修改你的 SQL 如下:

    $query2 = "SELECT COUNT(1) FROM users WHERE card1='$card1'";
    $res = mysql_query($query2);
    
    $data = mysql_fetch_array($res);
    
    if ($data == 1)
    {               
       header ("Location: register.php?msg=exists");
       exit();
    }
    

    它将检查表中是否存在行并返回0或1。

    如果存在 (1),那么它将重定向您。

    【讨论】:

    • $res 来自哪里?
    【解决方案4】:

    试试这个

    $query2 = "SELECT card1 FROM users WHERE card1='".$card1."' LIMIT 1";
    $result2 = mysql_query($query2);
    
    if (mysql_num_rows($result2) > 0)
    {               
        header ("Location: register.php?msg=exists");
        exit();
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      相关资源
      最近更新 更多