Herbert: Text-Datenbank

Hallo zusammen,

ich habe ein Vorhaben, weiss aber leider gar nicht, wie ich es (praktikabel) realisieren soll . . .

Meine Idee:
Ich habe ca. 50 Info-Texte (.txt, kann man natürlich auch ändern), die ich meinen Besuchern gerne zur verfügung stellen will.
Momentan habe ich einfach in einer HTML-Tabelle die Stichwörter (Überschriften) mit den entsprechenden Texten verlinkt.

Da ständig neue Texte hinzukommen und ich die neuen nicht einfach unten anfügen möchte, sondern alphabetisch eingeordnet haben möchte, ist das sehr unpraktisch.

Idealerweise stelle ich mir ein kleines Script vor, in dem ich Titel und damit zu verlinkende Seite eingebe und das mir dann aus den Daten eine sortierte Tabelle generiert, die ich in die HTML-Seite einfügen kann.
Sehr schön wäre auch noch eine Suchfunktion, mit der die Besucher in den Texten nach Stichworten suchen können.

Vielleicht hat ja jemand eine Idee dazu . . . wäre nett.

Danke im Voraus

Herbert

  1. Idealerweise stelle ich mir ein kleines Script vor, in dem ich Titel und damit zu verlinkende Seite eingebe und das mir dann aus den Daten eine sortierte Tabelle generiert, die ich in die HTML-Seite einfügen kann.
    Sehr schön wäre auch noch eine Suchfunktion, mit der die Besucher in den Texten nach Stichworten suchen können.

    Wie Du schon erkannt hast, ist das mit PHP und ggf. mit einer MySQL-Datenbank zu realisieren.
    Ich weiß jedoch nicht, ob Du dich mit der Scriptsprache auskennst.

    1. PHP etwas - MySQL leider garnicht . . .
      es sollte also schon "idiotensicher" sein

      Gruß
      Herbert

      1. Hallo Herbert,

        bei bis zu ca. 1000 Datensätzen à 1000 Bytes geht das ohne weiteres als Textdatei.

        Schau Dir mal die Arrayfunktionen von PHP genauer an.
        Außerdem könnten noch ganz praktisch sein:

        • serilaize()
        • unserialize()

        Grüße

        Tom

        1. Hallo Tom,

          bei bis zu ca. 1000 Datensätzen à 1000 Bytes geht das ohne weiteres als Textdatei.

          Schau Dir mal die Arrayfunktionen von PHP genauer an.
          Außerdem könnten noch ganz praktisch sein:

          • serialize()
          • unserialize()

          Du scheinst da einige Erfahrung zu haben. Um bei dem Beispiel von Herbert zu bleiben, kann man Deine Aussage so verstehen das man z.B. alle 50 (oder später 100) Textdateien auch in _ein_ multidimensionales Array lesen könnte
          (z.B. index => array('überschrift','dateiname','dateiinhalt')), und das das Ganze dann sortierbar und durchsuchbar ist?

          Also, alles in akzeptabler Zeit und Prozessorlast usw., wenn man von so einem 'allerwelts-php-account' ausgeht wie ich ihn habe (also max 8mb speicher und so weiter). Wenn ja, dann wäre das ja wirklich eine wunderbare Möglichkeit eine Suchfunktion für kleine Seiten zu erstellen.

          Viele Grüße,
          Horst

          1. da einige Erfahrung zu haben. Um bei dem Beispiel von Herbert zu bleiben, kann man Deine Aussage so verstehen das man z.B. alle 50 (oder später 100) Textdateien auch in _ein_ multidimensionales Array lesen könnte

            (z.B. index => array('überschrift','dateiname','dateiinhalt')), und das das Ganze dann sortierbar und durchsuchbar ist?

            Also, alles in akzeptabler Zeit und Prozessorlast usw., wenn man von so einem 'allerwelts-php-account' ausgeht wie ich ihn habe (also max 8mb speicher und so weiter). Wenn ja, dann wäre das ja wirklich eine wunderbare Möglichkeit eine Suchfunktion für kleine Seiten zu erstellen.

            Sollte denke ich funktionieren.
            Ohne Kenntis der Struktur der Daten un der tatsächlich vorhandenen Möglichkeiten sollte das klappen.
            Auf MYSQL kannst Du da auch verzichten.
            Kommt drauf an wie die Daten zu Dir kommen.

            Viele Grüße aus Berlin

            TomIRL

          2. Hi Horst,

            kann man z.B. alle 50 (oder später 100) Textdateien auch in _ein_ multidimensionales Array lesen
            (z.B. index => array('überschrift','dateiname','dateiinhalt')), und das das Ganze dann sortierbar und durchsuchbar ist?

            Also, alles in akzeptabler Zeit und Prozessorlast usw., wenn man von so einem 'allerwelts-php-account' ausgeht wie ich ihn habe (also max 8mb speicher und so weiter). Wenn ja, dann wäre das ja wirklich eine wunderbare Möglichkeit eine Suchfunktion für kleine Seiten zu erstellen.

            Ja, bei 100 Datensätzen sehe ich da kein Problem. Bei 1000Sätzen mit 1000 Bytes (Nutzvolumen) wird man sicher bald an die magische Speichergrenze von 8MB stoßen, denn man benötigt ja einigen Overhead und Platz zum Umstapeln der Daten. Ich würde mal schätzen, dass die Sortierfunktionen von PHP ungefähr viermal soviel Platz benötigen, wie die zu sortierende Datenmenge groß ist. Dann würde man also immer noch 2000 Sätze à 1000 Bytes in einer solchen Flat-File-Lösung unterbringen können.

            Auf einem Linux/Unix-Server, auf dem man Sequentielle Dateien, also Dateien mit variabler Satzlänge, abgelegt hat, zählt PHP die Anzahl der Sätze in Nullkomma-Nix. Auf einem Windows-Server für PHP (Gleiche Maschine) dauert das ewig. Ich habe nun noch nicht herausgefunden, wieso die Weiterschaltung Satz für Satz bei Linux so affenschnell ist und bei Windows so langsam. <i>Muss wohl an den Brems-Verträgen mit der Prozessorindustrie liegen</i>

            Zu beachten sind eigentlich nur zwei Dinge: Man muss die harten Returns aus dem Datenstrom eines Datensatzes entfernen. Ich tausche sie immer gegen #127. Die Felder kann man gut mit #004-Zeichen voneinander trennen. Auf diese Weise kann man mit der Funktion file() arbeiten.

            In jeder Zeile steht dann ein Datensatz + LF

            datenfeld-4---datenfeld----4--df--4---datenfeld----------A
            df4--datenfeld--4--df--A
            ------datenfeld---------4----7F--7F--datenfeld-7F---A

            Ich habe die Sätze nun untereinander geschrieben. In der Datei gibt es kein untereinander, sondern alle Daten leigen sequentiell hintereinander. Das A symbolisiert dabei immer das Ende eines Satzes, während die 4 der Trenner zwischen den Sätzen ist. die 7F (als EIN Zeichen) symbolisiert die Zeilenschaltung z.B. in einem Textfeld.

            Man muss natürlich dafür sorgen, dass weder

            Dez   Hex   Bedeutung
            #010  0A    Satzende ("Zeilenende" der Textdatei)
            #004  04    Feldtrenner im Datensatz
            #127  7F    Zeilenschaltung im Datenfeld

            in den Nutzdaten enthalten sind.

            So hat das bisher immer gut funktioniert. Das Sortieren der Daten überlässt man dann den Arrayfunktionen von PHP. Anschließend kann man die gesamte Datei auch in der neuen Sortierung und mit Einfügungen zurückschreiben.

            Leider unterstützt PHP in den mir bekannten Versionen noch keine Dateien mit fester Satzlänge und fester Satzstruktur (Record / Structure). Dann könnte man das ganze (zu Lasten des Speicherplatzes auf der HDD) noch erheblich schneller machen.

            Wenn noch Fragen bestehen, schreib sie hier. Vielleicht basteln wir dann zusmamen mal einen Datei-Baukasten für PHP. So aus dem handgelenk fällt mir nicht ein, welche Funktionen man alles brauchen würde.

            Liebe Grüße

            Tom

            1. Hallo Tom,

              vielen Dank für die ausführliche Erklärung.

              Mit den meisten Dingen die Du erwähnst bin ich schon auf die ein oder andere Weise in Berührung gekommen, ;-).

              Also grundsätzlich finde ich deine Idee mal einen Baukasten für eine php-plaintext-db zu schreiben sehr reizvoll. Ich hatte zwar in erster Linie nur an den Weg, die Daten zu lesen, sortieren/durchsuchen und auszugeben gedacht, aber Du hast natürlich recht damit das man diese auch zurück schreiben (können) sollte.

              Sehr wahrscheinlich wird das aber dieses Jahr nix mehr bei mir. Wenn dir das egal ist können wir das ja mal für Anfang nächsten Jahres planen.
              Wenn ja, dann schreiben wir das aber als unabhängige Klasse.
              (Das kann man ja auch erstmal ganz einfach anfangen und dann nach und nach ausbauen).

              Funktionen die man dazu evtl. bräuchte, außer den Arrayfunktionen und den schon erwähnten un/serialize funktionen sind natürlich datei lesen, schreiben, definierte Dateitypen aus Verzeichnisse (auch rekursiv) suchen und indexieren und all so was.

              Da kann man aber auf schon existierende Klassen zurückgreifen. Man muß das Rad ja nicht zum xten mal erfinden.

              Wenn nächstes Jahr auch ok ist sag halt Bescheid.

              Viele Grüße,
              Horst

              1. Hallo Horst,

                das ist sicherlich ok. Alleine werde ich da nicht rangehen. Da fehlen mir im Moment die Anregungen. Ich habe hier zwar schon Berge von Aufgaben und Lösungen erstellt und auch teilweie recht gut dokumentiert und erklärt (also für Anfänger lesbar) aber isbesondere mit OOP unter PHP habe ich mich noch nicht beschäftigt. Das erschien mir bisher immer etwas doppeltgemoppelt, da ja die Aufteilung auf Scripte und Module schon eine Art von OOP ist und es bisher sowieso keine Kapselung gibt. Das Einzige, was mich reizen könnte daran, wäre die Redefine von Funktionen während der Laufzeit. Das geht ja mir Standard-PHP nicht. Ich habe zumindest noch keine Möglichkeit gefunden bsiher, Funktionen nach ihrer Definition wieder zu löschen (so wie bei Datenstrukturen mit unset() )

                Grüße

                Tom

      2. PHP etwas - MySQL leider garnicht . . .
        es sollte also schon "idiotensicher" sein

        Ich denke, dass der Aufwand viel zu groß ist. Dein Hosting-Paket müsste neben PHP auch MySQL enthalten, was natürlich Zusatzkosten darstellt.

        1. Hallo Alex,  <-- Dies ist die Anrede

          Ich denke, dass der Aufwand viel zu groß ist. Dein Hosting-Paket müsste neben PHP auch MySQL enthalten, was natürlich Zusatzkosten darstellt.

          Und ich denke, dass man nicht immer gleich mit Kanonen auf Spatzen schießen muss. Bei der überschaubaren Datenmenge von 50 bis 100 Sätzen kann man da ruhig eine Flat-File-Lösung bauen. Man sollte nur von Anfang an das Hauptprogramm und die Datenspeicherung/Datenholung durch Funktionen voneinander trennen. Wenn die Funktionen dann alle schön auber hintereinander (und gut dokumentiert) im Script stehen, dann kann man sie später leicht gegen SQL-Funktionen austauschen. Das Hauptprogramm bleibt davon völlig unberührt. Außerdem haben Funktionen den Vorteil, dass die Freigabe nicht mehr benötigter Speicherbereiche (Variablen) automatisch funktioniert.

          Der eigene Aufbau einer solchen kleinen Dateilösung sorgt außerdem für das notwendige Grundverständnis. Bei größeren Problemen bricht man sich dann später nicht gleich den hals.

          Liebe Grüße aus dem mittleren Norddeutschland

          Tom