数据库检查两列的唯一性(如果不满足,则在PHP中输出错误消息)

数据库检查两列的唯一性(如果不满足,则在PHP中输出错误消息),php,mysql,Php,Mysql,我正在尝试在我的网页中进行数据库检查,以确保两列first_name和last_name是唯一的。在MySql中,我已经将这两列作为唯一列 我希望在网页上执行此检查,如果表中已列出名和姓,则返回错误消息。如果Tom Jones已经在表中,则如果在表单中输入Tom Jones,则会出现错误。我下面的语句检查这种唯一性,但它检查表中的所有行。我需要它来逐行检查。member_no是主键,我想用它搜索,但是,我想检查每一行的唯一性,我没有要搜索的特定数字 这只是在网站/表单端,因为first_name

我正在尝试在我的网页中进行数据库检查,以确保两列first_name和last_name是唯一的。在MySql中,我已经将这两列作为唯一列

我希望在网页上执行此检查,如果表中已列出名和姓,则返回错误消息。如果Tom Jones已经在表中,则如果在表单中输入Tom Jones,则会出现错误。我下面的语句检查这种唯一性,但它检查表中的所有行。我需要它来逐行检查。member_no是主键,我想用它搜索,但是,我想检查每一行的唯一性,我没有要搜索的特定数字

这只是在网站/表单端,因为first_name和last_name的唯一语句在MySql上已经处于活动状态

还是有更直接的方法来检查表中的唯一性

我的声明如下:

$command = "SELECT * FROM member_info";
$member_result = mysql_query($command);
$mdata = mysql_fetch_object($member_result);
if ($first_name == $mdata->first_name && $last_name == $mdata->last_name) {
$error_message = "The first and last names must be unique. ";
} 
这将检查表,但不会区分行。如果第1行是Tom Jones,第2行是Bob Smith,并且如果我将“Tom Smith”放入表格中,则错误将返回为非唯一错误

可以使用where子句:

从成员信息中选择*,其中first_name={$first_name}和last_name={$last_name}

您可以乐观地尝试插入重复的密钥消息,然后对其做出合理的反应

如果first_name和last_name位于多列唯一索引中,那么您可以继续插入值。如果插入的值已经存在于数据库中,则会出现这样的错误,然后可以从中获取

要创建多列唯一索引,可以如下更改表:

ALTER TABLE `member_info` ADD UNIQUE (`first_name`, `last_name`);
然后插入如下内容:

$sql = "INSERT INTO `member_info` (`first_name`, `last_name`) VALUES ('{$first_name}', '{$last_name}')";
不过,您应该首先确保$first_name和$last_name是安全的。如果没有,那么您将有安全漏洞。

第一个功能被删除。使用

首先要清除用户输入。从这一点上,我将假设$first_name和$last_name是清理过的变量,可以在MySQl语句中使用

$query = "SELECT COUNT(*) FROM `member_info` WHERE `first_name`='$first_name' AND last_name='$last_name'";
$member_result = mysqli_query($command);
$mdata = mysqli_fetch_assoc($member_result);

if($mdata['COUNT(*)'] > 0) {
    //user with that first and last name already exists
}

为了跟踪唯一的字符串值,我认为最通用的解决方案是使用字符串值的散列来维护另一个列,并向该列添加唯一约束,但在某些情况下可能会有些过分。修改记录数据时会产生开销;您还应该使用触发器自动更新哈希值


请记住,字符列上的索引有一个字节限制问题&本文也提到了解决方案。不过,对于短字符串,您可以使用@sverri建议的复合索引解决方案。

您想检查数据库中是否存在该用户??我想更简单的方法是:在我的表中,名字和姓氏标记为唯一。如果我在MySql中输入了一个已经使用过的名称,我会收到一条错误消息。我想做的是将错误消息输出到我的网页表单。即使没有基于第一个选项的重复记录,插入仍然可能失败。另一个进程可能在您检查记录是否存在时插入了记录。幸运的是,查询不仅返回Ummm tha is error,还返回errornumber,因此很容易区分重复密钥与语法错误或服务器消失。我认为两行测试脚本显示了差异。这是真的。我只是想指出,检查记录是否已经存在不是很有用。@Arjan我不明白你的意思。如果你乐观地插入,并得到重复的关键错误,其他一些汤姆史密斯更快,如果不是,你已经插入了第一个。但您是对的,解决方案1有这个问题,只要您不锁定或处理select和insert之间的区域。