Php 通过文本文件中的数据检查条件

Php 通过文本文件中的数据检查条件,php,database,fwrite,Php,Database,Fwrite,我一直在我的网站上使用重定向功能,用户被重定向到白名单上的网站。我意识到,通过传统的db调用对域名进行身份验证的过程非常耗时,因此我介绍了一种将db表写入文本文件的方法,并通过匹配域名来执行重定向身份验证。因此,我得到了一个文本文件(序列化)的白名单域名表,如下所示 代码 文本文件内容 a:2:{s:9:"projectid";s:2:"19";s:10:"domainname";s:27:"_http._sctp.www.example.com";} a:2:{s:9:"projectid";

我一直在我的网站上使用重定向功能,用户被重定向到白名单上的网站。我意识到,通过传统的db调用对域名进行身份验证的过程非常耗时,因此我介绍了一种将db表写入文本文件的方法,并通过匹配域名来执行重定向身份验证。因此,我得到了一个文本文件(序列化)的白名单域名表,如下所示

代码

文本文件内容

a:2:{s:9:"projectid";s:2:"19";s:10:"domainname";s:27:"_http._sctp.www.example.com";}
a:2:{s:9:"projectid";s:2:"28";s:10:"domainname";s:11:"www.abc.com";}
a:2:{s:9:"projectid";s:2:"46";s:10:"domainname";s:11:"www.abc.com";}
a:2:{s:9:"projectid";s:2:"70";s:10:"domainname";s:12:"www.test.com";}
a:2:{s:9:"projectid";s:2:"75";s:10:"domainname";s:15:"www.bulding.com";}
a:2:{s:9:"projectid";s:2:"80";s:10:"domainname";s:11:"www.abc.com";}
a:2:{s:9:"projectid";s:2:"82";s:10:"domainname";s:11:"www.abc.com";}
a:2:{s:9:"projectid";s:3:"100";s:10:"domainname";s:47:"https://www.google.com
https://www.facebook.com";}
现在的问题是,谁能告诉我如何将两个变量
$trusted\u domain
$project\u id
与上面序列化文本中的每个项目和域名匹配。我的意思是如果一个用户有一个url

http://trackme.domain.com/redirect?project=75&go=www.building.com

<>我如何比较值75和<代码> www.gun.com >代码>文本文件中的内容。

我会考虑为此设置一个服务器,特别是如果列表中有很多域的话。 不过,如果您对保存的文件的数据格式灵活,我认为以下内容对您适用。本例使用JSON,它更快、更容易处理

$query = "SELECT projectid, domainname FROM domains"; 
$result = mysql_query($query);
$objData = []; 
while ($row = mysql_fetch_assoc($result)){
    $objData[$row['projectid']] = $row['domainname'];
}

file_put_contents('data.txt', json_encode($objData));
然后你可以这样处理:

$trusted_domain = $_GET['go'];//these variables are taken from the url
$project_id = $_GET['project'];//these variables are taken from the url

$data = json_decode(file_get_contents('data.txt'), true);

if (isset($data[$project_id]) && $data[$project_id] === $trusted_domain)
{
    // Domain matches
}
读取JSON时,它会创建一个数组,其中项目id是键,值是域名

我在这里假设项目id是唯一的,每个项目只有一个可信域。如果不是这样的话,你可能需要根据你的具体需要对它进行一些调整。例如:

while ($row = mysql_fetch_assoc($result)){
    $objData[$row['projectid']][] = $row['domainname'];
}
注意额外的
[]
?这将为项目id创建一个域名数组,然后您可以在解析文件时使用该数组:

if (isset($data[$project_id]) && in_array($trusted_domain, $data[$project_id])) { }

我还应该补充一点,避免使用
mysql.*
函数,因为它们已经被弃用了。改为查看。

您是否考虑过将数据保存为JSON格式?这是一个信任域的大列表吗?还没有。。。是的,这是一个受信任域的大列表。。。有没有办法访问这些projectid和domainname。。至少在反序列化Hanks mate之后。。。projectid是唯一的,但一个项目可以有多个域名。。。你能解释一下为什么把$objData[$row['projectd']]=$row['domainname']放在这里吗;在第一部分中,该行创建了一个数组,其中键是数据库中的projectid,域名是值。例如,$objData[28]=“www.abc.com”。然后将该数组编码为JSON并保存到一个文件中。请参阅更新的答案,了解一个项目id的多个域上的代码段。
if (isset($data[$project_id]) && in_array($trusted_domain, $data[$project_id])) { }