azok: arrayelement wird nicht gelöscht...

hi!

...ja, ich arbeite noch immer an meinem weblog. - leider habe ich hier ein problem, auf das ich keine lösung finde...:

  
$clid = $_GET['clid'];  
  $open_file = @fopen($file,'a')  
    or die("Konnte Datei <b>$open_file</b> nicht öffnen");  
  flock($open_file,2);  
  $file_array = file($file);  
  foreach($file_array as $key => $value) { #array mit der betreffenden clid heraussuchen  
    if(strpos($value, $clid) !== false) {  
   $comment_edit = $file_array[$key];  #dieses in variable speichern  
   unset($file_array[$key]); #sofort löschen  
 }  
  }  

die variable $comment_edit wird mir brav gefüllt. leider wird danach aber das element nicht gelöscht... - vielleicht habe ich hier aber auch einen denkfehler... naja, ich komm einfach nicht drauf. wäre froh, wenn mir wer helfen kann!

lg
azok

--
Murphys Law: "Alles Schöne im Leben ist entweder illegal, ungesetzlich oder es macht dick."
Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:( n4:° ss:| de:] js:| ch:( sh:) mo:) zu:)
  1. Hello,

    Wo soll das Element denn gelöscht werden und wie stellst Du fest, dass es nicht passiert ist?

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. hi!

      also, ich habe mir eine "funktion" geschrieben, wo einzelne kommentare vom administrator kommentiert werden können. dazu wird das betreffende element, welches über die id (clid), die über die url übergeben wird in der foreach schleife in eine variable geschrieben (zuerst wird das ausgangsfile im modus "a" geöffnet, gesperrt, danach entsperrt und geschlossen), und danach sofort gelöscht. dann wird die variable exploded also, es werden die delimiter | entfernt und demnach alle einträge dazwischen in ein array eingelesen. danach wird das betreffende array element (der text) in eine textbox geschrieben. dort kann der verändert werden. mittels post werden dann die alten variablen in hidden-fields übergeben, nur nicht die alte text variable, die durch den neu eingegebenen text ersetzt wird, also das betreffende kommentar wird neu zusammengesetzt:

      $id.DELIMITER.$name.DELIMITER.$neuer_text... ."\n";

      anschließend wird das ursprungsfile geöffnet, gesperrt, das neue kommentar hineingeschrieben (param. "a"), entsperrt, geschlossen.

      dass es nicht gelöscht wurde, erkenne ich daran, dass dann der eintrag doppelt vorhanden ist. - als alter sowie als neuer

      lg
      azok

      --
      Murphys Law: "Alles Schöne im Leben ist entweder illegal, ungesetzlich oder es macht dick."
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:( n4:° ss:| de:] js:| ch:( sh:) mo:) zu:)
      1. Hello,

        anschließend wird das ursprungsfile geöffnet, gesperrt, das neue kommentar hineingeschrieben (param. "a"), entsperrt, geschlossen.

        Das "a" könnte das Problem sein. Bei älteren PHP-Versionen hatte der Modus "a" bei Windows und bei Linux noch unterscheidliche Wirkung, aber inzwischen lässt sich der Dateizeiger einheitlich nicht mehr zum Schreiben vom Fileende wegbewegen, egal ob bei Linux oder WinDOS.

        Du müsstest zum Schreiben also "rb+" benutzen oder "wb+", wenn das File ganz neu geschreiben werden soll.

        Generell hast Du wahrscheinlich ein "akademisches" Problem.

        Deine Datensätze sollten zu Sicherheit alle eine Unique-ID tragen.
        Wenn Du nun einen Datensatz ändern willst, passiert folgendes:

        Datei öffnen und read-locken
          Datensätze lesen inclusive Unique-ID
          Datei schließen
          Datensätze im Formular anzeigen

        Datensatz markieren und Post
          Datei öffnen und read-locken
          Datensatz suchen
          Datei schließen
          Datensatz anzeigen im Fomular

        Datensatz ändern
          Post mit neuen Daten und Unique-ID
          Datei öffnen und exclusive locken
          Datensatz mit ID suchen
          Datensatz austauschen oder löschen (je nach Auftrag)
             Es muss eine neue Unique-ID vergeben werden!
          Datei schließen
          Erfolgs- oder Misserfolgsmeldung

        Für den Fall, dass ein anderer berechtigter User den betroffenen Datensatz vor Dir zurückgeschreiben hat, hat der ja eine neue ID beim Schreiben bekommen. Wenn Du jetzt Deine Version zurückschreiben willst, passt die ID nicht mehr und Du kannst eine Fehlermeldung ausgeben, den DS ggf. auch neu lesen und nochmals vorlegen, oder oder oder

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. hi!

          zzt habe ich es so gelöst, dass ich den betreffenden datensatz zunächst über foreach in eine variable übernehme, die anderen in eine lokale datei kopiere. dann wird die ursprungsfile glelöscht und die lokale datei in den namen der ursprungsdatei umbenannt. anschließend wird der datensatz nach den delimitern exploded und das text-element in das formular geladen. dort kann man änderungen vornehmen, bei der bestätigung durch 'ok' wird dann der neue datensatz ins file geschrieben.

          lg
          azok

          --
          Murphys Law: "Alles Schöne im Leben ist entweder illegal, ungesetzlich oder es macht dick."
          Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:( n4:° ss:| de:] js:| ch:( sh:) mo:) zu:)
  2. Hallo,

    $clid = $_GET['clid'];
      $open_file = @fopen($file,'a')
        or die("Konnte Datei <b>$open_file</b> nicht öffnen");
      flock($open_file,2);
      $file_array = file($file);
      foreach($file_array as $key => $value) { #array mit der betreffenden clid heraussuchen
        if(strpos($value, $clid) !== false) {
       $comment_edit = $file_array[$key];  #dieses in variable speichern
       unset($file_array[$key]); #sofort löschen

    ^siehe Anmerkung

    }
      }

    
    >   
    
    Anmerkung:  
    <http://de.php.net/manual/de/control-structures.foreach.php>  
    ...  
    Anmerkung: Beachten Sie auch, dass foreach mit einer Kopie des angegebenen Arrays arbeitet, nicht mit dem Array selbst. Deshalb wird auch der Arrayzeiger nicht wie bei dem each()-Konstrukt verändert und Veränderungen an ausgegebenen Arrayelementen haben keine Auswirkung auf das originale Array. Trotzdem wird der interne Arrayzeiger des originalen Arrays bei der Verarbeitung bewegt. Angenommen, die foreach-Schleife ist komplett abgearbeitet, wird der interne Arrayzeiger (des originalen Arrays) auf das letzte Element zeigen.  
    ...  
      
    viele Grüße  
      
    Axel  
      
    
    
    1. Hello,

      $clid = $_GET['clid'];
        $open_file = @fopen($file,'a')
          or die("Konnte Datei <b>$open_file</b> nicht öffnen");
        flock($open_file,2);
        $file_array = file($file);
        foreach($file_array as $key => $value) { #array mit der betreffenden clid heraussuchen
          if(strpos($value, $clid) !== false) {
         $comment_edit = $file_array[$key];  #dieses in variable speichern
         unset($file_array[$key]); #sofort löschen
                  ^siehe Anmerkung
      }
        }

      
      > >   
      > Anmerkung:  
      > <http://de.php.net/manual/de/control-structures.foreach.php>  
      > ...  
      > Anmerkung: Beachten Sie auch, dass foreach mit einer Kopie des angegebenen Arrays arbeitet, nicht mit dem Array selbst. Deshalb wird auch der Arrayzeiger nicht wie bei dem each()-Konstrukt verändert und Veränderungen an ausgegebenen Arrayelementen haben keine Auswirkung auf das originale Array. Trotzdem wird der interne Arrayzeiger des originalen Arrays bei der Verarbeitung bewegt. Angenommen, die foreach-Schleife ist komplett abgearbeitet, wird der interne Arrayzeiger (des originalen Arrays) auf das letzte Element zeigen.  
        
      Das ist hier aber schlecht beschrieben und wahrscheinlich deshalb auch von Dir missverstanden worden. $file\_array (die Adresse, die sich dahinter verbirgt) refernziert hier immer das Original-Array, auch in der foreach()-Schleifenfunktion. Der Passus "Kopie" bezieht sich auf die $value-Elemente. Der "Zeiger" auf die $value-Elemente zeigt jeweils auf eine Kopie der Array-Elementes.  
        
        $file\_array[$key]  referenziert aber immer das Original-Element.  
        
      Intern wickelt PHP das noch anders ab.  
        
        
      Der Fehler muss aber irgendwo anders stecken.  
        
        
        
        
      Harzliche Grüße aus <http://www.annerschbarrich.de>  
        
      Tom
      
      -- 
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen  
      Nur selber lernen macht schlau