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


checking a condition through data inside a textfile

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

代码
$trusted_domain = $_GET['go'];//these variables are taken from the url
$project_id = $_GET['project'];//these variables are taken from the url
$query = "SELECT projectid, domainname FROM domains"; 
$result = mysql_query($query);
while($row= mysql_fetch_assoc($result)){
    $objData = $objData." ". serialize( $row). "'r'n";
}
$filePath = "data.txt";
if (is_writable($filePath)) {
    $fp = fopen($filePath, "w"); 
    fwrite($fp, $objData); 
    fclose($fp);
}

文本文件内容

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_domain$project_id与上面序列化文本中的每个投影和域名相匹配?如果用户输入url

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

如何将值75和www.building.com与文本文件中的内容进行比较

我会考虑为此设置一个Memcache服务器,特别是如果您在列表中有很多域名。

我认为如果你对保存文件的数据格式灵活,下面的方法对你有用。这个例子使用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是键,值是域名。

我在这里假设project_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_*函数,因为它们已被弃用。