6

ダウンロードをテキストファイルに記録したい

誰かが私のサイトに来て何かをダウンロードすると、テキスト ファイルに新しい行が追加されていない場合は追加されるか、現在の行がインクリメントされます。

私が試してみました

$filename = 'a.txt';
$lines    = file($filename);
$linea    = array();

foreach ($lines as $line) 
{ 
    $linea[] = explode("|",$line);
}

$linea[0][1] ++;

$a = $linea[0][0] . "|" . $linea[0][1];

file_put_contents($filename, $a);

ただし、常に1以上インクリメントします

テキストファイルのフォーマットは

 name|download_count
4

4 に答える 4

2

forループの外側でインクリメントを行っており、 [0]th 要素にのみアクセスしているため、他の場所では何も変更されていません。

これはおそらく次のようになります。

$filename = 'a.txt';
$lines = file($filename);

// $k = key, $v = value
foreach ($lines as $k=>$v) { 
    $exploded = explode("|", $v);

    // Does this match the site name you're trying to increment?
    if ($exploded[0] == "some_name_up_to_you") {
        $exploded[1]++;

        // To make changes to the source array,
        // it must be referenced using the key.
        // (If you just change $v, the source won't be updated.)
        $lines[$k] = implode("|", $exploded);
    }        
}

// Write.
file_put_contents($filename, $lines);

ただし、おそらくこれにはデータベースを使用する必要があります。PDO と MYSQL をチェックしてみてください。


編集

コメントで言及したことを行うには、ブール値フラグを設定し、配列をウォークスルーするときにそれをトリガーできます。break探しているものが 1 つだけの場合は、これも保証される可能性があります。

...
$found = false;
foreach ($lines as $k=>$v) { 
    $exploded = explode("|", $v);

    if ($exploded[0] == "some_name_up_to_you") {
        $found = true;
        $exploded[1]++;
        $lines[$k] = implode("|", $exploded);
        break; // ???
    }        
}

if (!$found) {
    $lines[] = "THE_NEW_SITE|1";
}

...
于 2012-11-28T05:42:17.403 に答える
0

テキスト ファイル内に独自の構造を作成する代わりに、PHP 配列を使用して追跡してみませんか? また、競合状態を防ぐために適切なロックを適用する必要があります。

function recordDownload($download, $counter = 'default')
{
    // open lock file and acquire exclusive lock
    if (false === ($f = fopen("$counter.lock", "c"))) {
            return;
    }
    flock($f, LOCK_EX);

    // read counter data
    if (file_exists("$counter.stats")) {
            $stats = include "$counter.stats";
    } else {
            $stats = array();
    }

    if (isset($stats[$download])) {
        $stats[$download]++;
    } else {
        $stats[$download] = 1;
    }

    // write back counter data
    file_put_contents('counter.txt', '<?php return ' . var_export($stats, true) . '?>');

    // release exclusive lock
    fclose($f);
}

recordDownload('product1'); // will save in default.stats
recordDownload('product2', 'special'); // will save in special.stats
于 2012-11-28T06:22:08.320 に答える
0

一方ではforeachループを使用し、もう一方では、ファイルを保存した後に最初の行だけをファイルに書き込みます...ファイル$aに何があるのか​​ 混乱させてい.txtます...

以下のコードを試してください...問題が解決することを願っています...

$filename = 'a.txt';
// get file contents and split it...
$data = explode('|',file_get_contents($filename));
// increment the counting number...
$data[1]++;
// join the contents...
$data = implode('|',$data);
file_put_contents($filename, $data);
于 2012-11-28T06:17:52.340 に答える
0

個人的には、テキスト ファイルのコンテンツとして json blob を使用することをお勧めします。次に、ファイルを php に読み込み、デコード (json_decode) し、データを操作してから、再保存します。

于 2012-12-12T14:11:23.723 に答える