mathefritz: php: file(...) : Format der Datei?

zu lesende Datei "Erledigte":

"5" => true,"6" => true,"7" => true,"8" => false,"9" => true ( mit \n am Ende )

Testcode

<?php
   $Erledigt = file("ErledigteDb2");
echo "5:";echo $Erledigt["5"]  ? "W" : "F"; echo   ", ";
echo "6:";echo $Erledigt["6"]  ? "W" : "F"; echo   ", ";
echo "7:";echo $Erledigt["7"]  ? "W" : "F"; echo   ", ";
echo "8:";echo $Erledigt["8"]  ? "W" : "F"; echo   ", ";

echo "9:";echo $Erledigt["9"]  ? "W" : "F"; echo   "<br>";

print_r($Erledigt);
?>

Ergebnis


`5:F, 6:F, 7:F, 8:F, 9:F
Array ( [0] => "5" => true,"6" => true,"7" => true,"8" => false,"9" => true ) `

der print_r liefert also vernünftiges - aber warum nicht auch die echos 6: T, 7: T ?

  1. Hallo,

    zu lesende Datei "Erledigte":

    $Erledigt = file("ErledigteDb2");

    na, welche denn nun?

    Array ( [0] => "5" => true,… ) `

    das sieht wie ein verschachteltes Array aus.

    Gruß
    Kalk

    1. Hi,

      Array ( [0] => "5" => true,… ) `

      das sieht wie ein verschachteltes Array aus.

      ist es aber nicht. Ein Array mit einem Eintrag (mit Index 0), der Inhalt ist die gesamte Zeile der Datei.

      cu,
      Andreas a/k/a MudGuard

    2. danke, aber es als verschachtelt aufzufassen, also Zugriff mit $Erledigt[0][...] macht's auch nicht besser.

      1. Hallo,

        danke, aber es als verschachtelt aufzufassen, also Zugriff mit $Erledigt[0][...] macht's auch nicht besser.

        Natürlich nicht, die anderen haben doch längst aufgezeigt, dass es nicht verschachtelt ist. (Und ich schrieb ja auch bloß, dass es verschachtelt aussieht)

        Gruß
        Kalk

  2. Hi,

    <?php
       $Erledigt = file("ErledigteDb2");
    echo "5:";echo $Erledigt["5"]  ? "W" : "F"; echo   ", ";
    echo "6:";echo $Erledigt["6"]  ? "W" : "F"; echo   ", ";
    echo "7:";echo $Erledigt["7"]  ? "W" : "F"; echo   ", ";
    echo "8:";echo $Erledigt["8"]  ? "W" : "F"; echo   ", ";
    
    echo "9:";echo $Erledigt["9"]  ? "W" : "F"; echo   "<br>";
    
    print_r($Erledigt);
    ?>
    

    ersetz das print_r doch mal durch ein var_dump.

    Ergebnis

    
    `5:F, 6:F, 7:F, 8:F, 9:F
    Array ( [0] => "5" => true,"6" => true,"7" => true,"8" => false,"9" => true ) `
    

    Wenn ich das sehe, enthält $Erledigt ein Array mit genau einem Eintrag (mit Index 0).

    Du fragst aber ab, ob es Einträge mit Key (nicht Index) "5" bzw. "6", "7", "8" gibt.

    Warum benutzt Du hier Strings statt Nummern?

    Und warum erwartest Du, daß file Deine Zeile zerlegt? file gibt für jede Zeile ein Array-Element. Du hast nur eine Zeile, also nur 1 Array-Element. Aber Du willst viele abfragen.

    der print_r liefert also vernünftiges - aber warum nicht auch die echos 6: T, 7: T ?

    vernünftig ja - eine Zeile mit einem String.

    cu,
    Andreas a/k/a MudGuard

    1. ich hatte auch schon ein Element je Zeile probiert .

      1. Hallo

        ich hatte auch schon ein Element je Zeile probiert .

        Dann machst du irgendwas anderes auch noch falsch.

        Dass deine Notation des Dateiinhalts nicht mit file funktioniert, sollte dir mittlerweile klar sein. Warum, wurde ja schon -zigmal gesagt. Meine Frage, was deiner Meinung nach echo $Erledigt["9"] ? "W" : "F"; tut, hast du aber noch nicht beantwortet. Und warum du dich gegen die Benutzung der Funktion serialize, die für deinen Zweck vermutlich gut geeignet ist, wehrst, ist mir ehrlich gesagt schleierhaft.

        Tschö, Auge

        --
        Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
        Toller Dampf voraus von Terry Pratchett
  3. Ohne auswendig zu wissen was file(...) genau macht, bezweifle ich dass es die Datei auswertet.

    Das dürfte an print_r deutlich werden, das sagt dir dass $Erledigt nur ein Element hat, nämlich mit Index 0 und dem Inhalt
    "5" => true,"6" => true,"7" => true,"8" => false,"9" => true

    Dein Code liest also die Zeile ein wie sie ist. Die Elemente [1] usw. gibt es nicht.

    6: T, 7: T ?

    ???

  4. Hallo

    "5" => true,"6" => true,"7" => true,"8" => false,"9" => true ( mit \n am Ende )

    Was heißt „mit \n am Ende“? file liest eine Datei in ein Array mit einem Element pro Zeile der Datei ein. Hat deine Datei die gezeigte Struktur mit einem Umbruch hinter dem gezeigten Inhalt, befindet sich der gezeigte Inhalt in einem Arrayelement. Handelt es sich um eine Zeile je Zahl, führst du uns mit deiner Notation mächtig in die Irre.

    Testcode

    <?php
       $Erledigt = file("ErledigteDb2");
    echo "5:";echo $Erledigt["5"]  ? "W" : "F"; echo   ", ";
    echo "6:";echo $Erledigt["6"]  ? "W" : "F"; echo   ", ";
    echo "7:";echo $Erledigt["7"]  ? "W" : "F"; echo   ", ";
    echo "8:";echo $Erledigt["8"]  ? "W" : "F"; echo   ", ";
    
    echo "9:";echo $Erledigt["9"]  ? "W" : "F"; echo   "<br>";
    
    print_r($Erledigt);
    ?>
    

    Was soll echo $Erledigt["9"] ? "W" : "F"; überhaupt tun? Mit dem ternären Operator (if ? ja : nein) soll anhand einer Entscheidung etwas geschehen. Du fällst aber mit echo $Erledigt["9"] ? … keine Entscheidung.

    Ergebnis

    
    `5:F, 6:F, 7:F, 8:F, 9:F
    Array ( [0] => "5" => true,"6" => true,"7" => true,"8" => false,"9" => true ) `
    

    der print_r liefert also vernünftiges …

    Tut er das? Ich vermute mal, dass du anhand von true und false entscheiden willst, ob „W“ oder „F“ ausgegeben werden soll? Wenn das so sein sollte, sollte sich die Ausgabe für 8 von der der anderen Punkte unterscheiden. Tut sie aber nicht.

    … aber warum nicht auch die echos 6: T, 7: T ?

    Was sind die „T“?

    Tschö, Auge

    --
    Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
    Toller Dampf voraus von Terry Pratchett
  5. Tach!

    der print_r liefert also vernünftiges - aber warum nicht auch die echos 6: T, 7: T ?

    Im Zweifelsfall besser mit var_dump() anschauen. print_r() erzeugt eine vereinfachte Ausgabe. Und natürlich ein <pre> vorher ausgeben, oder im Quelltext der Seite anschauen. Dann sieht man auch, wenn da kein Array kommt, sondern nur eine Zeile.

    error_reporting auf E_ALL und display_errors auf on stellen, hilft dann auch beim Feststellen, dass du auf nicht vorhandene Array-Elemente zuzugreifen versuchst.

    dedlfix.

    1. hier wird gesagt, daß file eine Datei in einen Array übernimmt;
      leider finde ich da aber nicht, wie der Dateiinhalt formatiert sein muß. Hilft mir da bitte jemand ? FILE_IGNORE_NEW_LINES hilft auch nicht. Danke.

      1. Tach!

        hier wird gesagt, daß file eine Datei in einen Array übernimmt;
        leider finde ich da aber nicht, wie der Dateiinhalt formatiert sein muß. Hilft mir da bitte jemand ? FILE_IGNORE_NEW_LINES hilft auch nicht.

        Es gibt keine Vorschrift, wie der formatiert sein muss. Es werden Textzeilen eingelesen. In jeden Array-Eintrag eine. Für alles andere als Text, der zeilenweise in ein Array geladen werden soll, ist file() nicht zu verwenden.

        Wenn du strukturierte Daten speichern möchtest, nimm zum Beispiel serialize() zum Erzeugen von Text aus diesen Daten und anschließend file_put_contents() zu Speichern. Einlesen geht dann mit file_get_contents() und unserialize().

        dedlfix.

  6. file() liefert den Inhalt der Datei als Array, jede Zeile ist ein Array-Element. Ich vermute mal, Du erwartest, dass diese Funktion in Deiner einen Zeile ein Array erkennt, was de Fakto nicht der Fall ist. Tipp: Wenn Du Arrays in Dateien speichern willst, nimm serialize(). Dann kannst Du die Arrays auch wieder herstellen.

    MfG

    1. ein Element/Zeile und FILE_IGNORE_NEW_LINES hab ich schon probiert. Serialize scheint mir hier "Kanone auf Spatzen".
      Bin wohl schon zu müde, auf seit 4 .

      1. Tach!

        Serialize scheint mir hier "Kanone auf Spatzen".

        Du kannst dir natürlich auch selbst etwas ausdenken, wie du deine Daten in ein Textformat bringen kannst. serialize() jedenfalls ist eine sehr einfache Methode, genau das zu tun.

        dedlfix.

      2. Serialize scheint mir hier "Kanone auf Spatzen".

        Einen eigenen Serializer zu bauen ist auch keine Hexerei. Wenn Du eh nur Zahlen zu speichern hast, kannst Du das paarweise machen, du brauchst:

        1. ein byte für die SchlüsselZahl
        2. ein byte für wahr oder falsch

        Falls die Schlüsselzahlen größer als 255 sind, brauchst Du natürlich mehr Speicher, also 2 oder 4 Bytes je Zahl. Für wahr//falsch reicht natürlich auch ein Bit aber dann musst Du Dich auch mit Bitoperaoren anfreunden was auf jeden Fall auch einen gewissen Lerneffekt hat 😉

        Oder Du missbrauchst das fürs Vorzeichen reservierte Bit für Wahr oder Falsch, das geht natürlich auch, damit wird nur der Wertebereich für eine Zahl halbiert. Alle dafür erforderlichen Schablonen findest Du in der Beschreibung zur pack()-Funktion.

        Und Dateien blockweise lesen//schreiben das kann PHP sicher auch. Musst Dich halt nur dafür interessieren, lernen kann man alles.

        MfG

        PS: Die Idee mit dem Vorzeichen finde ich richtig gut, das spart ne Menge TippArbeit.

        1. Nur ein Beispiel zum Serialisieren vorzeichenbehafteter Integer (7 Bit):

          $binary = pack("c*", -3, 5, -12, -24, 33);
          print_r( unpack("c*", $binary) );
          
          Array
          (
              [1] => -3
              [2] => 5
              [3] => -12
              [4] => -24
              [5] => 33
          )
          

          $binary ist das was in der Datei steht. Größere Zahlen=> Andere Schablone, siehe Doku. Und wie es in der Datei innendrinnen aussieht, ist völlig uninteressant.

          1. Hello Rolf,

            Nur ein Beispiel zum Serialisieren vorzeichenbehafteter Integer (7 Bit):

            $binary = pack("c*", -3, 5, -12, -24, 33);
            print_r( unpack("c*", $binary) );
            
            Array
            (
                [1] => -3
                [2] => 5
                [3] => -12
                [4] => -24
                [5] => 33
            )
            

            $binary ist das was in der Datei steht. Größere Zahlen=> Andere Schablone, siehe Doku. Und wie es in der Datei innendrinnen aussieht, ist völlig uninteressant.

            Nun bring den armen Mathefritz bitte nicht ganz durcheinander!

            Das was Du jetzt zeigst, nennt sich "Daten packen", oder "Daten in Strukturen anordnen", warum die PHP-Funktion nicht umsonst pack() heißt. Man kann hier Aahlfrei auf die Datenwerte zugreifen.

            Unter "Serialisierung" versteht man gemeinhin, dass Daten hintereinanderweg angeordnet werden, unabhägig welche aktuelle Länge (welchen Speicherbedarf) sie einnehmen. Die einzelnen Werte können beim einen Mal eine andere Länge haben, als beim anderen. Darum kann man nicht wahlfrei auf sie zugreifen, sondern muss die ganze Serie der Daten einlesen, bis das entprechende Feld im Stream "vorbeikommt". Entsprechend muss ein Kriterium (Zeichen) geben, das die Datenfelder voneinander trennt.

            PHP bietet dafür serialize() und unserialize().

            Die Daten aus einem Array serialisiert in eine Datei zu schreiben, ist recht einfach:

            <?php   ### serialize_array.php ### utf-8 ### äöüÄÖÜ
            
            header('Content-Type: text/plain; CharSet=utf-8');
            
            $_data = array();
            $_data['person']['fname'] = 'Klaus';
            $_data['person']['lname'] = 'Köhler';
            $_data['adddress']['street'] = 'Kartoffelacker';
            $_data['adddress']['houseno'] = 19;
            $_data['adddress']['zipcode'] = '08124';
            $_data['adddress']['city'] = 'Knolzstedt';
            
            print_r($_data);
            
            $streamout = serialize($_data);
            file_put_contents('daten.dat', $streamout);
            
            $streamin = file_get_contents('daten.dat');
            
            $_data = false;
            $_data = unserialize($streamin);
            
            print_r($_data);
            
            var_dump($_data);
            
            ?>
            

            Das kleine Testscript sollte Mathefritz verdeutlichen, wie einfach es ist, die Daten zu serialisieren und sie wiederzuholen.

            Zu beachten ist auf jeden Fall der weitere Umgang mit den Strings, die auf den ersten Blick wie Zahlen aussehen $_data['adddress']['zipcode'] = '08124'; und mit eriner führenden 0 beginnen. Sowohl die Array-Zuweisung, als auch serialize können damit umgehen. Spannend ist nur, ob der Programmierer auch im weiteren Script damit umgehen kann, damit die führende Null nicht verschwindet.

            Allerdings muss ich hier auch betonen, dass das nur ein Testscript ist, um "mal eben schnell" Daten zu serialisieren. Wenn es in den produktiven Betrieb geht, muss man das eventuelle Schonvorhandensein der Datei beim Wegschreiben und das eventuelle Nichtvorhandensein beim Holen berücksichtigen, sowie den konkurrierenden Betrieb. Das musste Mathefritz aber auch schon bei seinen bisherigen Versuchen.

            Liebe Grüße
            Tom S.

            --
            Die Krawatte ist das Kopftuch des Westens
            1. Nun bring den armen Mathefritz bitte nicht ganz durcheinander!

              Das war der vorher schon. Aber das ist ja kein Problem, kann man alles lernen (oder auch nicht). Und ja, es muss so oder so serialisiert werden, egel ob die Funktion serialize heißt oder anders.

              Der Name pack() ist eher irreführend. Weil es wird ja nichts gepackt, sondern es werden nur dem Datentype (siehe Schablone) entsprechend die Bytes erzeugt.

              Hier ein bischen mehr zum Thema. Einen vorzeichenlosen Integer 1145258561 in einer Datei zu speichern, braucht 4 Bytes und das ist die Aufgabe von pack() eben diese 4 Bytes zu erzeugen. Ein äquivalenter Datentyp in c ist uint32_t und da sieht das dann so aus: fwrite(u32, 4, 1, fh); that means: Erzeuge einen Block mit der Länge von 4 Bytes.

              Und wo hier auch die Frage auftauchte, ob eine Zahl als String oder als Zahl in einer Datei zu speichern sei, hier ist die Anwort: Für jeden numerischen Datentyp gibt es entsprechende Bytesequenzen.

              Aber an eurer Bewertung sehe ich, dass ihr das wahrscheinlich niee verstehen werdet. wo ist bloß der Geist von SELFHTML geblieben, das Niveau in diesem Forum ist mächtig abgesackt. Daran ändern auch die vielen Upgrades nichts.

              MfG

              1. Klar wird da gepackt - wenn aus dem String -126 (4 Bytes) auf einmal nur noch ein Byte wird. Nicht jedes Packen findet Huffman-codiert statt...

                <anekdote>"Mein" alter IBM Großrechner von 1965 kannte gepackte Zahlen zum Rechnen und unterstützte die sogar im Assembler - da wurde jede Dezimalziffer in ein Halbbyte gepackt und das Vorzeichen kam als Hex-Wert von A-F ins letzte Halbbyte hinein (Regel: DB macht Minus, CAFE macht Plus, gilt auch heute noch :D)</anekdote>

                Prinzipiell hast Du natürlich recht; so kann man es machen. Das Ergebnis ist vermutlich das kompakteste und die Ausführungsgeschwindigkeit die höchste. Es hat aber ein paar Nachteile:

                • Fritz muss es selbst programmieren und testen.
                • Die Ausgabedatei ist spezifisch für diesen Zweck formatiert, es ist kein generisches Format.
                • Die Ausgabedatei ist nicht menschenlesbar, man braucht einen Hex-Viewer/Editor und muss das Format exakt im Kopf haben. Knapp vorbeigepatcht ist auch ein Error.
                • Binärzahlen sind plattformspezifisch (Big/Little Endian), was Fritz vermutlich egal ist.
                • An Floats will ich gar nicht erst denken, zumindest nicht ohne einen Hexeditor der das Format kennt.

                Dagegen ist das hier doch deutlich eleganter, und wenn man unbedingt kompakt speichern will, kann man es auch noch zippen...

                $test = [ 4711 => true, 815 => [ false, true, [ 4,7,1 ] ] ];
                
                $ser = serialize($test);
                $jsn = json_encode($test);
                $zip = gzdeflate($jsn, 9);
                
                echo strlen($ser) . " - " . $ser . "\n";
                echo strlen($jsn) . " - " . $jsn . "\n";
                echo strlen($zip) . " - " . $zip . "\n";
                

                ergibt:

                79 - a:2:{i:4711;b:1;i:815;a:3:{i:0;b:0;i:1;b:1;i:2;a:3:{i:0;i:4;i:1;i:7;i:2;i:1;}}}
                40 - {"4711":true,"815":[false,true,[4,7,1]]}
                39 - (binärsalat)
                

                Vorteil ist, dass es ohne eigene Mitarbeit typsicher ist und zur Not mit einem Texteditor manipuliert werden kann. Wenn einem Serialize oder JSON nicht gefallen, gibt's auch noch YAML, das muss man sich nur erstmal reinPECLn. Das INI Dateiformat, wie schon mal vorgeschlagen, lässt sich mit parse_ini_file() lesen, aber es gibt keinen fertigen Writer dafür (oder ich finde keinen).

                Langer Rede, kurzer Sinn: Am besten speichert man es in einer SQL Server Tabelle :-)

                Rolf

                1. Datentypen gibt es ja schon lange. Und es ist möglich, eigene, sog. abstrakte Datentypen zu definieren wie z.B. das in c seit Urzeiten geht (struct).

                  Und genauso, wie ein struct im Hauptspeicher liegt, wird es in c in einer Datei abgebildet. Demo hier aber es geht noch mehr: Die Datei ist auch mit Perl oder PHP lesbar!

                  Das macht den tieferen Sinn von Datentypen mehr als deutlich 😉 Und natürlich auch das von mir bereits erwähnte blockweise Lesen und Schreiben von Dateien.

                  MfG

  7. Hello,

    lesende Datei "Erledigte":

    "5" => true,"6" => true,"7" => true,"8" => false,"9" => true ( mit \n am Ende )

    Wie hast Du diese Darstellung beschafft? Steht das so in der Datei, wenn Du sie mit einem Texteditor öffnest?

    Wie/womit hast Du die Daten in die Datei hineinbekommen?

    Liebe Grüße
    Tom S.

    --
    Die Krawatte ist das Kopftuch des Westens
    1. Danke für das Interesse; Datei "Erledigte" manuell, mit Texteditor erstellt.

      1. Hello,

        Danke für das Interesse; Datei "Erledigte" manuell, mit Texteditor erstellt.

        Wenn Du die Datei manuell erstellen willst, dann schau dir mal das Format für INI-Dateien an.

        Die kannst Du bequem optisch lesen, für das Programm als Array einlesen und mit der Funktion aus einem Array wieder eine solche Datei machen. Das wäre eine Alternative zu serialize()/unserialize() für kleine Datenmengen.

        Ich ahne, dass Du diese Datenzeile in einer Spalte einer Datenbank notiert haben könntest?

        Liebe Grüße
        Tom S.

        --
        Die Krawatte ist das Kopftuch des Westens
        1. Hallo TS

          Wenn Du die Datei manuell erstellen willst, dann schau dir mal das Format für INI-Dateien an.

          ich nehme an das war kein Rat auch in den INI herumzupfuschen - würde der Host world4you auch kaum erlauben.
          Ich glaube auch, inzwischen habe ich eine pasende Lösung.

          Ich ahne, dass Du diese Datenzeile in einer Spalte einer Datenbank notiert haben könntest?

          ( womit Du Dich wohl auf diesen Post beziehst.
          nein,
          aber es geht um, die individuell programmierte, Ausgabe von Datenbank Tabellen, der my_SQL_admin kann also nicht verwendet werden; ie keys sind ID's von Tabellenzeilen, und die boolschen Werte sagen aus, ob da noch ein "toDo" ist oder nicht; Der Bekannte dem ich dabei helfe, will diese Information, die durch denn checked/nicht checked zustand einer Checkbox optisch Repräsentiert wird, NICHT in der DB selbst speichern, was einfacher wäre . Lösung, die ersteinmal nach meiner Vorstellung funktioniert, ist folgende

          5
          false
          6
          false
          8
          true
          

          mit "\n" auch am Ender der letzten Zeile Beispielcode lesen/schreiben ( Beginn wird aber schreiben sein: alle IDD's der DBtabelle mit false )

          <?php
             $f = fopen("ErledigteDb2","r");
          //   echo "Gelesen: <br>";
          while( $k = fgets($f) ){
                 $v = fgets($f); $k = substr($k,0,-1);
                                 $v = substr($v,0,-1);
          echo $k,": ",$v,"<br>";       
          $Erledigt[$k] = $v;
          }
          fclose($f);
          $f = fopen("erlneu","w+");
          foreach($Erledigt as $k => $v) {fwrite($f,$k . "\n");fwrite($f,$v . "\n");}
          ?>
          Gruß  
          F.
          
          1. Tach!

            Wenn Du die Datei manuell erstellen willst, dann schau dir mal das Format für INI-Dateien an. ich nehme an das war kein Rat auch in den INI herumzupfuschen - würde der Host world4you auch kaum erlauben.

            Es geht nicht um die php.ini oder andere bereits genutzte Dateien, sondern um eine Datei, die du selbst anlegst, und die ebenfalls das ini-Format verwendet.

            Ich glaube auch, inzwischen habe ich eine pasende Lösung.

            <?php
               $f = fopen("ErledigteDb2","r");
            //   echo "Gelesen: <br>";
            while( $k = fgets($f) ){
                   $v = fgets($f); $k = substr($k,0,-1);
                                   $v = substr($v,0,-1);
            echo $k,": ",$v,"<br>";       
            $Erledigt[$k] = $v;
            }
            fclose($f);
            $f = fopen("erlneu","w+");
            foreach($Erledigt as $k => $v) {fwrite($f,$k . "\n");fwrite($f,$v . "\n");}
            ?>
            

            Warum machst du das so kompliziert? Was genau spricht denn dagegen, serialize()/unserialize zu verwenden?

            dedlfix.

          2. Hello mathefritz,

            bitte entschuldige, wenn das jetzt arrogant rüberkommen sollte. Aber ich denke, dass wir zusammen mit Dir eine Stufe tiefer anfangen müssen, als DU denkst. Das ist eingentlich immer so, wenn jemand kreativ eigene Lösungen zu entwickeln versucht, für die es schon lange etablierte Lösungen gibt.

            Wir sollten also gemeinsam nochmal deine Aufgabenstellung analysieren und dann schauen, wie man das klassisch lösen könte, oder ob deine Lösungsideen dafür vielleicht besser geeignet sind.

            Ich stelle jedenfalls immer wieder fest, dass es sinnlos ist, auf die üblichen Schnittstellendefinitionen in irgendeiner Schicht zu vertrauen, ohne zu wissen, was ein bis n Schichten darunter mit der Funktion/Methodem den Paramtern usw. passiert. Da werden schnell Dinge falsch verstanden und/oder neu erfunden. Zweiteres ist mMn das Schlimmste! Wenn ich in einer höheren Schicht Dinge neu erfinde (emuliere), die in einer tieferen bereits prozessornäher vorhanden waren, lähmt das meistens das System oder sorgt für unbehandelte Raceconditions.

            Liebe Grüße
            Tom S.

            --
            Ohne Kravatte mag ich nicht zu einem offziellen Empfang gehen. Ist das weltweit genauso?
            1. Halle TS danke für Deine Mühe um mich. Leider habe ich im Augenblick den Kopf nicht frei,
              werde aber später darauf zurück kommen . Bin übrigens ca. 9 Jahre älter aus Du und habe für vorort Code-korrekturen noch mit Schaltern und Tasten bitweise prgrammiert . Gruß .
              F.

              1. Hello,

                danke für Deine Mühe um mich. Leider habe ich im Augenblick den Kopf nicht frei,
                werde aber später darauf zurück kommen . Bin übrigens ca. 9 Jahre älter aus Du und habe für vorort Code-korrekturen noch mit Schaltern und Tasten bitweise prgrammiert .

                Aha:

                BNA | Begin next Address BNT | Begin next Tact
                usw. |

                Dann könnten wir doch aber gemeinsam kurz mach den Lochkarten beginnen, oder?

                Keine Angst, den Rest holst Du in Nullkommanix auf, wenn nicht dauerhaft gleich Neusprech verlangt wird, sondern auch noch Muttersprache erlaubt bleibt... :-D

                Liebe Grüße
                Tom S.

                --
                Die Krawatte ist das Kopftuch des Westens
          3. Kunden wollen oft Dinge nicht - die Frage ist, weshalb. Welchen use-case hat dein Bekannter, der es verbietet, diese Erledigt-Info in der Datenbank zu speichern? Oder welche Einwände nennt er - außer "ich will icht"? Denn das ist kein Grund; wenn er einen Experten herbeiholt, dann sollte er auch auf den Rat hören den der Experte gibt (ob der Experte sich dazu 2-nd Level Support geholt hat oder nicht tut da ja nichts zur Sache :) ).

            Ich kann mir vorstellen, dass der Anwender die existierenden Tabellen nicht verändern will. Aber das muss man ja auch nicht. Es spricht doch nichts gegen eine zusätzliche Table "ERLEDIGT" mit zwei Spalten. Die ID, als Integer, und das Erledigt-Flag, vielleicht als boolean - vielleicht auch nicht. Wird diese Erledigt-Geschichte nicht mehr gebraucht, droppt man die Table und gut ist. So knapp kann der Speicher des SQL Servers gar nicht sein, als dass das nicht gehen könnte. Und vom Aufwand her kann das nicht schlimmer sein als die Lernkurve, für deren Bezwingung du gerade uns zwecks Räuberleiter herbeirufst.

            Sequenzielle Dateien, in welchem Format auch immer, gehören zur Datenhaltung eher nicht auf einen Webserver (es gibt natürlich Ausnahmen). Was ist, wenn mehrere Leute gleichzeitig mit diesem Web arbeiten? Beide lesen die Datei, beide ändern was, der eine schreibt, der andere schreibt - wumms, die Änderungen des "einen" sind futsch. Verwendest Du eine DB-Tabelle, macht jeder der beiden einen Update auf "seine" Row, und keiner stört den anderen.

            Eine Absprache, wer gerade was bearbeitet, ist dann aber immer noch nötig. Deswegen finde ich ein einfaches "erledigt" Flag eigentlich zu kurz gesprungen; eigentlich müsste das ein Status sein (offen, in arbeit, erledigt), zusammen mit Spalten für aktueller Bearbeiter und Zugriffsdatum, damit in dem Moment, wo sich jemand ein Objekt zum Bearbeiten vornimmt, es für ihn reserviert werden kann und nicht jemand konkurrierend daran etwas tut - was nachher zu gegenseitigem Überschreiben der Änderungen führen kann. Sowas kann man auch mit Dateien bauen - aber eigentlich schreit es nach einer DB-Table.

            Rolf