3

わかりましたので、特定のライセンス番号を持つ特定の購入者が、許可が解除される前に 2 回ダウンロードできるダウンロードにアクセスできる、安全なダウンロード システムを作ろうとしています。これを行うために、同じ行の「product_id」列と「license_number」列の隣に「count」列があります。製品 ID とライセンス番号は自動的に生成され、paypal IPN スクリプトが確認すると購入者に渡されます。

問題は次のとおりです。正しい変数を使用してダウンロード ページにアクセスすると、カウントが +1 更新されますが、何らかの理由でこの SQL クエリが 2 回実行され、データベースで +2 が実際に取得されます。最初に値を確認してからそれに応じて変更するように(エラーが修正されるかどうかを確認するために)すでに少し変更しましたが、エラーはまだ修正されていません。

個人的には、ダウンロードするファイルを呼び出すと、スクリプトが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 で実際に 2 つの要求を受け取っているかどうかを確認してください。特定のブラウザ (特にモバイル ブラウザ) が実際に GET を実行する前に HEAD リクエストを実行するケースを見てきました。コードでこれら 2 つの要求タイプを区別できない場合、コードは 2 回実行されます。

于 2012-07-23T16:31:28.373 に答える
0

In my case it was a missing path reference on favicon.ico ie. href="/favicon.ico" (good) vs href="favicon.ico" (bad).

The Ignas comment below Mike's answer helped, but it was confirmed in the logs. The missing path reference caused Apache2 mod_rewrite to map /controller/view/id as /controller/view/favicon.ico which of course led to a slew of PHP errors in the log like "PHP Notice: Undefined index: bar in foo.php line 83". I knew the index existed and I could see the value printed out right there in front of me.

Some tools to help others debug/confirm the issue.

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

Use the command line to track the error. eg.

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

更新すると、ログにこのようなものが 2 回 (おそらくそれ以上?) あることに気付くでしょう。

例:

[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。イグナスとマイクにも感謝します。これは古い質問ですが、Google で「php スクリプトを 2 回実行する」というスタックの唯一の回答なので、他の 2 つのアイデアに貢献して拡張したいと思いました。

于 2018-01-11T03:41:56.550 に答える