it-swarm.com.de

Müssen am Anfang der Datei mit schreiben PHP

Ich mache dieses Programm und versuche herauszufinden, wie man Daten an den Anfang einer Datei schreibt und nicht an das Ende. "a"/append schreibt nur bis zum Ende, wie kann ich es an den Anfang schreiben lassen? Weil "r +" die vorherigen Daten überschreibt.

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

Hier ist meine ganze Datei:

<!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

Die schnell und schmutzig:

<?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

Wenn Sie nicht den gesamten Inhalt der Datei in eine Variable laden möchten, können Sie die Funktion Streams von PHP verwenden:

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

Dies schreibt die Zeichenfolge, die Sie in eine temporäre Datei einfügen möchten. Anschließend wird der Inhalt der Originaldatei an das Ende der temporären Datei geschrieben (mithilfe von Streams, anstatt die gesamte Datei in eine Variable zu kopieren) die Originaldatei und benennt die temporäre Datei um, um sie zu ersetzen.

Hinweis: Dieser Code basiert ursprünglich auf einem jetzt nicht mehr existierenden Blogeintrag von Chao Xu. Der Code ist seitdem auseinandergegangen, aber der ursprüngliche Beitrag kann in der Wayback-Maschine angezeigt werden.

36
Jordan Running

Ich denke, Sie können zunächst den Inhalt der Datei lesen und in einer temporären Variablen speichern. Fügen Sie nun die neuen Daten am Anfang der Datei ein, bevor Sie den Inhalt der temporären Variablen anhängen.

 $ file = file_get_contents ($ dateiname); 
 $ content = 'Ihr Inhalt'. $ file; 
 file_put_contents ($ content); 
4
Kailash Badu
  1. Öffnen Sie eine Datei im Modus w + und nicht im Modus +.
  2. Länge des hinzuzufügenden Textes ($ chunkLength)
  3. setzen Sie ggf. einen Dateicursor an den Anfang der Datei
  4. liest $ chunkLength Bytes aus der Datei
  5. den Cursor auf $ chunkLength * $ i setzen;
  6. $ vorab schreiben
  7. setzen Sie $ einen vorangestellten Wert aus Schritt 4
  8. führen Sie diese Schritte aus, während 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

Mit dem folgenden Code können Sie Text am Anfang und Ende der Datei anhängen.

$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

Es gibt keine Möglichkeit, an den Anfang einer Datei zu schreiben, wie Sie denken. Dies ist wahrscheinlich der Grund, warum Betriebssystem und Festplatte die Datei sehen. Es hat einen festen Anfang und ein ausdehnendes Ende. Wenn Sie etwas in der Mitte hinzufügen oder anfangen wollen, müssen Sie etwas rutschen. Wenn es sich um eine kleine Datei handelt, lesen Sie einfach alles und führen Sie Ihre Manipulation durch und schreiben Sie zurück. Wenn nicht, und wenn Sie am Anfang nur die umgekehrte Zeilenreihenfolge hinzufügen, betrachten Sie das Ende als Anfang ...

1
erdogany

Sie können fseek verwenden, um den Zeiger in der Notiz zu ändern.

Es ist zu beachten, dass bei Verwendung von fwrite der aktuelle Inhalt gelöscht wird. Im Grunde müssen Sie also die gesamte Datei lesen, fseek verwenden, Ihren neuen Inhalt schreiben und die alten Daten der Datei schreiben.

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

Wenn Ihre Datei wirklich sehr groß ist und Sie nicht zu viel Speicher verwenden möchten, möchten Sie möglicherweise zwei Ansätze haben

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

Die Lösung von Ben scheint meiner ehrlichen Meinung nach unkomplizierter zu sein.

Ein letzter Punkt: Ich weiß nicht, was Sie in database.txt vorrätig haben, aber mit einem Datenbankserver können Sie dasselbe leichter tun.

1
RageZ

Dieser Code speichert Daten vom Anfang der Datei, um sie vor dem Überschreiben zu schützen. Als nächstes werden alle in Datei chunk vorhandenen Daten für Block neu geschrieben.

$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() und file_put_contents() verwenden mehr Speicher als die Funktionen fopen(), fwrite() und fclose():

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