我正在尝试为每个“Book”下载制作一个计数器。
首先要注意的是,有些书籍的语言下载速度不同。
我想要实现的是,如果一本书只有一个下载计数器,它会增加它,如果它有不同的语言下载,那么所有增加也只有一个计数器。
柜台在右边:
我已经设法在这个论坛的好人帮助下实现了一个按钮点击计数器,这是生成的代码:
<?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 但我看到的问题是它会计算每个文件的下载量,所以如果我将它应用到我的网站上,那么具有不同语言的书籍将被计入不同的数字。
我怎样才能让它按照我正在寻找的方式工作?就像我说的,如果一本书只有一个下载计数器,它会增加它,如果它有不同的语言下载,那么所有增加也只有一个计数器。
答案 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
}