3

好的,所以我正在尝试制作一个安全的下载系统,其中具有特定许可证号的某个购买者可以访问下载,在他的许可被取消之前他可以下载两次。为了做到这一点,我在同一行中的“product_id”和“license_number”列旁边有一个“count”列。当我的 paypal ipn 脚本确认时,产品 ID 和许可证号会自动生成并传递给买家。

现在问题来了:当他们使用正确的变量访问下载页面时,计数会更新 +1,但由于某种原因,这个 sql 查询运行了两次,实际上我的数据库中得到了 +2。我已经对其进行了一些更改以首先检查该值,然后进行相应更改(以查看是否修复了错误),但错误仍未修复。

我个人认为,也许我调用文件下载会使脚本运行两次,还是我错了?

这是代码:

<?php

include ('../storescripts/connect_to_mysql.php');

// Looks first if the post variables have been set

if(!isset($_GET['id']) && ($_GET['lcn'])){

    // Error output
    echo 'The big PHP monster will not accept you into his cave without bringing an offering of variables!';

} else {

    // Set the variables
    $id = $_GET['id'];
    $license_number = $_GET['lcn'];

    // Check if there is such a thing (Yes, aliens) as the given id and license number
    $sql = mysql_query("SELECT * FROM secure_downloads WHERE product_id ='$id' AND license_number ='$license_number' LIMIT 1");

    $result = mysql_num_rows($sql);

    if($result > 0){



        // Now update the download count
        // Check first if the count is 0

        // Make a variable from the count sql   
        $sql_count = mysql_query("SELECT * FROM secure_downloads WHERE product_id='$id' AND license_number='$license_number' LIMIT 1");

        while($row = mysql_fetch_assoc($sql_count)){
                $count = $row['count']; 
            }

        // Check if the count is above two
        if ($count >= 2){
        // Download has already been downloaded 2 times, do not allow download
        echo 'The download limit for this file has been reached.';
        exit();

    } else if ($count = 0) {
        // Everything is alright, start downloading

        // Force the file download
        $file = 'test.jpg';
        // Change the count to 1
        mysql_query("UPDATE secure_downloads SET count=1 WHERE product_id = '$id' AND license_number = '$license_number'");
        readfile($file);
        exit();

        } else if ($count = 1) {

        // Everything is alright, start downloading

        // Force the file download
        $file = 'test.jpg';
        // Change the count to 2
        mysql_query("UPDATE secure_downloads SET count=2 WHERE product_id = '$id' AND license_number = '$license_number'");
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);


    exit();


    }


    } else {


        // It doesn't exist, tell the user either the variables were wrong or the 
        // download limit has been reached
        echo 'Cannot download the file, either the link is wrong or the download limit has been reached';
    }

}

?>
4

3 回答 3

4
} else if ($count = 0) {

将其更改为==. 看起来您正在为每个循环分配0变量count,这可能是您遇到麻烦的原因。

这里还有一个问题:

} else if ($count = 1) {

确保您的所有if语句都使用==(或===) 进行比较,而不是=分配。

于 2012-07-23T16:37:52.870 回答
2

查看服务器日志,看看您是否真的在下载 URL 上收到了两个请求?我见过某些浏览器(尤其是移动浏览器)在执行实际 GET 之前实际上发出 HEAD 请求的情况。如果您的代码无法区分这两种请求类型,它将执行两次。

于 2012-07-23T16:31:28.373 回答
0

就我而言,这是 favicon.ico 上缺少的路径引用,即。href="/favicon.ico" (好) vs href="favicon.ico" (坏)。

迈克回答下方的伊格纳斯评论有所帮助,但在日志中得到了证实。缺少的路径引用导致 Apache2 mod_rewrite 将 /controller/view/id 映射为 /controller/view/favicon.ico,这当然会导致日志中出现大量 PHP 错误,例如“PHP Notice: Undefined index: bar in foo.php第 83 行"。我知道索引存在,我可以看到打印在我面前的值。

一些帮助其他人调试/确认问题的工具。

<?php error_log($_SERVER['REQUEST_URI']); ?>

使用命令行来跟踪错误。例如。

$ tail -F /var/log/apache2/error.log

刷新,您会在日志中两次注意到类似的内容(也许更多?)。

例子:

[Thu Jan 11 03:20:44.211993 2018] [:error] [pid 21161] [client 192.168.0.1:34254] /controller/view/11, referer: http://localhost/controller/view/11

**NOTE: NO ERRORS HERE**

[Thu Jan 11 03:20:44.211993 2018] [:error] [pid 21161] [client 192.168.0.1:34254] /controller/view/favicon.ico, referer: http://localhost/controller/view/11

**NOTE: ERRORS START HERE** The line above is the culprit.

[Thu Jan 11 03:20:44.211993 2018] [:error] [pid 21161] [client 192.168.0.1:34254] PHP Notice:  Undefined index: bar in foo.php line 83

[Thu Jan 11 03:20:44.211993 2018] [:error] [pid 21161] [client 192.168.0.1:34254] PHP Notice:  Undefined index: bar2 in foo.php line 84

[Thu Jan 11 03:20:44.211993 2018] [:error] [pid 21161] [client 192.168.0.1:34254] PHP Notice:  Undefined index: bar3 in foo.php line 85

这是一个愚蠢的错误,但修复起来并不有趣。+1 用于在处理代码时跟踪日志文件。还要感谢 Ignas 和 Mike。这是一个较老的问题,但是当您使用 Google 搜索“php 脚本执行两次”时,它是 Stack 的唯一答案,所以我想我会贡献并扩展其他两个想法。

于 2018-01-11T03:41:56.550 回答