2012-04-29 154 views
0

下面是一段代碼,我遇到了麻煩。其目的是檢查數據庫中的重複條目,如果返回true或false,則返回帶有布爾值的「h」。出於測試目的,我返回一個真正的布爾值爲「h」,但到了警報(duplicate_count);行被執行時,duplicate_count仍然是0.即使+1的警報得到執行。JavaScript函數花費太長時間才能完成?

對我來說,似乎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

爲什麼你使用JavaScript進行數據庫邏輯? – 2012-04-29 00:15:40

+0

@AdamMihalcin node.js? – 2012-04-29 00:16:05

+0

我有Coldfusion處理數據庫查詢,但我們使用的JQuery需要從查詢返回的字段。 – Brian 2012-04-29 00:19:13

回答

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等)返回此信息,並且在客戶端,您可以通過使用AJAX調用聯繫該URL來閱讀此信息(有關代碼,請參見jQuery's website示例),然後將該信息顯示給用戶。無需在JavaScript中編寫數據庫引擎將以更快的速度執行幾個數量級。


編輯2:按照第二條評論,檢查項目是否已經在數據庫

幾乎所有的東西我在第一個編輯說適用,除了兩個變化:架構和查詢。該模式應該成爲我發佈的兩個模式中的第二個模式,因爲您不希望數據庫引擎允許重複。此外,查詢應該是簡單的

SELECT COUNT(*) > 0 
FROM MentorRelationship 
WHERE mentorID = @mentorID AND menteeID = @menteeID; 

其中@mentorID@menteeID是用戶選擇的項目,並插入一個查詢構建器庫和not by string concatenation查詢。然後,如果該項目已在數據庫中,則服務器將獲得真實值,否則將爲false。服務器可以像以前一樣通過AJAX將其發送回客戶端,並且客戶端(即您的JavaScript頁面)可以在用戶已經在數據庫中時提醒用戶。

+0

我不刪除重複項,如果有重複項,我需要給用戶一個提醒。 – Brian 2012-04-29 00:25:12

+0

我同意你的建議,你可能需要更多的背景信息才能理解。我有一個用戶從項目列表中選擇技能並在保存技能之前,我想檢查數據庫以查看他們是否已經輸入了這些技能。如果他們這樣做,我會提示他們做出不同的選擇。如果沒有,然後將它們保存到數據庫。希望澄清一些;) – Brian 2012-04-29 00:47:07

+0

@布萊恩「理解」有點豐富。我明白你寫了什麼,但是你寫了關於檢查重複的內容,而不是關於在插入之前檢查數據庫中是否已經存在一個項目。不過,我正在再次編輯以回答您澄清的問題。 – 2012-04-29 00:52:26

相關問題