2013-09-23 61 views
1

每次用戶登錄時,我都會保存一個ID。爲了限制程序的傳播,我希望允許每個用戶最多擁有3個設備。這種說法填補了DB與HardwareIDs使用SQL UPDATE返回PHP

SQL:

UPDATE license SET 
     hardwareID3 = CASE WHEN hardwareID1 IS NOT NULL AND 
           hardwareID2 IS NOT NULL AND 
           hardwareID3 IS NULL 
           THEN $hwid 
           ELSE hardwareID3 END, 
     hardwareID2 = CASE WHEN hardwareID1 IS NOT NULL AND 
           hardwareID2 IS NULL 
           THEN $hwid 
           ELSE hardwareID2 END, 
     hardwareID1 = CASE WHEN hardwareID1 IS NULL 
           THEN $hwid 
           ELSE hardwareID1 END 
     WHERE code = $lic AND $hwid NOT IN (COALESCE(hardwareID1,hardwareID2,hardwareID3, 0)) 

PHP:

$checkhwid = $VBPHP -> uphwid($hwid, $lic); 

有2個問題:

  1. 當用戶用登錄第二個id(例如「2」)2次,值「2」也寫入hardwareID3列。

  2. 我想捕捉如果用戶嘗試使用第4個ID登錄並返回錯誤。可悲的是,我不能使用「true或false」ifs,因爲當用戶使用第一個ID登錄時,我會得到「true」的結果,如果他用ID 1多次登錄,我會變成false,因爲聲明沒有改變任何東西(什麼是正確的)。

我正在用盡想法。 在此先感謝。

+0

停止。不要使用這種表格結構。使用存儲在子表中的硬件ID的標準化設計。這將防止您必須編寫完全可怕的查詢,並通過更改單個集中限制變量,讓您自由地增加未來的設備限制。因爲如果你想要第四,第五等等設備,你必須修改每個接觸設備表的單個查詢。 –

+0

聽起來不錯,但不幸的是,我只是php和sql語句的小個子,並且不允許更改表格:無論如何,無論如何,什麼是「規範化設計」?第二張表只包含「join」這樣的硬件和SQL語句? – PoscheL

+0

http://en.wikipedia.org/wiki/Database_normalization一般來說,你應該瞄準第三範式。有更高/更低的形式,但第三常態對於額外的工作訴訟來說是一個不錯的選擇。效率提高。 –

回答

1

下面你可以返回的錯誤信息和捕捉失敗的登錄次數

 UPDATE license SET 

       errormessage = CASE WHEN hardwareID1 IS NOT NULL AND 
             hardwareID2 IS NOT NULL AND 
             hardwareID3 IS not NULL 
    and)$hwid!=hardwareID1 or $hwid!=hardwareID2 or $hwid!=hardwareID2) 
    then 'errormessage' else 'allok' end, 

       failedlogins = CASE WHEN hardwareID1 IS NOT NULL AND 
             hardwareID2 IS NOT NULL AND 
             hardwareID3 IS not NULL 
    and $hwid!=hardwareID1 and $hwid!=hardwareID2 and $hwid!=hardwareID2 
    then failedlogins+1 else failedlogins end, 

       hardwareID3 = CASE WHEN hardwareID1 IS NOT NULL AND 
             hardwareID2 IS NOT NULL AND 
             hardwareID3 IS NULL 
    and ($hwid!=hardwareID1 or $hwid!=hardwareID2) 

             THEN $hwid 
             ELSE hardwareID3 END, 
       hardwareID2 = CASE WHEN hardwareID1 IS NOT NULL AND 
             hardwareID2 IS NULL 
    and $hwid!=hardwareID1 
             THEN $hwid 
             ELSE hardwareID2 END, 
       hardwareID1 = CASE WHEN hardwareID1 IS NULL 
             THEN $hwid 
             ELSE hardwareID1 END 
       WHERE code = $lic AND $hwid NOT IN (COALESCE(hardwareID1,hardwareID2,hardwareID3, 0)) 
+0

非常感謝!工作:)和多餘的行好主意 – PoscheL

+0

謝謝你在堆棧上的問題,讓我有機會學習;) – AdrianBR

+0

哦錯誤消息部分不起作用。我怎麼才能趕上'然後'太多設備'其他'allok'結束,'在PHP消息? – PoscheL