Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite3与PHP如何使用在其他列中找到的数据交叉引用列_Php_Sql_Sqlite_Cross Reference - Fatal编程技术网

SQLite3与PHP如何使用在其他列中找到的数据交叉引用列

SQLite3与PHP如何使用在其他列中找到的数据交叉引用列,php,sql,sqlite,cross-reference,Php,Sql,Sqlite,Cross Reference,下面是我的示例数据的样子 hwid: 1502e3c3-b49c-4907-92fd-2ffac2d50ace ip: 68.197.140.109 character name: none 现在说我正在登录 这个hwid 1502e3c3-b49c-4907-92fd-2ffac2d50ace 这个ip地址是多少 219.100.37.236 其链接指向使用以前的IP地址68.197.140.109 而且该IP地址有一个指向第三个hwid的链接,该地址有一个字符名:kalgame 这就

下面是我的示例数据的样子

hwid: 1502e3c3-b49c-4907-92fd-2ffac2d50ace
ip: 68.197.140.109 
character name: none


现在说我正在登录 这个hwid 1502e3c3-b49c-4907-92fd-2ffac2d50ace 这个ip地址是多少 219.100.37.236

其链接指向使用以前的
IP
地址
68.197.140.109

而且该
IP
地址有一个指向第三个
hwid
的链接,该地址有一个
字符名:kalgame

这就是我需要对链接到所有
hwid
的所有
IP进行交叉引用的地方,然后检查这些
hwid
中是否有
字符名
。 如果它们有一个
字符\u名称
与之关联,则在
中返回它们,并选择不同的计数(TotalMatchesFuniqueCharacterNames)

我还需要检查您正在使用的
当前HWID
当前IP
是否有3天的试用期,如果有,则还需要将其添加到
选择不同计数
。。然后,如果SELECT DISTINCT COUNT大于1,我可以很容易地在PHP中进行检查,然后中止向特定用户提供任何更多的免费试用,因为他之前已经使用
字符名登录,并且可能在他的PC
hwid
或他的
IP
地址上有3天的试用期,注:我还想排除空白的
角色名
,因为这些玩家还没有使用角色登录。。所以他们不算数。我还必须匹配
区域设置
这是他们正在玩的游戏如果他们正在玩不同的游戏,那么他们也不算

这是我在交叉引用方面的尝试,我已经为此工作了6个小时,今天是我使用SQLite或任何SQL的第一天,所以我不知道我在做什么

这是两个表的表模式DDL。。它们也位于同一数据库文件中

CREATE TABLE ips (
    hwid           VARCHAR,
    ip             VARCHAR,
    character_name VARCHAR,
    locale         VARCHAR,
    botver         VARCHAR,
    reg_time       DATETIME,
    last_time      DATETIME,
    ping_count     INTEGER  DEFAULT 0
);

CREATE TABLE users (
    hwid      VARCHAR UNIQUE,
    timestamp INTEGER,
    daysToUse INTEGER,
    pcLimit   INTEGER,
    comment   VARCHAR
);
这是我试图把这一切放在一起

SELECT users2.hwid,
       ips2.character_name,
       ips2.ip
  FROM users AS users2
       INNER JOIN
       ips AS ips2 ON ips2.hwid = users2.hwid
 WHERE EXISTS (
           SELECT 1
             FROM users
                  INNER JOIN
                  ips ON ips.hwid = users.hwid
            WHERE ips.character_name != '' AND 
                  ips.locale = ips2.locale AND 
                  (ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' OR 
                   ips.ip = '219.100.37.236') AND 
                  EXISTS (
                          SELECT 1
                            FROM users
                                 INNER JOIN
                                 ips ON ips.hwid = users.hwid
                           WHERE ips.character_name != '' AND 
                                 ips2.ip = ips.ip AND 
                                 ips2.locale = ips.locale
                      )
       )
OR 
       (ips2.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND 
        users2.daysToUse = 3) OR 
       (ips2.ip = '219.100.37.236' AND 
        users2.daysToUse = 3);
这是我在制作网站上留下的东西。。这不太好。。不做交叉引用,可以跳过某些列,但至少它可以工作,不像上面的顶级代码,它听起来应该可以工作,但根本不工作

SELECT COUNT(DISTINCT users2.hwid) 
  FROM users AS users2
       INNER JOIN
       ips AS ips3 ON ips3.hwid = users2.hwid
 WHERE ips3.character_name = (
                                 SELECT ips.character_name
                                   FROM users,
                                        ips AS ips2
                                        INNER JOIN
                                        ips ON ips.hwid = users.hwid
                                  WHERE ips.character_name != '' AND 
                                        ips.locale = ips2.locale AND 
                                        (ips.hwid = '$HWID' OR 
                                         ips.ip = '$IP') 
                             )
