Php 网络机器人能增加下载量吗?

Php 网络机器人能增加下载量吗?,php,html,mysql,Php,Html,Mysql,我有一个PHP程序连接到网站上的MYSQL数据库。 单击链接下载文件后,程序从数据库中读取一个整数字段,将其递增,然后将数字放回,以计算下载次数。这个程序有效。然而,随着时间的推移,下载数量似乎适度膨胀 网络机器人是否可以根据下载文件的链接增加下载数量?如果是这样的话,告诉网络机器人忽略网站上的下载页面,使用robots.txt文件,能解决膨胀的计数问题吗 以下是PHP代码: function updateDownloadCounter($downloadPath, $tableName, $f

我有一个PHP程序连接到网站上的MYSQL数据库。 单击链接下载文件后,程序从数据库中读取一个整数字段,将其递增,然后将数字放回,以计算下载次数。这个程序有效。然而,随着时间的推移,下载数量似乎适度膨胀

网络机器人是否可以根据下载文件的链接增加下载数量?如果是这样的话,告诉网络机器人忽略网站上的下载页面,使用robots.txt文件,能解决膨胀的计数问题吗

以下是PHP代码:

function updateDownloadCounter($downloadPath, $tableName, $fileNameField, $downloadCountField, $idField) 
{

require("v_config.php");

if(isset($_REQUEST["file_id"]) && is_numeric($_REQUEST["file_id"])) {   

    try
    {
        $sql = "SELECT * FROM " . $tableName . " WHERE file_id = " . $_REQUEST[$idField];
        $connection = new PDO($dsn, $username, $password, $options);    
        $statement = $connection->prepare($sql);
        $statement->execute();

        $result = $statement->fetchAll();

        if ($result && $statement->rowCount() == 1)
        {       
            foreach ($result as $row)
            {                   
                if(is_file($_SERVER['DOCUMENT_ROOT'].$downloadPath . $row[$fileNameField])) 
                {               
                    $count = $row[$downloadCountField] + 1;                 
                    $sql = "UPDATE " . $tableName . " SET " . $downloadCountField . " = " . $count . " WHERE file_id = " . $_REQUEST[$idField];
                    $statement = $connection->prepare($sql);
                    $statement->execute();
                    $documentLocationAndName = $downloadPath . $row[$fileNameField];
                    header('Location:' . $documentLocationAndName);
                }
            }
        }
    }

    catch(PDOException $error) 
    {
        echo $sql . "<br>" . $error->getMessage();
    }   
}

}
函数updateDownloadCounter($downloadPath、$tableName、$fileNameField、$downloadCountField、$idField)
{
要求(“v_config.php”);
如果(isset($请求[“文件id”])和&是数字($请求[“文件id”]){
尝试
{
$sql=“从“$tableName.”中选择*,其中file_id=“.$”请求[$idField];
$connection=newpdo($dsn、$username、$password、$options);
$statement=$connection->prepare($sql);
$statement->execute();
$result=$statement->fetchAll();
如果($result&&$statement->rowCount()==1)
{       
foreach($结果为$行)
{                   
if(是_文件($_服务器['DOCUMENT_ROOT'].$downloadPath.$row[$fileNameField]))
{               
$count=$row[$downloadCountField]+1;
$sql=“UPDATE”。$tableName。“SET”。$downloadCountField。”=“$count.”其中file_id=“.$”请求[$idField];
$statement=$connection->prepare($sql);
$statement->execute();
$documentLocationAndName=$downloadPath.$row[$fileNameField];
标题('位置:'。$documentLocationAndName);
}
}
}
}
捕获(异常$error)
{
echo$sql。“
”$error->getMessage(); } } }
您的两个问题的答案都是

当爬虫为你的网站编制索引时,它也会查找相关的内容,类似于创建一个网站地图。它在页面上查找相关内容的第一个位置是直接链接。如果您直接链接到下载页面上的文件,爬虫程序也会尝试为这些链接编制索引

阻止爬虫通过
robots.txt查看您的下载页面将
防止出现此问题,但您将失去潜在的SEO。如果有第三方直接链接到你的下载呢?如果他们的下载页面已编入索引,爬虫程序仍然可以看到您的链接

幸运的是,您可以禁用此行为。通过在下载页面的
部分添加以下内容,只需告诉爬虫下载页面上的链接都是链接:

<link rel="canonical" href="http://www.example.com/downloads" />
作为回退,您可以随时检查是谁试图在PHP中下载该文件!这取决于你想变得多么学究(因为有很多不同的爬虫),但是这个功能运行得非常好:

function bot_detected() {
  return (
    isset($_SERVER['HTTP_USER_AGENT'])
    && preg_match('/bot|crawl|slurp|spider|mediapartners/i', $_SERVER['HTTP_USER_AGENT'])
  );
}
然后,在运行
try
之前,只需将其作为条件调用即可:

if (!bot_detected()) {
  try { } // Will only get executed for real visitors
}
另外,我建议使用
$\u GET[“file\u id”]
而不是
$\u REQUEST[“file\u id”]
$\u REQUEST
$\u GET
$\u POST
$\u COOKIE
结合在一起,两者的使用方式往往截然不同。如果只是检索数据,那么将请求限制为一个简单的
$\u GET
,会安全得多

希望这有帮助!:)

if (!bot_detected()) {
  try { } // Will only get executed for real visitors
}