code.org 中与登录系统混淆的错误
confusing bug with login system in code.org
我正在使用 code.org 制作一个小应用程序,但是,我的应用程序需要登录。创建登录名时,我希望它检查以确保数据库中不存在用户输入。我不希望多个人使用相同的用户名。当我在数据库中只有一个帐户时,它工作得很好。但是当有多个时,它就不再正确地工作了。它会检查用户的输入是否等于数据库中的用户名,它会告诉用户这是一个无效的用户名,但无论如何它都会将它们发送到下一个屏幕并保存用户输入的用户名和密码进入数据库。
这是我的不足(我对 alert
使用自己的函数,因为 code.org 不允许使用 alert
函数。)
// Alert function
function Alert(text,time) {
if(text != undefined) {
textLabel("ALERT",text);
setProperty("ALERT","background-color","black");
setProperty("ALERT","text-color","white");
if(time != undefined) {
setTimeout(function() {
deleteElement("ALERT");
},time);
}
}else{
console.log("WARNING: \"Alert()\" -> \"text\" is undefined.");
}
}
// create account button
onEvent("create-account-bt","click",function() {
readRecords("players",{},function(record) {
for(var i = 0 ; i < record.length ; i++) {
if(getText("new-username-input") != record[i].username) {
if(getText("new-passcode-input") != "") {
createRecord("players",{
username:getText("new-username-input"),
passcode:getText("new-passcode-input")
},function() {
setScreen("login-screen");
});
}else{
Alert("Incorrect passcode or username",1200);
}
}else{
Alert("Incorrect passcode or username",1200);
}
}
});
});
我已经花了 时间想弄清楚这个问题。我真的很感激任何帮助,即使它没有完全解决它。
你的做法是错误的。当你想确保没有重复时,你必须运行遍历整个数据库。如果您在浏览时找到匹配项,请发出警报并停止。但只有在最后找不到匹配项时,才添加条目。
您当前的代码会在没有匹配项时立即添加新条目。所以几乎总是直接用第一个条目。即使它找到了与第一个条目的匹配项,它也会发出警报但会继续循环,因为您没有调用 break
.
这样试试:
onEvent("create-account-bt","click",function() {
readRecords("players",{},function(record) {
var matchFound = false;
for(var i = 0 ; i < record.length ; i++) {
if((getText("new-username-input") == record[i].username) ||
(getText("new-passcode-input") == ""))
{
Alert("Incorrect passcode or username",1200);
matchFound = true;
break;
}
}
if(!matchFound) {
createRecord("players",{
username:getText("new-username-input"),
passcode:getText("new-passcode-input")
},function() {
setScreen("login-screen");
});
}
});
});
我正在使用 code.org 制作一个小应用程序,但是,我的应用程序需要登录。创建登录名时,我希望它检查以确保数据库中不存在用户输入。我不希望多个人使用相同的用户名。当我在数据库中只有一个帐户时,它工作得很好。但是当有多个时,它就不再正确地工作了。它会检查用户的输入是否等于数据库中的用户名,它会告诉用户这是一个无效的用户名,但无论如何它都会将它们发送到下一个屏幕并保存用户输入的用户名和密码进入数据库。
这是我的不足(我对 alert
使用自己的函数,因为 code.org 不允许使用 alert
函数。)
// Alert function
function Alert(text,time) {
if(text != undefined) {
textLabel("ALERT",text);
setProperty("ALERT","background-color","black");
setProperty("ALERT","text-color","white");
if(time != undefined) {
setTimeout(function() {
deleteElement("ALERT");
},time);
}
}else{
console.log("WARNING: \"Alert()\" -> \"text\" is undefined.");
}
}
// create account button
onEvent("create-account-bt","click",function() {
readRecords("players",{},function(record) {
for(var i = 0 ; i < record.length ; i++) {
if(getText("new-username-input") != record[i].username) {
if(getText("new-passcode-input") != "") {
createRecord("players",{
username:getText("new-username-input"),
passcode:getText("new-passcode-input")
},function() {
setScreen("login-screen");
});
}else{
Alert("Incorrect passcode or username",1200);
}
}else{
Alert("Incorrect passcode or username",1200);
}
}
});
});
我已经花了 时间想弄清楚这个问题。我真的很感激任何帮助,即使它没有完全解决它。
你的做法是错误的。当你想确保没有重复时,你必须运行遍历整个数据库。如果您在浏览时找到匹配项,请发出警报并停止。但只有在最后找不到匹配项时,才添加条目。
您当前的代码会在没有匹配项时立即添加新条目。所以几乎总是直接用第一个条目。即使它找到了与第一个条目的匹配项,它也会发出警报但会继续循环,因为您没有调用 break
.
这样试试:
onEvent("create-account-bt","click",function() {
readRecords("players",{},function(record) {
var matchFound = false;
for(var i = 0 ; i < record.length ; i++) {
if((getText("new-username-input") == record[i].username) ||
(getText("new-passcode-input") == ""))
{
Alert("Incorrect passcode or username",1200);
matchFound = true;
break;
}
}
if(!matchFound) {
createRecord("players",{
username:getText("new-username-input"),
passcode:getText("new-passcode-input")
},function() {
setScreen("login-screen");
});
}
});
});