我正在编写需要注册的webapp。我希望我的用户能够注册电子邮件地址或电话号码。然后他们可以使用电话号码,电子邮件地址或用户名登录,就像facebook,twitter,Instagram等。
我的问题是如何在后端数据库中处理这个问题? 登录时如何处理?如何理解天气输入的值是电话号码还是电子邮件(注册时)?我是否需要为具有唯一约束的数据库中的每个用户分别使用三个字段,还是它们应该在一起?
非常感谢。
答案 0 :(得分:0)
SQL查询的更改可以使这成为可能。这是如何做到的。
<label>Username / E-Mail</label>
<span style="line-height: 1.5em;"><input type="text" name="login" /></span>
你的桌子
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` text NOT NULL,
`email` text NOT NULL,
`password` text NOT NULL,
`psalt` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
SQL查询将如下所示,因为如果用户输入用户名或电子邮件,您的登录系统应该授权
SELECT id,password,psalt FROM users WHERE (username=:login OR email=:login) AND password=:pass
你知道其余的
答案 1 :(得分:0)
<强> 1。我是否需要为具有唯一约束的数据库中的每个用户分别使用三个字段? 可能是的。用户可以根据他们喜欢的选项使用三个选项中的一个。由于您不知道它们会给您哪个字段,因此所有字段都可以接受null(即可以为空)。但是你必须检查你提交的所有值中的一个,只包含一个电子邮件或电话号码或用户名。 而且我确信你除了上述三个之外还需要其他价值,例如密码等。
<强> 2。如何在登录查询中处理它?如何理解输入的值是电话号码或电子邮件(注册时)? 正则表达式将解决该问题(当他们登录时)。 当他们注册时,给他们提供选项,如下面简要说明。但是当他们登录时使用正则表达式来确定他们是使用用户名登录还是使用电话号码登录,或者使用电子邮件登录并采取适当的措施。 您可以通过Google搜索在线查找正在使用的语言的正则表达式教程。
说明 既然你在谈论网络应用程序,我认为涉及到html,无论你使用什么作为标记,都必须有三个输入字段作为选项,你可以让你的用户知道只有一个就足够了。也就是说,你不希望他们给他们的电话号码。并同时发送电子邮件。请注意,如果您需要用户名进行注册,并且希望选择使用用户名和密码对进行登录,则每个用户名必须是唯一的。在这种特殊情况下,您需要在输入用户名输入字段后立即查询数据库,以检查是否已使用用户名。这可以使用Ajax来完成 你可以在网上找到ajax教程。如果它被采取你让他们知道并阻止他们提交,但如果不是,他们可以继续。 如上所述,您需要让他们知道他们只能提供用户名或电话号码或电子邮件地址,但不能同时提供这两者。你可以通过包括“或”来做到这一点。就在田野上方。 为了强制它们只键入其中一个值,您需要在它们开始键入任何可选字段时进行捕获,因此如果它们已经开始在一个字段中键入,则禁用或隐藏其他两个字段。使用这个特殊的解决方案,你甚至不需要正则表达式,你只需要包含一个属性,可以帮助你确定它们给你的价值类型,例如:
<form class="form-inputs">
<div class="unique-options">
<span> Phone No </span>
<input class="opts" id="phone-no" type="phone">
<span> Or email </span>
<input class="opts" id="email-address" type="email">
<span> Or username </span>
<input class="opts" id="username" type="email">
</div>
<span> Password </span>
<input type="password" id="psw-input">
<button type="submit" id="submit-btn">Submit</button>
</form>
&#13;
使用javascript确定他们给你的价值。这里使用的是jquery
var valueType,ph,em,usrn,passw;
ph = $("#phone-no");
em = $("#email-address");
usrn = $("#username");
passw = $("#password").val();
$("input.opts").keyup(function(e){
/* If they've begun typing in one input field, hide the rest two */
valuType = $(e.target).attr("id");
if(valueType == "phone-no"){
em.prev.hide();
usrn.prev.hide();
em.hide();
usrn.hide();
} else if(valueType == "email-address"){
ph.prev.hide();
usrn.prev.hide();
ph.hide();
usrn.hide();
} else if(valueType == "username"){
em.prev.hide();
ph.prev.hide();
em.hide();
ph.hide();
}
)};
$("#submit-btn").click(function(e){
$(e).preventDefault();
/*
* I assume you have three separate scripts on the server
* to handle the query
* for each three inputs you are expecting
*/
if(valueType == "phone-no"){
$.post( 'http://script-that-inserts-into-phone-no-field',
data: {phone: valueType, password: passw},
function(data) {
},"text/html"
);
} else if(valueType == "email-address"){
$.post( 'http://script-that-inserts-into-email-field.extension',
data: {email: valueType, password: passw},
function(data) {
},"text/html"
);
} else if(valueType == "username"){
$.post( 'http://script-that-inserts-into-username-field.extension',
data: {username: valueType, password: passw},
function(data) {
},"text/html"
);
}
});
&#13;
因此,您可以使用服务器端脚本来检查值类型是否为phone-no您在phone-no列中插入用户提供的值,而将其他两列(email&amp; username)null(对于该行) )。
您可以检查您是否知道如何在标记元素中附加属性和值并检索服务器上的值,有时使用Javascript捕获有用字段并将它们保存的相关值提交给服务器可能会很优雅。
请注意,您没有提及正在使用的服务器端语言,因此这篇文章并非针对特定语言。
您可以将值提交给一个脚本,而不是在提交脚本并让多个脚本处理上述每个案例之前尝试确定它们为您提供的值类型。 但是这一个脚本需要在三个变量中存储三个查询,并且您使用的查询变量将由接收到的valueType的值确定。 我不知道你正在使用的服务器端语言,我可以把它包括在内。
这只是为了让您了解您能想到的内容,如果您使用此解决方案,请注意代码未经过测试但应该按预期工作。