2013-09-23 63 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