web-dev-qa-db-fra.com

Créer ou écrire / ajouter dans un fichier texte

J'ai un site Web qui, chaque fois qu'un utilisateur se connecte ou se déconnecte, l'enregistre dans un fichier texte.

Mon code ne fonctionne pas lors de l'ajout de données ou de la création d'un fichier texte s'il n'existe pas. Voici l'exemple de code

$myfile = fopen("logs.txt", "wr") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, $txt);
fclose($myfile);

Il semble que cela ne soit pas ajouté à la ligne suivante après que je l'ouvre à nouveau.

De plus, je pense que cela provoquerait également une erreur dans une situation où deux utilisateurs se connectent en même temps, cela affecterait-il l'ouverture du fichier texte et sa sauvegarde par la suite?

150
Jerahmeel Acebuche

Essayez quelque chose comme ça:

 $txt = "user id date";
 $myfile = file_put_contents('logs.txt', $txt.PHP_EOL , FILE_APPEND | LOCK_EX);
294
SpencerX

Utilisez le mode a. Il représente append.

$myfile = fopen("logs.txt", "a") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, "\n". $txt);
fclose($myfile);
94
Valentin Mercier

Vous pouvez le faire de la manière OO, juste une alternative et flexible:

class Logger {

    private
        $file,
        $timestamp;

    public function __construct($filename) {
        $this->file = $filename;
    }

    public function setTimestamp($format) {
        $this->timestamp = date($format)." » ";
    }

    public function putLog($insert) {
        if (isset($this->timestamp)) {
            file_put_contents($this->file, $this->timestamp.$insert."<br>", FILE_APPEND);
        } else {
            trigger_error("Timestamp not set", E_USER_ERROR);
        }
    }

    public function getLog() {
        $content = @file_get_contents($this->file);
        return $content;
    }

}

Ensuite, utilisez-le comme ceci. Supposons que user_name soit stocké dans une session (semi-pseudo-code):

$log = new Logger("log.txt");
$log->setTimestamp("D M d 'y h.i A");

if (user logs in) {
    $log->putLog("Successful Login: ".$_SESSION["user_name"]);
}
if (user logs out) {
    $log->putLog("Logout: ".$_SESSION["user_name"]);
}

Vérifiez votre journal avec ceci:

$log->getLog();

Le résultat est comme:

Sun Jul 02 '17 05.45 PM » Successful Login: JohnDoe
Sun Jul 02 '17 05.46 PM » Logout: JohnDoe


github.com/thielicious/Logger

7
Thielicious

Il n’existe pas de mode d’ouverture de fichier tel que "wr" dans votre code:

fopen("logs.txt", "wr") 

Le mode d’ouverture du fichier dans PHP http://php.net/manual/en/function.fopen.php est identique à celui de C: http://www.cplusplus.com/reference/cstdio/fopen/

Il existe les principaux modes d'ouverture suivants: "r" pour lecture, "w" pour écriture et "a" pour ajout, et vous ne pouvez pas les combiner. Vous pouvez ajouter d'autres modificateurs tels que "+" pour la mise à jour, "b" pour le binaire. La nouvelle norme C ajoute un nouveau sous-spécificateur standard ("x"), pris en charge par PHP, qui peut être ajouté à tout spécificateur "w" (pour former "wx", "wbx", "w + x" ou "w + bx "/" wb + x "). Cette sous-spécification force la fonction à échouer si le fichier existe, au lieu de l'écraser.

En plus de cela, dans PHP 5.2.6, le mode d'ouverture principal 'c' a été ajouté. Vous ne pouvez pas combiner "c" avec "a", "r", "w". Le 'c' ouvre le fichier en écriture uniquement. Si le fichier n'existe pas, il est créé. Si elle existe, elle n'est ni tronquée (contrairement à "w"), ni l'appel à cette fonction échoue (comme c'est le cas avec "x"). 'c +' Ouvre le fichier en lecture et en écriture. sinon, il a le même comportement que "c".

De plus, et dans PHP 7.1.2, l'option 'e' a été ajoutée et peut être combinée avec d'autres modes. Il positionne l'indicateur Close-on-Exec sur le descripteur de fichier ouvert. Uniquement disponible dans PHP compilé sur des systèmes conformes à POSIX.1-2008.

Ainsi, pour la tâche telle que vous l'avez décrite, le meilleur mode d'ouverture de fichier serait "a". Il ouvre le fichier en écriture uniquement. Il place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, il tente de le créer. Dans ce mode, fseek () n'a aucun effet, les écritures sont toujours ajoutées.

Voici ce dont vous avez besoin, comme cela a déjà été souligné ci-dessus:

fopen("logs.txt", "a") 
2
Maxim Masiutin

Essayez ce code:

function logErr($data){
  $logPath = __DIR__. "/../logs/logs.txt";
  $mode = (!file_exists($logPath)) ? 'w':'a';
  $logfile = fopen($logPath, $mode);
  fwrite($logfile, "\r\n". $data);
  fclose($logfile);
}

Je l'utilise toujours comme ça, et ça marche ...

1
Rwakos

Cela fonctionne pour moi, écrivant (créant également) et/ou ajoutant du contenu dans le même mode.

$fp = fopen("MyFile.txt", "a+") 
0
Mihir Bhatt

Bien qu'il y ait plusieurs façons de le faire. Mais si vous voulez le faire facilement et que vous souhaitez formater le texte avant de l'écrire dans le fichier journal. Vous pouvez créer une fonction d'assistance pour cela.

if (!function_exists('logIt')) {
    function logIt($logMe)
    {
        $logFilePath = storage_path('logs/cron.log.'.date('Y-m-d').'.log');
        $cronLogFile = fopen($logFilePath, "a");
        fwrite($cronLogFile, date('Y-m-d H:i:s'). ' : ' .$logMe. PHP_EOL);
        fclose($cronLogFile);
    }
}
0
PHP Worm...

Dans Codeigniter vous pouvez utiliser la méthode FILE_APPEND

$logged_user_id = $this->session->userdata('user_id');
$insert_log = 'process => 'YOUR PROCESS STATUS TO LOG', user_id => '.$logged_user_id.',reg_at => '.date("d/m/Y h:i:sa");
$Dt = date('d-m-Y');    
file_put_contents(APPPATH."assets/logs/".$Dt."_log.txt", $insert_log.PHP_EOL , FILE_APPEND | LOCK_EX);

Ce journal peut être créé et ajouter des données quotidiennement.

0
Anandan K