Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 设计困境:如果电子邮件地址已被使用,则发送电子邮件;电子邮件地址已注册";,但是可以';t因为可以';不要在表中添加重复项_Mysql_Security_Language Agnostic_Registration_Confirmation Email - Fatal编程技术网

Mysql 设计困境:如果电子邮件地址已被使用,则发送电子邮件;电子邮件地址已注册";,但是可以';t因为可以';不要在表中添加重复项

Mysql 设计困境:如果电子邮件地址已被使用,则发送电子邮件;电子邮件地址已注册";,但是可以';t因为可以';不要在表中添加重复项,mysql,security,language-agnostic,registration,confirmation-email,Mysql,Security,Language Agnostic,Registration,Confirmation Email,注册表格要求提供用户名和电子邮件地址。在数据通过验证后,它将被添加到账户表中。它存储用户名、密码和电子邮件地址等数据。如果已使用用户名,则会通知用户,并且不会向表中添加任何数据。如果立即通知用户该电子邮件地址已在表中,则会被视为一种错误。建议的解决方案是始终发送验证电子邮件,如果输入的用户名已经存在,电子邮件会显示“此电子邮件地址已被使用”(当然不会提供激活链接) 问题是,在它现在工作时,如果INSERT查询无法将数据插入表中,则会显示消息“Username take”。这可能是错误的,因为电子

注册表格要求提供用户名电子邮件地址。在数据通过验证后,它将被添加到
账户
表中。它存储用户名、密码和电子邮件地址等数据。如果已使用用户名,则会通知用户,并且不会向表中添加任何数据。如果立即通知用户该电子邮件地址已在表中,则会被视为一种错误。建议的解决方案是始终发送验证电子邮件,如果输入的用户名已经存在,电子邮件会显示“此电子邮件地址已被使用”(当然不会提供激活链接)

问题是,在它现在工作时,如果
INSERT
查询无法将数据插入表中,则会显示消息“Username take”。这可能是错误的,因为电子邮件地址在表中设置为“唯一”,因此如果输入相同的电子邮件地址,查询将失败。我无法再发送验证电子邮件说“此电子邮件地址已被使用”,因为表中没有包含所述电子邮件地址的记录

如何重新设计系统使其正常工作

我使用的是MySQL,表
accounts
有主键
username
唯一键
e-mail
和属性
password
activation

if(mysqli_stmt_execute($createAccount))
    echo 'Username available!';
else
    echo 'Username unavailable!';
在SQL中,是否有某种方法可以检查为何无法将查询插入表中?例如,它能告诉哪个属性有重复的值吗


如果我的问题不清楚,请告诉我。

首先运行SELECT查询以识别重复项。如果未找到重复项,则可以执行插入。

如果希望DB在插入数据时执行所需检查,并且希望能够区分添加电子邮件的失败尝试和添加用户名的失败尝试,最简单的解决方案是同时拥有
电子邮件
表和
用户名
表。您实际的
帐户
表将只保留这两个表的外键。以下是一个例子:

添加新用户现在将作为事务中的几个步骤执行。现在,您将能够知道哪一步失败(如果有)。并且处于事务中,这将保留帐户创建的原子性:

START TRANSACTION;
INSERT INTO email(value) VALUES ("x@y.com");
INSERT INTO username(value) VALUES ("Sylvain");

-- you could obtain the ID programmatically by "last_insert_id"-like function 
INSERT INTO account(username_id, email_id) VALUES (1,1); 
COMMIT;
查询给定帐户的用户名和电子邮件现在需要加入:

SELECT username.value AS username, email.value AS email 
FROM username JOIN account ON username.id = account.username_id
JOIN email ON email.id = account.email_id
WHERE account.id = 1;
我不认为这是最好的解决方案,但我认为这是你想要的。

讨论。
SELECT username.value AS username, email.value AS email 
FROM username JOIN account ON username.id = account.username_id
JOIN email ON email.id = account.email_id
WHERE account.id = 1;