MIK: Wie kann ich Variablen dynamisch erzeugen?

Guten Abend!

Ich programmiere eine Bildergalerie, die vom User erweitert und verändert werden kann.

Jedem Bild ist ein Datensatz zugeordnet (Titel, Jahr, Größe, etc.)

Probleme habe ich mit dem Script zur Veränderung der Bild-Daten.

Dazu wird zunächst die Datenbank ausgelesen und die Daten aller Bilder in einem Formular angezeigt. Die Formular-Felder werden in einer Schleife mittels des Counters benannt:

<input name="Titel$count">

=>

<input name="Titel0">
<input name="Titel1">
<input name="Titel2">
<input name="Titel3">
usw.

Hier kann der User die Daten verändern, per submit wird dann das Script ausgelöst, das die neuen Daten in die Bank schreiben soll.

Der Submit-Button löst das Script aus, das die veränderten Daten aus dem Formular in die Bank schreibt.

Problem: Wie kann ich in letzterem Script die Variablen-Namen $Titel0, $Titel1, $Titel2, $Titel3 usw. dynamisch erzeugen (Anzal der Bilder ist dem Script bekannt), also wie kann ich verfügen, dass in den geänderten Datensatz der Wert des Formular-Feldes "Titel0", etc. eingefügt wird? Meine Notlösung ist bislang das Anlegen eines Arrays mit "hoffentlich mal ausreichend vielen" Variablen, also

$TitelVari = array($Titel1,$Titel2,$Titel3,$Titel4,$Titel5,$Titel6,$Titel7,$Titel8,$Titel9,$Titel10,$Titel11,$Titel12);

das natürlich theoretisch vom User gesprengt werden kann..

In der Hoffnung, mich verständlich ausgedrückt zu haben,

