Pete: Variablen in einer Blob-Spalte

Hallo Forum!

Ich habe folgendes ausprobiert:

In einer Datenbank habe ich in einer BLOB-Spalte Text stehen.
Mittels PHP moechte ich die Zeilen auslesen und dann im Blob-Bereich
enthaltene Variablen (die stehen da in dieser Form drinnen: $variablenname) mit Inhalt fuellen. Doch leider wird mir immer nur der Variablenname angezeigt. Ich habe es auch schon mit "$n" und und '$n' ausprobiert (und immer mit und ohne ) - doch es hat nicht
funktioniert...

Habe ich da einen gedanklichen Fehler gemacht?

Wie kann ich ihn umschiffen?
Danke Euer Pete

  1. Hi,

    Datenbank MySQL?
    Blob ist zwar eine Binäre Art der Speicherung, aber nicht ohne vorherige Behandlung auf Escape-Sequenzen...

    Gut, Wenn Du variablen darin speichern willst, sind wir beim Kernproblem der DV angelangt: Wo fangen Variablen an, welche Länge haben sie und in welchem Typ sollen sie dargestellt/behabdelt werden.

    Wenn Du Dich dieser Probleme entledigen willst, speicherst Du entweder jede Entität in einem eigenen Datenfeld -> Normalisierung, oder due legst zumindest feste Strukturen für das Speichern der Variablen in einem Feld fest und natürlich den Anfangspunkt oder Offset (Verschiebeanteil zum bekannten Anfangspunkt).

    Mit der Funktion serialize() hast due so einen Strukturwandler in PHP. Wenn Du da vorne eine komplexe Datenstruktur reinsteckst, kommt hinten ein Bytestream wieder heraus. Der enthält Start- und Stopsequenzen für die einzelnen Variablen der Struktur und Du musst dich nicht darum kümmern, denn mit unserialize() kannst Du den Vorgang reversieren, also Deine ursprüngliche komplexe Struktur wieder herstellen.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
    1. [...]
      Hi,
      danke Dir fuer die ausfuehrliche und schnelle Antwort!
      Grusse Pete

  2. Moin!

    In einer Datenbank habe ich in einer BLOB-Spalte Text stehen.
    Mittels PHP moechte ich die Zeilen auslesen und dann im Blob-Bereich
    enthaltene Variablen (die stehen da in dieser Form drinnen: $variablenname) mit Inhalt fuellen. Doch leider wird mir immer nur der Variablenname angezeigt. Ich habe es auch schon mit "$n" und und '$n' ausprobiert (und immer mit und ohne ) - doch es hat nicht
    funktioniert...

    Habe ich da einen gedanklichen Fehler gemacht?

    Ja. Wenn du in einem PHP-Skript schreibst:

    echo "Hallo, $vorname! Wie gehts?";

    dann wird PHP erkennen, dass du doppelte Anführungszeichen benutzt hast, und den speziellen Variablen-Ersetzungs-Modus ausführen, der den Inhalt der Variablen $vorname an die Stelle setzt, wo $vorname steht.

    Wenn du aus der Datenbank Text liest, ist das wirklich literaler Text: Ein Zeichen namens "$", ein Zeichen namens "v", ein Zeichen "o", "r", "n", "a", "m", "e" - alles wird Zeichen für Zeichen ausgegeben. Und das muß auch so sein, denn ansonsten könntest du ja nie z.B. sowas in der DB speichern: "Whisky kostet im Saloon $1" - wenn $1 immer mit dem Inhalt der Variablen $1 ersetzt würde, wäre das schon doof.

    Wie kann ich ihn umschiffen?

    Du mußt im aus der Datenbank ausgelesenen String nach den dort enthaltenen Variablen suchen und sie ersetzen lassen. Es gibt einen komplizierten und einen einfachen (und mit Sicherheit noch tausend andere) Weg.

    Der komplizierte: Schreibe dir eine Funktion, die das für dich erledigt. Bedenke dabei insbesondere, dass du nicht einfach mehrfach str_replace() auf den Gesamtstring anwenden darfst. Was ist, wenn in $vorname der Name "$nachname" drinsteht, und beim zweiten Ersetzen wird $nachname mit "Müller" ersetzt - $vorname $nachname würde dann zuerst zu $nachname $nachname und dann zu Müller Müller - es hätte aber $nachname Müller heißen müssen.

    Der zweite Weg: Nutze die Funktion eval(). Sie führt dynamisch generierten Code aus, beispielsweise auch den, der im Prinzip in deiner Datenbank drinsteht. Könnte sein, dass du noch Code drumherumbasteln mußt, beispielsweise echo für die Ausgabe. Allerdings (und das ist eben das dumme dabei) hast du dann wieder das Whisky-Problem, d.h. du mußt Dollar-Zeichen, die echt so gemeint sind, escapen (mit Backslash), damit sie wirklich erscheinen. Andernfalls kriegst du Probleme.

    - Sven Rautenberg

    --
    "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
    1. [...]
      Hi, auch Dir Danke!
      Grusse Pete

    2. Hi Sven,

      schon wieder so ein gesicht von Dir! :-))))))

      Das kann ja sogar ich verstehen, und das will was heißen.

      Zu erwähnen wäre auf jeden fall noch, dass man in Text- und Blob-Feldern aufgrund er Übergabe die Datenbank als String nicht alle Datenwerte speichern kann. Das ist besonders beim Ablegen von Bildern in der DB zu beachten - hab ich mir zumindest sagen lassen von den MySQL-Spezialisten.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.