2012-11-28 4 views
5

Ich möchte Downloads in einer Textdatei etwasSchrittmaßnummer in Textdatei

Jemand kommt auf meine Seite und Downloads erfassen, wird es eine neue Zeile in der Textdatei hinzufügen, wenn er den Strom nicht bereits oder erhöht hat ein.

Ich habe

versucht
$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); 

aber es erhöht es immer um mehr als 1

Die Textdatei-Format ist

name|download_count 
+0

Wie viele Zeilen gibt es in Ihrer '.txt' Datei? – NazKazi

+1

Post einige Beispiel Inhalt Ihrer 'txt' Datei –

+0

eine db wäre so viel einfacher als eine Textdatei für diese –

Antwort

2

Sie Ihre Inkrementieren außerhalb der for Schleife tun und nur Zugriff auf das [0] Element, so dass sich nirgendwo anders etwas ändert.

Dies sollte wohl in etwa so aussehen:

$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); 

sollten Sie wahrscheinlich eine Datenbank für diese verwenden, though. Schau dir PDO und MYSQL an und schon bist du auf dem Weg zur Großartigkeit.


EDIT

zu tun, was Sie in Ihren Kommentaren erwähnt, können Sie einen boolean-Flag gesetzt, und lösen Sie es wie Sie durch das Feld gehen. Dies kann ein break auch versichern, wenn Sie nur für eine Sache suchen:

... 
$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"; 
} 

... 
+0

Toll, dass funktioniert, danke, gibt es eine Möglichkeit, ich kann prüfen, ob die Linie zuerst und entweder erhöht oder die neue Zeile hinzufügen? –

+0

Kein Problem, willkommen bei SO.Gib mir eine Sekunde, um herauszufinden, was du gesagt hast :) – Ben

+0

Großartig, ich benutze normalerweise MySQL als Backend, aber ich habe gerade Probleme mit meinem Host, so dass ich Textdateien benutze, bis es sortiert wird. –

0

eine Hand, die Sie verwenden eine foreach Schleife, eine andere Hand Sie sind Schreib nur die erste Zeile in der Datei nach dem Speichern in $a ... es macht mir zu verwirren, was tun Sie in Ihrer .txt Datei ...

diesen Code unten versuchen ... hoffen, dass es Ihr Problem lösen ...

$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); 
+0

Ich möchte, dass es für jede Datei einen neuen Zähler pro Zeile hat. –

0

Statt y schaffen unsere eigene Struktur in einer Textdatei, warum nicht einfach PHP-Arrays verwenden, um den Überblick zu behalten? Sie sollten auch die richtige Verriegelung gelten für Rennbedingungen zu verhindern:

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 
+0

Weil ich die Zähler so sortieren muss, dass ein Top-Download-Stat angezeigt wird. –

+0

@BrendanMullan Ich bin mir sicher, dass du dafür ein Shell-Skript schreiben könntest :) auf jeden Fall hoffe ich, dass die anderen Teile meiner Antwort zum Advisory Locking helfen. –

+0

@ BrendanMullan Ich habe meine Antwort mit einer allgemeineren Lösung aktualisiert; Es speichert alle Download-Zähler in einer Datei. –

0

persönlich i als den Inhalt der Textdatei einen json blob empfehlen die Verwendung. dann können Sie die Datei in PHP lesen, sie dekodieren (json_decode), die Daten manipulieren und dann erneut speichern.