web-dev-qa-db-fra.com

Besoin d'écrire au début du fichier avec PHP

Je crée ce programme et j'essaie de savoir comment écrire des données au début d'un fichier plutôt qu'à la fin. "a"/append n'écrit que jusqu'à la fin, comment puis-je l'écrire au début? Parce que "r +" le fait mais écrase les données précédentes.

$datab = fopen('database.txt', "r+");

Voici tout mon dossier:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Facebook v0.1</title>
        <style type="text/css">
            #bod{
                margin:0 auto;
                width:800px;
                border:solid 2px black;
            }
        </style>
    </head>

    <body>
        <div id="bod">
            <?php
                $fname = $_REQUEST['fname'];
                $lname = $_REQUEST['lname'];
                $comment = $_REQUEST['comment'];
                $datab = $_REQUEST['datab'];
                $gfile = $_REQUEST['gfile'];

                print <<<form
                <table border="2" style="margin:0 auto;">
                    <td>
                        <form method="post"  action="">
                              First Name :
                              <input type ="text"
                                         name="fname"
                                         value="">
                              <br>

                              Last Name :
                                <input type ="text"
                                         name="lname"
                                         value="">
                              <br>

                              Comment :
                              <input type ="text"
                                         name="comment"
                                         value="">
                              <br>
                              <input type ="submit" value="Submit">
                        </form>
                    </td>
                </table>
                form;
                if((!empty($fname)) && (!empty($lname)) && (!empty($comment))){
                    $form = <<<come

                    <table border='2' width='300px' style="margin:0 auto;">
                        <tr>
                            <td>
                                <span style="color:blue; font-weight:bold;">
                                $fname $lname :
                                </span>

                                $comment
                            </td>
                        </tr>
                    </table>
                    come;

                    $datab = fopen('database.txt', "r+");
                    fputs($datab, $form);
                    fclose($datab);

                }else if((empty($fname)) && (empty($lname)) && (empty($comment))){
                    print" please input data";
                } // end table

                $datab = fopen('database.txt', "r");

                while (!feof($datab)){
                    $gfile = fgets($datab);
                    print "$gfile";
                }// end of while
            ?>
        </div>
    </body>
</html>
32
Timothy

Le rapide et sale:

<?php
$file_data = "Stuff you want to add\n";
$file_data .= file_get_contents('database.txt');
file_put_contents('database.txt', $file_data);
?>
51
Ben Regenspan

Si vous ne voulez pas charger tout le contenu du fichier dans une variable, vous pouvez utiliser la fonctionnalité Streams de PHP:

function prepend($string, $orig_filename) {
  $context = stream_context_create();
  $orig_file = fopen($orig_filename, 'r', 1, $context);

  $temp_filename = tempnam(sys_get_temp_dir(), 'php_prepend_');
  file_put_contents($temp_filename, $string);
  file_put_contents($temp_filename, $orig_file, FILE_APPEND);

  fclose($orig_file);
  unlink($orig_filename);
  rename($temp_filename, $orig_filename);
}

Cela écrit la chaîne que vous souhaitez ajouter au début dans un fichier temporaire, puis le contenu du fichier original à la fin du fichier temporaire (en utilisant des flux au lieu de copier le fichier entier dans une variable), puis il est supprimé. le fichier d'origine et renomme le fichier temporaire pour le remplacer.

Remarque: Ce code était à l'origine basé sur un article de blog maintenant disparu de Chao Xu. Le code a depuis divergé, mais le message original peut être consulté dans la Wayback Machine .

36
Jordan Running

Je pense que vous pouvez d'abord lire le contenu du fichier et le conserver dans une variable temporaire. Insérez maintenant les nouvelles données au début du fichier avant d'ajouter également le contenu de la variable temporaire.

 $ file = file_get_contents ($ filename); 
 $ content = 'Votre contenu'. $ file; 
 file_put_contents ($ content); 
