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

时间:2015-06-03 09:52:07

标签: php database fwrite

我一直在我的网站中使用重定向功能,用户被重定向到列为白名单的网站。我意识到通过传统的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与上面序列化文本中的每个项目和域名相匹配。我的意思是如果用户带有网址

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

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

1 个答案:

答案 0 :(得分:0)

我会考虑为此设置一个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是唯一的,每个项目只有一个可信域。如果情况并非如此,您可能需要根据您的具体需求稍微调整一下。 E.g:

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_*函数,因为它们已被弃用。请改为PDO