如何使用ajax click事件从txt文件中分离2个值

时间:2018-02-19 23:46:49

标签: php jquery ajax

我有一个"喜欢"并且"不喜欢"按钮。每次点击喜欢或不喜欢都会增加txt文件中的值:

<?php
$clickcount = explode("\n", file_get_contents('counter.txt'));
foreach($clickcount as $line){
  $tmp = explode('||', $line);
  $count[trim($tmp[0])] = trim($tmp[1]);
}

?>

<button id="like-btn" class="click-trigger" data-click-id="like">Like</button> 
<span id="like" class="click-count"><?php echo $count['like'];?></span> likes.

<button id="dislike-btn" class="click-trigger" data-click-id="dislike">Dislike</button> 
<span id="dislike" class="click-count"><?php echo $count['dislike'];?></span> dislikes.



ajax:

$(document).on('click', '.click-trigger', function()
{
  var data = {'id':$(this).attr('data-click-id')};


  $.ajax({
  type : 'POST',
  url  : 'counter.php',
  data : data,
  success :  function(data)
           {                                                
                $(".click-count").fadeIn(500).show(function()
                {
                    $(".click-count").html(data);

                });                     
           }
  });
return false;
});

和php:

<?php 

$file = 'counter.txt'; // path to text file that stores counts
$fh = fopen($file, 'r+');
$id = $_REQUEST['id']; // posted from page
$lines = '';
while(!feof($fh)){
$line = explode('||', fgets($fh));
$item = trim($line[0]);
$num = trim($line[1]);
if(!empty($item)){
    if($item == $id){
        $num++; // increment count by 1
        echo $num;

        }
    $lines .= "$item||$num\r\n";
    }
} 
file_put_contents($file, $lines);
fclose($fh);

?>  

我的问题是:点击时,让我们说&#34;喜欢&#34;不喜欢的按钮与喜欢的价值相同。年龄刷新后,有不同。所以他们应该彼此分开工作。我怎样才能使这项工作正常?

顺便说一下,文件counter.txt如下所示:

  like||41
  dislike||129

这就是点击&#34;喜欢&#34;按钮;不喜欢从

中获取价值
Like 71 likes. 

Dislike 71 dislikes.

页面刷新后:

 Like 71 likes. 

Dislike 161 dislikes. 

1 个答案:

答案 0 :(得分:1)

首先......您应该找到一种更好的方式来存储您的数据。从像这样的.txt读取会让你头疼,可能会发生数据冲突。

问题出在这里......

<?php 
// Various OS-es have various end line (a.k.a line break) chars:
// - Windows uses CR+LF (\r\n);
// - Linux LF (\n);
// - OSX CR (\r).
// And that's why single dollar meta assertion ($) sometimes fails with multiline modifier (/m) mode - possible bug in PHP 5.3.8 or just a "feature"(?).
$str="ABC ABC\n\n123 123\r\ndef def\rnop nop\r\n890 890\nQRS QRS\r\r~-_ ~-_";
//          C          3                   p          0                   _
$pat1='/\w$/mi';    // This works excellent in JavaScript (Firefox 7.0.1+)
$pat2='/\w\r?$/mi'; // Slightly better
$pat3='/\w\R?$/mi'; // Somehow disappointing according to php.net and pcre.org when used improperly
$pat4='/\w(?=\R)/i';    // Much better with allowed lookahead assertion (just to detect without capture) without multiline (/m) mode; note that with alternative for end of string ((?=\R|$)) it would grab all 7 elements as expected
$pat5='/\w\v?$/mi';
$pat6='/(*ANYCRLF)\w$/mi';  // Excellent but undocumented on php.net at the moment (described on pcre.org and en.wikipedia.org)
$n=preg_match_all($pat1, $str, $m1);
$o=preg_match_all($pat2, $str, $m2);
$p=preg_match_all($pat3, $str, $m3);
$r=preg_match_all($pat4, $str, $m4);
$s=preg_match_all($pat5, $str, $m5);
$t=preg_match_all($pat6, $str, $m6);
echo $str."\n1 !!! $pat1 ($n): ".print_r($m1[0], true)
    ."\n2 !!! $pat2 ($o): ".print_r($m2[0], true)
    ."\n3 !!! $pat3 ($p): ".print_r($m3[0], true)
    ."\n4 !!! $pat4 ($r): ".print_r($m4[0], true)
    ."\n5 !!! $pat5 ($s): ".print_r($m5[0], true)
    ."\n6 !!! $pat6 ($t): ".print_r($m6[0], true);
// Note the difference among the three very helpful escape sequences in $pat2 (\r), $pat3 and $pat4 (\R), $pat5 (\v) and altered newline option in $pat6 ((*ANYCRLF)) - for some applications at least.

/* The code above results in the following output:
ABC ABC

123 123
def def
nop nop
890 890
QRS QRS

~-_ ~-_
1 !!! /\w$/mi (3): Array
(
    [0] => C
    [1] => 0
    [2] => _
)

2 !!! /\w\r?$/mi (5): Array
(
    [0] => C
    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

3 !!! /\w\R?$/mi (5): Array
(
    [0] => C

    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

4 !!! /\w(?=\R)/i (6): Array
(
    [0] => C
    [1] => 3
    [2] => f
    [3] => p
    [4] => 0
    [5] => S
)

5 !!! /\w\v?$/mi (5): Array
(
    [0] => C

    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

6 !!! /(*ANYCRLF)\w$/mi (7): Array
(
    [0] => C
    [1] => 3
    [2] => f
    [3] => p
    [4] => 0
    [5] => S
    [6] => _
)
 */
?>

您正在替换包含&#34;点击次数&#34;的所有元素。上课,既喜欢也不喜欢。

使用next就足够了。

$(".click-count").fadeIn(500).show(function()
{
    $(".click-count").html(data);
});

和...

$(document).on('click', '.click-trigger', function()
{
    var count = $(this).next(".click-count");
    [...]
}