OR 
       (ips3.hwid = '$HWID' AND 
        users2.daysToUse = 3) OR 
       (ips3.ip = '$IP' AND 
        users2.daysToUse = 3);

如果有人能帮助我,我将永远感激:我自己解决了这个问题。。事实证明,这样做非常简单,我只是让查询按向后的顺序进行,我翻转了顺序,然后砰的一声,它就如预期的那样工作了

现场问题很难解决。。我无法检测当前使用的是哪个区域设置,因此我使用了
ips.lasttime
,它显示了哪个
IP
HWID
是最后使用的,而最后使用显然就是我要检查的区域设置

最终结果

SELECT ips.ip,
       ips.character_name,
       users.hwid,
       users.daysToUse,
       ips.locale
  FROM users
       INNER JOIN
       ips ON ips.hwid = users.hwid
 WHERE ips.ip IN (
           SELECT ips.ip
             FROM users
                  INNER JOIN
                  ips ON ips.hwid = users.hwid
            WHERE (ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND 
                   users.daysToUse = 3) OR 
                  (ips.ip = '219.100.37.236' AND 
                   users.daysToUse = 3) 
       )
AND 
       ips.locale = (
           SELECT ips.locale
             FROM users
                  INNER JOIN
                  ips ON ips.hwid = users.hwid
            WHERE (ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND 
                   users.daysToUse = 3) OR 
                  (ips.ip = '219.100.37.236' AND 
                   users.daysToUse = 3) ORDER BY ips.last_time ASC
       );

由于子查询共享相同的
FROM
JOIN
子句,因此简化为紧凑的
WHERE
子句:

选择i.ip、i.character\u name、u.hwid、u.daysToUse、i.locale
来自用户u
内部连接ips i
ON i.hwid=u.hwid
其中(i.hwid='1502e3c3-b49c-4907-92fd-2ffac2d50ace'
和u.daysToUse=3)
或(i.ip='219.100.37.236'和u.daysToUse=3)
我上次点菜

注意不要在子查询中重复使用IP之类的别名。谢谢,但我认为这不会是一个问题,因为我将子查询放在二进制括号中,这意味着它们不会离开该范围,我想,如果我使用
as
命令,我只能访问外部范围。如果我喜欢
ips1
ips2
它看起来更容易阅读,这就是我开始时的样子。该
I
表名为
ips
在数据库“botusers”上执行SQL查询时发生错误
[21:45:21]:没有这样的表:I
你是说喜欢
内部连接ips I
?是的,修正了这个错误。你的查询没有与所有其他与
ip
hwid
关联的
字符名
进行交叉引用,只是没有明确地指出我的查询在上次也被窃听了,尽管这似乎是一个很好的快速修复也不起作用。。因为它不会与共享同一hwid的其他IP地址进行交叉引用,所以这些IP的上次显示时间可能会更高,这意味着它们应该显示,而不是我的当前IP。实际上,我不必为IP或Hwid检查OR,所以它应该同时检查两个IP
SELECT COUNT(DISTINCT users2.hwid) 
  FROM users AS users2
       INNER JOIN
       ips AS ips3 ON ips3.hwid = users2.hwid
 WHERE ips3.character_name = (
                                 SELECT ips.character_name
                                   FROM users,
                                        ips AS ips2
                                        INNER JOIN
                                        ips ON ips.hwid = users.hwid
                                  WHERE ips.character_name != '' AND 
                                        ips.locale = ips2.locale AND 
                                        (ips.hwid = '$HWID' OR 
                                         ips.ip = '$IP') 
                             )
OR 
       (ips3.hwid = '$HWID' AND 
        users2.daysToUse = 3) OR 
       (ips3.ip = '$IP' AND 
        users2.daysToUse = 3);
SELECT ips.ip,
       ips.character_name,
       users.hwid,
       users.daysToUse,
       ips.locale
  FROM users
       INNER JOIN
       ips ON ips.hwid = users.hwid
 WHERE ips.ip IN (
           SELECT ips.ip
             FROM users
                  INNER JOIN
                  ips ON ips.hwid = users.hwid
            WHERE (ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND 
                   users.daysToUse = 3) OR 
                  (ips.ip = '219.100.37.236' AND 
                   users.daysToUse = 3) 
       )
AND 
       ips.locale = (
           SELECT ips.locale
             FROM users
                  INNER JOIN
                  ips ON ips.hwid = users.hwid
            WHERE (ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND 
                   users.daysToUse = 3) OR 
                  (ips.ip = '219.100.37.236' AND 
                   users.daysToUse = 3) ORDER BY ips.last_time ASC
       );