我有一个简单的下载页面,它接收文件URL,下载计数器.TXT文件URL,以及下载后的重定向链接。这都是通过PHP参数发送的。问题是,有人一直在向下载者发送垃圾邮件并弄乱了计数。我想在下载计数器上设置一个上限,这样每个可下载项目的每个地址只能计算3次点击。
我需要能够只使用PHP,没有MySQL数据库。我确实有这个理由,我的数据库服务器是垃圾和不可靠的,我不能让计数器失效。
这是我当前的下载程序PHP文件。更多信息,此PHP文件位于/counter
的自己的文件夹中,每个下载计数TXT文件都有一个/counter/data
目录。这些文件只存储一个整数值。
<?
//Retrieve downloadable file URL
$c_url = urldecode($_GET['url']);
//retrieve redirect page URL
$c_page = urldecode($_GET['page']);
//Retrieve download counter TXT URL
$c_file = "../" . $_GET['file'];
?>
<!-- Set up simple styles -->
<head>
<style type="text/css">
body{
background: url("../images/background.png");
color: #ffffff;
}
</style>
</head>
<!-- Creates download file URL in hidden iFrame -->
<iframe src="<?echo $c_url;?>" id="hiddenFrm" style="display:none;" frameborder="0"></iframe>
<body>
<center>
<h1>Your download is starting</h1><br>
<p>You should be redirected momentarily...<br>
<?
<br><br>
if (file_exists($c_file))
{
//Add one value to the counter file
file_put_contents($c_file, ((int) file_get_contents($c_file)) + 1);
//Set an automatic redirect for the page (Return home)
?>
<meta http-equiv="refresh" content="0;url=<?echo $c_page;?>" />
<?
//Display information about the download, and alternate exits to the page
if ($c_url != "")
{?>
<b><a href="<?echo $c_url?>">Click here</a> if the download did not start.<br><br>
<a href="<?echo $c_page?>">Click here</a> if this page does not close after your download.</b></p>
<?}
else
{
?>
<b><a href="<?echo $c_page?>">Click here</a> if you are not redirected automatically</b></p>
<?
}
}
else
{
//In case our counter file is improperly specified
echo "<br><br><br>Error, the counter file was not found!";
}
?>
</center>
</body>
我的问题简化了:如何存储下载每个产品的人的IP地址,并防止下载计数器仅使用PHP而不使用数据库从该地址下载超过3次?
非常感谢帮助。
修改 正如我上面所说,我不能使用数据库。此外,我对两个解决方案感兴趣,但不知道如何使它们工作(我正在寻找代码示例),一个是cookie,另一个是充当数据库的文本文件。
答案 0 :(得分:2)
根本不使用任何数据库,这将非常困难。如果你根本不能使用MySQL,我会感到惊讶,但也许像SQLite这样简单的东西可能会起作用。除此之外,我可以想到两种解决方案:文件系统和cookie。
Cookie的问题在于它们是短暂的,如果你有机器人发送垃圾邮件,他们可能会拒绝cookie设置。
您可以做的是维护
文件IP download-count last-download-time
如果文件足够小,您可以使用file
将其加载到内存中,并使用preg_grep
搜索IP地址并以此方式更新计数。
请注意,IP地址可能不是最好的选择,因为一些有效和无效的用户可能共享移动路由器,而IP地址可能会被使用代理等欺骗。您最好的选择是某种用户身份验证系统,但如果没有数据库,这将是非常困难的
答案 1 :(得分:1)
我会使用Memcache。 您可以在此处查看PHP的文档:http://php.net/manual/en/book.memcache.php
您可以使用IP地址字符串作为密钥,然后在每个下载请求中,您将尝试执行$ memcache-&gt; get($ key)。如果那不存在,你会做一个$ memcache-&gt; set($ key,$ downloadCount)。如果密钥确实存在,则会增加downloadCount。
答案 2 :(得分:0)
数据必须存储在某处,因为PHP总是“从头开始”。如何用文本文件来表示数据库?