2009-11-18 5 views
0

Comment puis-je le faire quand un utilisateur clique sur un lien sur ma page web, il écrit dans un fichier .txt nommé "Count.txt", qui contient seulement un nombre et ajoute 1 à ce nombre? Je vous remercie.PHP - Ouvrir le fichier TXT, ajouter +1 au contenu lorsque le lien est cliqué

+1

Etes-vous sûr que c'est ce que vous voulez? On dirait que vous voulez juste connecter vos visiteurs. Il y a beaucoup d'autres choses qui peuvent mieux convenir à vos objectifs, comme AwStats ou Google Analytics. – Zarel

+0

Ce que j'essaie de faire est de garder la trace du nombre de fois qu'un de mes programmes est téléchargé. Je n'ai jamais utilisé MySQL ou quoi que ce soit et j'ai des connaissances de base en PHP. – user

Répondre

3

Si vous renoncez à toute validité vous vérification pourrait le faire avec quelque chose d'aussi simple que:

file_put_contents($theCounterFile, file_get_contents($theCounterFile)+1); 

Addition:

On parle de la concurrence dans ce fil et il convient de noter qu'il est une bonne idée d'utiliser une base de données et des transactions pour faire face à la concurrence, je recommande fortement de ne pas écrire un tas de code de plomberie pour le faire dans un fichier.

Si vous avez déjà eu, ou pensez que vous pourriez jamais avoir deux demandes de la ressource dans la même seconde que vous devriez regarder dans PDO avec mysql, ou AOP avec SQLite au lieu d'un fichier, les opérations d'utilisation (et InnoDB ou mieux si vous allez pour mysql). Mais vraiment, même si vous obtenez deux requêtes dans la même microseconde (très peu probable), les chances de verrouiller le fichier sont minces car il ne sera pas maintenu ouvert et les deux demandes ne seront probablement pas traitées assez parallèlement pour verrouiller de toute façon . Soyons réalistes: combien de coups sur la même ressource vous obtenez en moyenne dans la même minute ...

+0

Cela va échouer lorsque plusieurs utilisateurs se connectent en même temps, vous avez besoin de verrous. Voir la réponse de Wim Vandersmissen. – johannes

+2

oui il échouera, si vous avez besoin de quelque chose de viable pour la concurrence utiliser une base de données, pas un fichier texte. – Kris

+2

Vous avez oublié le nom de fichier pour 'file_put_contents'. – Gumbo

1

En général, cela est assez facile:

$count = (int)file_get_contents('/path/to/Count.txt'); 
file_put_contents('/path/to/Count.txt', $count++, LOCK_EX); 

Mais vous allez rencontrer des problèmes de concurrence en utilisant cette code. Une façon de générer une serrure à l'abri de toute condition de course est:

$countFile = '/path/to/Count.txt'; 
$countTemp = tempnam(dirname($countFile), basename($countFile)); 
$countLock = $countFile . '.lock'; 
$f_lock = fopen($countLock, 'w'); 
if(flock($f_lock, LOCK_EX)) { 
    $currentCount = (int)file_get_contents($countFile); 
    $f_temp = fopen($countTemp, 'w'); 
    if(flock($f_temp, LOCK_EX)) { 
     fwrite($f_temp, $currentCount++); 
     flock($f_temp, LOCK_UN); 
     fclose($f_temp); 
     if(!rename($countTemp, $countFile)) { 
      unlink($countTemp); 
     } 
    } 
    flock($f_lock, LOCK_UN); 
    fclose($f_lock); 
} 
2

Si vous décidez de faire quoi que ce soit plus avancé, comme dire deux chiffres, vous voudrez peut-être envisager d'utiliser SQLite. Il s'agit d'une procédure aussi rapide et simple que l'ouverture et la fermeture d'un fichier, mais elle est beaucoup plus flexible.

+0

SQLite est évidemment une bien meilleure idée que d'utiliser un fichier texte. – Kris

1

Ouvrez le fichier, verrouillez le fichier (TRÈS important), lisez le numéro qui s'y trouve, ajoutez 1 au numéro, réécrivez le numéro dans le fichier, relâchez le verrou et fermez le fichier.

ie. quelque chose comme:

$fp = fopen("count.txt", "r+"); 

if (flock($fp, LOCK_EX)) { // do an exclusive lock 
    $num = fread($fp, 10); 
    $num++; 
    fseek($fp, 0); 
    fwrite($fp, $num); 
    flock($fp, LOCK_UN); // release the lock 
} else { 
    // handle error 
} 
fclose($fp); 

devrait fonctionner (non testé).

+0

pourquoi diable voudriez-vous écrire tout ce plomberie vous-même, juste pour reqd et écrire un int? – Kris

+0

Parce que sur un site Web, vous aurez un accès simultané au fichier, et votre compteur sera désactivé ou corrompu si vous ne verrouillez pas et déverrouillez le fichier. – wimvds

Questions connexes