MIK

  1. Hier kann der User die Daten verändern, per submit wird dann das Script ausgelöst, das die neuen Daten in die Bank schreiben soll.

    ...hier kam meine Frau nach Hause...

    Der Submit-Button löst das Script aus, das die veränderten Daten aus dem Formular in die Bank schreibt.

    ;)

  2. Hallo MIK,

    Guten Abend!

    Problem: Wie kann ich in letzterem Script die Variablen-Namen $Titel0, $Titel1, $Titel2, $Titel3 usw. dynamisch erzeugen (Anzal der Bilder ist dem Script bekannt), also wie kann ich verfügen, dass in den geänderten Datensatz der Wert des Formular-Feldes "Titel0", etc. eingefügt wird? Meine Notlösung ist bislang das Anlegen eines Arrays mit "hoffentlich mal ausreichend vielen" Variablen, also

    Du suchst "variable Variablen" http://www.php.net/manual/de/language.variables.variable.php

    Frage: Geht es wirklich nicht mit Arrays? Damit meine ich jetzt kein festes Array, sondern Arrays allgemein.

    MIK

    Freundliche Grüße,

    Vinzenz Mai

    1. Hi Vinzenz,

      Du suchst "variable Variablen" http://www.php.net/manual/de/language.variables.variable.php

      Ja genau, das hatte ich gesucht, herzlichen Dank! Allerdings:

      Frage: Geht es wirklich nicht mit Arrays? Damit meine ich jetzt kein festes Array, sondern Arrays allgemein.

      Doch, das geht und ist viel besser, ich weiß nur noch nicht so genau wie -> siehe meine Antwort an Tom. ;)

      Einen schönen Abend,

      MIK

  3. Hello,

    Dazu wird zunächst die Datenbank ausgelesen und die Daten aller Bilder in einem Formular angezeigt. Die Formular-Felder werden in einer Schleife mittels des Counters benannt:

    <input name="Titel$count">

    =>

    <input name="Titel0">
    <input name="Titel1">
    <input name="Titel2">
    <input name="Titel3">
    usw.

    Das ist unpraktisch.

    Nimm Arrays dafür, das sind in PHP nämlich dynamische Scpeicherstrukturen:

    <input name="data[Titel][0]">
    <input name="data[Titel][1]">
    <input name="data[Titel][2]">
    <input name="data[Titel][3]">

    submit ...

    usw

    Und schau das dann mal an, wie es in $_POST ankommt

    echo "<pre>";
    pint_r($_POST);
    echo "</pre>";

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Hi Tom,

      Das ist unpraktisch.

      Nimm Arrays dafür, das sind in PHP nämlich dynamische Scpeicherstrukturen:

      <input name="data[Titel][0]">
      <input name="data[Titel][1]">
      <input name="data[Titel][2]">
      <input name="data[Titel][3]">

      submit ...

      usw

      Und schau das dann mal an, wie es in $_POST ankommt

      echo "<pre>";
      print_r($_POST);
      echo "</pre>";

      Das sieht wirklich wunderbar aus, schonmal meinen besten Dank bis hier her, allerdings kriege ich es nicht geregelt, die Array-Elemente direkt anzusprechen. Keiner meiner Versuche

      echo "$data[$Titel][0]<hr>";
      echo "$data[Titel][0]<hr>";
      echo "data[$Titel][0]<hr>";
      echo "data[Titel][0]<hr>";
      echo "$Titel[0]<hr>";
      echo "$data[0][0]<hr>";
      echo "$data[$Titel(0)]<hr>";
      echo "$data($Titel[0])<hr>";

      funktioniert und meine Recherche in php.net blieb ebenfalls erfolglos.. Kannst Du mir bitte noch verraten, wie ich das mache, evtl. mit einem Link zu umfassender Erklärung? Bis dato hab ich noch nicht so viel mit Arrays gemacht, insbesondere nicht in PHP.

      Grüße aus VW-City,

      MIK

      1. Hello,

        Hi Tom,

        Das ist unpraktisch.

        Nimm Arrays dafür, das sind in PHP nämlich dynamische Scpeicherstrukturen:

        <input name="data[Titel][0]">
        <input name="data[Titel][1]">
        <input name="data[Titel][2]">
        <input name="data[Titel][3]">

        submit ...

        usw

        Und schau das dann mal an, wie es in $_POST ankommt

        echo "<pre>";
        print_r($_POST);
        echo "</pre>";

        Das sieht wirklich wunderbar aus, schonmal meinen besten Dank bis hier her, allerdings kriege ich es nicht geregelt, die Array-Elemente direkt anzusprechen. Keiner meiner Versuche

        echo $data['Titel'][0]."<hr>";
        echo $data['Titel'][1]."<hr>";
        echo $data['Titel'][2]."<hr>";

        usw.

        Du musst in PHP die mehrfach derefernezierten Elemente (eben diese Array-Elemente) aus den Strings "auspunkten", also direkt als Variable ansprechen. Die implizite Auflösung innerhalb eines Strings klappt da nicht.

        Grüße aus VW-City,

        Das kann theoretisch jedem passieren ;-))

        Schau Dir mal http://tut.php-q.net ganz von vorne und in Ruhe an. das bringt was. Das Tutorial verwenden wir bei uns auch seit einiger Zeit im Unterricht und geben von Zeit zu Zeit auch Hinweise für die Weiterentwicklung. Man sollte aber bis zur Zwischenkontrolle alles der Reihe nach abarbeiten.

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Hallo Tom,

          echo $data['Titel'][0]."<hr>";
          echo $data['Titel'][1]."<hr>";
          echo $data['Titel'][2]."<hr>";

          usw.

          Meinen allerbesten Dank, das funktioniert vorzüglich! :)

          Du musst in PHP die mehrfach derefernezierten Elemente (eben diese Array-Elemente) aus den Strings "auspunkten", also direkt als Variable ansprechen. Die implizite Auflösung innerhalb eines Strings klappt da nicht.

          Alles klar!

          Grüße aus VW-City,

          Das kann theoretisch jedem passieren ;-))

          lol Ich hatte den besten aller Gründe aus NRW herzuziehen, eben der Grund hat mir auch schon kurz nach Abschicken meines Postings verraten, dass wohl eine Erbfeindschaft mit Braunschweig besteht. ;)

          Schau Dir mal http://tut.php-q.net ganz von vorne und in Ruhe an. das bringt was. Das Tutorial verwenden wir bei uns auch seit einiger Zeit im Unterricht und geben von Zeit zu Zeit auch Hinweise für die Weiterentwicklung. Man sollte aber bis zur Zwischenkontrolle alles der Reihe nach abarbeiten.

          Hab mir das mal runtergeladen und werde es tatsächlich mal durchgehen.

          Nochmal danke für den Tipp,

          MIK

      2. Hallo MIK

        Das sieht wirklich wunderbar aus, schonmal meinen besten Dank bis hier her, allerdings kriege ich es nicht geregelt, die Array-Elemente direkt anzusprechen. Keiner meiner Versuche

        echo "$data[$Titel][0]<hr>";
        echo "$data[Titel][0]<hr>";
        echo "data[$Titel][0]<hr>";
        echo "data[Titel][0]<hr>";
        echo "$Titel[0]<hr>";
        echo "$data[0][0]<hr>";
        echo "$data[$Titel(0)]<hr>";
        echo "$data($Titel[0])<hr>";

        funktioniert und meine Recherche in php.net blieb ebenfalls erfolglos.. Kannst Du mir bitte noch verraten, wie ich das mache, evtl. mit einem Link zu umfassender Erklärung? Bis dato hab ich noch nicht so viel mit Arrays gemacht, insbesondere nicht in PHP.

        Lese bitte sorgfältig folgenden Abschnitt http://www.php.net/manual/de/language.types.array.php. Da sind Arrays genau erklärt, auch warum das eine oder andere nicht funktioniert :-)

        Etwas weiter unten ist noch ein interessanter Thread [pref:t=74133&m=427285] zur Problematik echo '' versus echo "" mit einem aufschlussreichen Verweis ins Archiv </archiv/2003/8/54141/#m300888>.

        Zur Schreibweise: Du bekommst doch Deine Daten aus einer Datenbank. Wenn Du Deine Datensätze in einer Schleife aus- und in ein Array einliest, dann erhältst Du ein Array der Form
          $data[0], $data[1], ... (vorausgesetzt, Dein Arrayindex beginnt bei 0)
        Jeder einzelne Datensatz stellt wiederum ein Array dar, auf dessen Elemente Du je nach verwendeter Funktion über die Spaltennummer, den Spaltennamen oder beides http://www.php.net/manual/de/function.mysql-fetch-array.php zugreifen kannst.

        Somit kannst Du mit
          $data[0]['Titel']
        auf den Inhalt der Spalte Titel des ersten Datensatzes zugreifen.

        Innerhalb von doppelten Anführungszeichen werden Variablen interpoliert, d.h. ausgewertet, deswegen macht es einen Unterschied, ob Du

        echo $data[0]['Titel'] . "<hr>"; (richtig)
          echo "$data[0]['Titel']<hr>"; (falsch)
          echo "$data[0][Titel]<hr>"; (richtig, aber nicht so performant)

        schreibst.

        Das Tutorial, das Tom Dir nahegelegt hat (hab' die Antwort gerade gesehen), solltest Du gründlich durcharbeiten. Denn Arrays sind ein sehr wichtiger Bestandteil von Programmiersprachen, die Dir Sackgassen wie Dein erster Entwurf (das hast Du richtig erkannt) und erste Workarounds (variable Variablen) ersparen. Statt dessen bekommst Du eine sehr genaue Kontrolle über den Datenzugriff und komfortable Schleifenkonstrukte wie z.B. foreach.

        Freundliche Grüsse,

        Vinzenz

        1. Hi Vinzenz,

          Lese bitte sorgfältig folgenden Abschnitt http://www.php.net/manual/de/language.types.array.php. Da sind Arrays genau erklärt, auch warum das eine oder andere nicht funktioniert :-)

          Hm, das hatte ich schon gelesen, aber wohl nicht sorgfältig genug.. Wie schon erwähnt, sind Arrays für mich ziemliches Neuland.

          Etwas weiter unten ist noch ein interessanter Thread [pref:t=74133&m=427285] zur Problematik echo '' versus echo "" mit einem aufschlussreichen Verweis ins Archiv </archiv/2003/8/54141/#m300888>.

          Das habe ich noch nicht gelesen, werde mir aber die Links mal kopieren, ich glaube, ich zieh mir erstmal den von Tom empfohlenen Tutor rein. :)

          Zur Schreibweise: Du bekommst doch Deine Daten aus einer Datenbank. Wenn Du Deine Datensätze in einer Schleife aus- und in ein Array einliest, dann erhältst Du ein Array der Form
            $data[0], $data[1], ... (vorausgesetzt, Dein Arrayindex beginnt bei 0)

          Jeder einzelne Datensatz stellt wiederum ein Array dar, auf dessen Elemente Du je nach verwendeter Funktion über die Spaltennummer, den Spaltennamen oder beides http://www.php.net/manual/de/function.mysql-fetch-array.php zugreifen kannst.

          Somit kannst Du mit
            $data[0]['Titel']
          auf den Inhalt der Spalte Titel des ersten Datensatzes zugreifen.

          Innerhalb von doppelten Anführungszeichen werden Variablen interpoliert, d.h. ausgewertet, deswegen macht es einen Unterschied, ob Du

          echo $data[0]['Titel'] . "<hr>"; (richtig)
            echo "$data[0]['Titel']<hr>"; (falsch)
            echo "$data[0][Titel]<hr>"; (richtig, aber nicht so performant)

          schreibst.

          So wirklich verstehe ich das jetzt gerade nicht, aber wie gesagt, ich habe da eine gewaltige Wissens- und Verständnis-Lücke. Bspw. würde ich jetzt vermuten, dass Titel (doch auch ein Array, oder?) direkt data untergeordnet ist und dann die tatsächlichen Daten Elemente von Titel sind. Warum dann also $data[0]['Titel'] statt (wie auch vom Tom geschrieben) $data['Titel'][0]? Oder ist die Reihenfolge egal?

          Das Tutorial, das Tom Dir nahegelegt hat (hab' die Antwort gerade gesehen), solltest Du gründlich durcharbeiten. Denn Arrays sind ein sehr wichtiger Bestandteil von Programmiersprachen, die Dir Sackgassen wie Dein erster Entwurf (das hast Du richtig erkannt) und erste Workarounds (variable Variablen) ersparen. Statt dessen bekommst Du eine sehr genaue Kontrolle über den Datenzugriff und komfortable Schleifenkonstrukte wie z.B. foreach.

          Ja, das werde ich machen, Arrays habe ich bislang nur in eindimensionaler Form, also array(1,2,3,4,5,..) verwandt.

          Dir auch vielen Dank für die detaillierte Antwort und die Links,

          beste Wünsche und einen schönen Abend,

          MIK