0

我需要验证注册网站的用户是否输入了一个唯一的 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 错误消息不是很熟悉,我使用的只是我在示例代码的另一个实例中找到的一个示例。

4

4 回答 4

3

像这样制作 if 语句:

$query2 = "SELECT * FROM users WHERE card1='$card1'";
$result2 = mysql_query($query2);

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

应该解决问题:)

于 2012-04-16T13:08:19.527 回答
2

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

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

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

于 2012-04-16T13:10:27.443 回答
0

try this one

$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();
}
于 2013-06-26T07:30:10.410 回答
0

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

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),那么它将重定向您。

于 2012-04-16T13:11:07.870 回答