单独下载项目的计数器,但不同语言的相同

时间:2014-11-14 09:09:19

标签: php jquery mysql ajax wordpress

我正在尝试为每个“Book”下载制作一个计数器。

首先要注意的是,有些书籍的语言下载速度不同。

我想要实现的是,如果一本书只有一个下载计数器,它会增加它,如果它有不同的语言下载,那么所有增加也只有一个计数器。

柜台在右边: enter image description here

我已经设法在这个论坛的好人帮助下实现了一个按钮点击计数器,这是生成的代码:

<?php

$counterFile = 'counter.txt' ;

// jQuery ajax request is sent here
if ( isset($_GET['increase']) )

{
    if ( ( $counter = @file_get_contents($counterFile) ) === false ) die('Error : file counter does not exist') ;
            file_put_contents($counterFile,++$counter) ;
            echo $counter ;
            return false ;
        }

        if ( ! $counter = @file_get_contents($counterFile) )
        {
            if ( ! $myfile = fopen($counterFile,'w') )
                die('Unable to create counter file !!') ;
            chmod($counterFile,0644);
            file_put_contents($counterFile,0) ;
        }

    ?>
     <script type="text/javascript">
         jQuery(document).on('click','a#download',function(){
             jQuery('div#counter').html('Loading...') ;
             var ajax = jQuery.ajax({
                 method : 'get',
                 url : '/test.php', // Link to this page
                 data : { 'increase' : '1' }
             }) ;
             ajax.done(function(data){
                 jQuery('div#counter').html(data) ;
             }) ;
             ajax.fail(function(data){
                 alert('ajax fail : url of ajax request is not reachable') ;
             }) ;
         }) ;
     </script>
<div id="counter"><?php echo $counter ; ?></div>
<a href="<?php echo get_field("pdf"); ?>" id="download" onclick="window.open(this.href);return false;">Download btn</a>

此解决方案的问题在于它对所有图书的计数相同,并不会将每本书的下载分开。

我找到了这个教程:http://demo.tutorialzine.com/2010/02/php-mysql-download-counter/demo.php 但我看到的问题是它会计算每个文件的下载量,所以如果我将它应用到我的网站上,那么具有不同语言的书籍将被计入不同的数字。

我怎样才能让它按照我正在寻找的方式工作?就像我说的,如果一本书只有一个下载计数器,它会增加它,如果它有不同的语言下载,那么所有增加也只有一个计数器。

2 个答案:

答案 0 :(得分:1)

您只有一个文件,只包含一个数字来计算所有图书。显然这是错误的,因为单个文件应该为每本书做。

据我所知,保持下载次数的最佳方法是使用book_ID和download_count将它们保存在数据库表中。然后,当您需要更新时,请执行UPDATE downloadcounters SET download_count = download_count + 1 WHERE book_ID = <id of book>。使用SELECT download_count FROM downloadcounters WHERE book_ID = <id of book>

即可轻松获得下载次数

如果您出于某种原因需要使用文件,我建议您在CSV文件中执行此操作,以保存图书ID和计数。让php逐行读取文件,直到找到当前图书的ID。然后编辑或读取其值

答案 1 :(得分:1)

执行此操作的最佳方法是使用数据库,但如果您想使用文件执行此操作,则下面应该可以解决问题。

DownloadCount处理所有计数器操作,并将计数器信息存储在JSON文件中,以书籍文件名索引:

  • get()返回指定图书的下载次数。
  • update()会增加指定图书的下载次数,并返回新的下载次数。
  • save()将任何计数器更改写入文件。

请注意,这并不健全,因为它可以同时互相干扰请求(这就是首选数据库的原因)。

<?php

class DownloadCount
{
    protected $_file;
    protected $_counters;

    public function __construct($file)
    {
        if (file_exists($file)) {
            $this->_file = $file;
            $this->_counters = json_decode(file_get_contents($file), true);
            if (empty($this->_counters)) $this->_counters = [];
        } else {
            die('Error : file counter does not exist');
        }
    }

    public function get($book)
    {
        $book = basename($book);

        return (array_key_exists($book, $this->_counters)
            ? $this->_counters[$book]
            : 0);
    }

    public function update($book)
    {
        $book = basename($book);

        if (array_key_exists($book, $this->_counters)) {
            $this->_counters[$book]++;
        } else {
            $this->_counters[$book] = 1;
        }

        return $this->_counters[$book];
    }

    public function save()
    {
        file_put_contents($this->_file, json_encode($this->_counters), LOCK_EX);
    }
}

$count = new DownloadCount('./counter.json');

if (!empty($_GET['increase'])) {
    // this is the ajax response of the incremented count.
    echo $count->update($_GET['increase']);
    $count->save();
    exit;
} else {
    $pdf = get_field('pdf');
?>
    <script type="text/javascript">
        jQuery(document).on('click', 'a#download', function()
        {
            jQuery('div#counter').html('Loading...');
            console.log(this.href);
            var ajax = jQuery.ajax({
                method : 'get',
                url : '/test.php', // Link to this page
                cache: false,
                data : { 'increase' : this.href }
            });
            ajax.done(function(data)
            {
                jQuery('div#counter').html(data);
            });
            ajax.fail(function(data)
            {
                alert('ajax fail : url of ajax request is not reachable');
            });
        });
    </script>
    <div id="counter"><?php echo $count->get($pdf); ?></div>
    <a href="<?php echo $pdf ?>" id="download" onclick="window.open(this.href);return false;">Download btn</a>
<?php
}