下面是我遇到问题的代码片段。目的是检查数据库中的重复条目,如果为true或false,则返回带有布尔值的“h”。出于测试目的,我返回一个真正的布尔值为“h”但是在警报时(duplicate_count);如果执行了行,则duplicate_count仍为0.即使执行+1警报也会执行。
对我而言,似乎函数updateUserFields需要更长时间才能执行,因此在获取警报之前需要更长时间才能完成。
有任何想法或建议吗?谢谢!
var duplicate_count = 0
for (var i = 0; i < skill_id.length; i++) {
function updateUserFields(h) {
if(h) {
duplicate_count++;
alert("count +1");
} else {
alert("none found");
}
}
var g = new cfc_mentoring_find_mentor();
g.setCallbackHandler(updateUserFields);
g.is_relationship_duplicate(resource_id, mentee_id, section_id[i], skill_id[i], active_ind,table);
};
alert(duplicate_count);
答案 0 :(得分:1)
没有任何理由使用客户端JavaScript / jQuery从数据库中删除重复项。除了安全问题(还有很多问题)之外,还有一种更简单的方法可以确保数据库中的条目是唯一的:使用SQL。
SQL能够表达在表列中没有重复项的要求,并且数据库引擎将为您强制执行,从不允许您首先插入重复的条目。数据库引擎的语法略有不同,但每当您创建表时,您都可以指定列必须是唯一的。
让我们使用SQLite作为示例数据库引擎。现在你的问题的相关部分可能用表格表示:
CREATE TABLE Person(
id INTEGER PRIMARY KEY ASC,
-- Other fields here
);
CREATE TABLE MentorRelationship(
id INTEGER PRIMARY KEY ASC,
mentorID INTEGER,
menteeID INTEGER,
FOREIGN KEY (mentorID) REFERENCES Person(id),
FOREIGN KEY (menteeID) REFERENCES Person(id)
);
但是,您可以通过将对(mentorID, menteeID)
更改为主键来强制执行唯一性,即要求任何(mentorID, menteeID)
对都是唯一的。这是有效的,因为您只允许每个主键的一个副本。然后,MentorRelationship
表变为
CREATE TABLE MentorRelationship(
mentorID INTEGER,
menteeID INTEGER,
PRIMARY KEY (mentorID, menteeID),
FOREIGN KEY (mentorID) REFERENCES Person(id),
FOREIGN KEY (menteeID) REFERENCES Person(id)
);
编辑:根据评论,提醒用户重复但实际上并未将其删除
使用SQL比使用JavaScript还要好得多。在JavaScript中执行此操作时,您一次读取一个数据库行,通过网络发送,等待它进入您的页面,处理它,丢弃它,然后请求下一个。使用SQL,所有的辛苦工作都由数据库引擎完成,您不会因为通过网络传输不必要的数据而浪费时间。使用上面的第一组表定义,您可以编写
SELECT mentorID, menteeID
FROM MentorRelationship
GROUP BY mentorID, menteeID
HAVING COUNT(*) > 1;
将返回多次出现的所有(mentorID, menteeID)
对。
一旦你在服务器上运行这样的查询(并且还要向用户提取所有要显示的信息,这可能不仅仅是一对ID),你需要通过网络到用户的网络浏览器。本质上,在服务器端,您映射URL以便以某种方便的形式(JSON,XML等)返回此信息,并在客户端通过将该URL与AJAX调用联系来阅读此信息(请参阅{{3}对于某些代码示例),然后将该信息显示给用户。无需用JavaScript编写数据库引擎将更快执行数量级的事情。
编辑2 :根据第二条评论,检查项目是否已存在于数据库中
我在第一次编辑中说的几乎所有内容都适用,除了两个更改:架构和查询。模式应该成为我发布的两个模式中的第二个,因为您不希望数据库引擎允许重复。此外,查询应该只是
SELECT COUNT(*) > 0
FROM MentorRelationship
WHERE mentorID = @mentorID AND menteeID = @menteeID;
其中@mentorID
和@menteeID
是用户选择的项目,并由查询构建器库和jQuery's website插入到查询中。然后,如果项目已经在数据库中,服务器将获得真值,否则将获得false值。服务器可以像以前一样通过AJAX将其发送回客户端,并且客户端(这是您的JavaScript页面)可以提醒用户该项目是否已存在于数据库中。