Chris: Zeile in Textdatei löschen (Problem)

Beitrag lesen

Hallo Du Einer,

<?PHP
    $delid = $_GET['delid'];
    $dir = opendir('../data');
    $filename = '../data/kontakte.txt';
    $filename2 = '../data/tempkontakte.txt';
    $fp = fopen($filename, "r");
    $fp2 = fopen($filename2, "a");
    $contents = file($filename);

Warum deklarierst Du $filename, wenn Du es dann nicht benutzt?

file() ist so nicht geeignet für konkurrierende Operationen

Die Veränderung der Daten bedarf der exclusiven Sperre

von VOR dem Lesen bis NACH dem Schreiben!

$anzahl = count($contents);
    $setid = 1;

##     Warum for() und nicht foreach() ?

for ($a=0;$a<$anzahl;$a++)

{

list $id,$name,$vorname,$strasse,$plz,$ort,$telg,$telp,$mobg,$mobp,$mail1,$mail2,$nick,$burtzel) = explode("#", $contents[$a]);

if ($fp2) {
          flock($fp2,2);

##  Das Sperren ist hier schon zu spät.
##  Die Quelldatei könnte zwischenzeitlich trotzdem nochmal
##  gelesen werden

if ($id == $delid) {
     $setid = $setid;
   }
   else {
     fputs ($fp2, "$setid#$name#$vorname#$strasse#$plz#$ort#$telg#$telp#$mobg#$mobp#$mail1#$mail2#$nick#$burtzel ");
     $setid = $setid+1;
   }
   flock($fp2,3);
    }
    else {
      echo "Fehlaaaa!";
     }
}
// close file
fclose($fp);
fclose($fp2);
unlink('../data/kontakte.txt');
if (rename("../data/tempkontakte.txt", "../data/kontakte.txt")) {
echo "ok";}

closedir($dir);
?>

Es würde sich lohnen, sich mit fgetcsv() auseinanderzusetzen und außerdem die Datei auch als 'echte' CSV-Datei abzuspeichern.

Das erspart einem eine Menge Arbeit oder Kummer, wenn in den Feldern Sonderzeichen enthalten sind.

LG

Chris