4
Kailash Badu
  1. Ouvrez un fichier en mode w + et non en mode +.
  2. Obtenir la longueur du texte à ajouter ($ chunkLength)
  3. place un curseur de fichier au début du fichier si nécessaire
  4. lire $ chunkLength octets à partir du fichier
  5. ramène le curseur sur $ chunkLength * $ i;
  6. écrire $ prepend
  7. set $ prepend une valeur à partir de l'étape 4
  8. faire ces étapes, tandis que EOF

    $handler = fopen('1.txt', 'w+');//1
    rewind($handler);//3
    $prepend = "I would like to add this text to the beginning of this file";
    $chunkLength = strlen($prepend);//2
    $i = 0;
    do{
        $readData = fread($handler, $chunkLength);//4
        fseek($handler, $i * $chunkLength);//5
        fwrite($handler, $prepend);//6
    
        $prepend = $readData;//7
        $i++;
    }while ($readData);//8
    
    fclose($handler);
    
4

Vous pouvez utiliser le code suivant pour ajouter du texte au début et à la fin du fichier.

$myFile = "test.csv";<br>
$context = stream_context_create();<br>
  $fp = fopen($myFile, 'r', 1, $context);<br>
  $tmpname = md5("kumar");<br>

//this will append text at the beginning of the file<br><br>
  file_put_contents($tmpname, "kumar");<br>
  file_put_contents($tmpname, $fp, FILE_APPEND);<br>
  fclose($fp);<br>
  unlink($myFile);<br>
  rename($tmpname, $myFile);<br><br>
  //this will append text at the end of the file<br>
  file_put_contents($myFile, "ajay", FILE_APPEND);
3
Ajay Kumar

Il n'y a aucun moyen d'écrire au début d'un fichier comme vous le pensez. Ceci est dû au fait que les systèmes d'exploitation et les disques durs voient le fichier. Il a un début fixe et une fin en expansion. Si vous voulez ajouter quelque chose au milieu ou commencer, il faut un peu de glissement. S'il s'agit d'un petit fichier, il suffit de tout lire, de manipuler et d'écrire. Mais sinon, et si vous ajoutez toujours au début, inversez simplement l'ordre des lignes, considérez la fin comme un début ...

1
erdogany

Vous pouvez utiliser fseek pour changer le pointeur dans la note.

Il est à noter que si vous utilisez fwrite, le contenu actuel sera effacé. Donc, fondamentalement, vous devez lire le fichier entier, utiliser fseek, écrire votre nouveau contenu, écrire les anciennes données du fichier.

$file_data = file_get_contents('database.txt')
$fp = fopen('database.txt', 'a');
fseek($fp,0);
fwrite($fp, 'new content');
fwrite($fp, $file_data);
fclose($fp);

Si votre fichier est vraiment énorme et que vous ne voulez pas utiliser trop de mémoire, vous voudrez peut-être avoir une approche à deux fichiers comme

$fp_source = fopen('database.txt', 'r');
$fp_dest = fopen('database_temp.txt', 'w'); // better to generate a real temp filename
fwrite($fp_dest, 'new content');
while (!feof($fp_source)) {
    $contents .= fread($fp_source, 8192);
    fwrite($fp_dest, $contents);
}
fclose($fp_source);
fclose($fp_dest);
unlink('database.txt');
rename('database_temp.txt','database.txt');

La solution de Ben semble être plus simple à mon avis.

Un dernier point: je ne sais pas ce que vous stockez dans database.txt mais vous pourriez faire la même chose plus facilement en utilisant un serveur de base de données.

1
RageZ

Ce code mémorise les données depuis le début du fichier pour éviter qu'elles ne soient écrasées. Ensuite, il réécrit toutes les données existantes dans le fichier, morceau par morceau.

$data = "new stuff to insert at the beggining of the file";
$buffer_size = 10000;

$f = fopen("database.txt", "r+");
$old_data_size = strlen($data);
$old_data = fread($f, $old_data_size);
while($old_data_size > 0) {
  fseek($f, SEEK_CUR, -$old_data_size);
  fwrite($f, $data);
  $data = $old_data;
  $old_data = fread($f, $buffer_size);
  $old_data_size = strlen($data);
}
fclose($f);
1
Kamil Szot

file_get_contents() et file_put_contents() utilisent plus de mémoire que les fonctions fopen(), fwrite() et fclose():

$fh = fopen($filename, 'a') or die("can't open file");
fwrite($fh, $fileNewContent);
fclose($fh);
0