Jnnbo: Serialize

0 72

Serialize

Jnnbo
  • mysql
  • php
  1. 0

    Serialize - Mein Beispiel

    Jnnbo
    1. 0
      woodfighter
      1. 0
        Jnnbo
        1. 0
          woodfighter
          1. 0
            Jnnbo
            1. 1
              Der-Dennis
              1. 0
                Jnnbo
                1. 0
                  Der-Dennis
        2. 0
          Sven Rautenberg
          1. 0
            Jnnbo
            1. 0
              Sven Rautenberg
              1. 0
                Jörg Reinholz
  2. 0
    woodfighter
    1. 0
      dedlfix
  3. 0
    Serialize
    1. 0
      woodfighter
  4. 1
    Jörg Reinholz
    • php
    1. 0
      Jnnbo
      1. 0
        Jörg Reinholz
        1. 0
          Jnnbo
          1. 0
            Jörg Reinholz
            1. 0

              2 Stufe der Auflösung

              Jörg Reinholz
            2. 0
              dedlfix
              1. 0
                Jörg Reinholz
                1. 0

                  Serialize - Kontextwechsel?

                  Der-Dennis
                  1. 1
                    Jörg Reinholz
                    1. 0
                      Der-Dennis
                      1. 0
                        Jörg Reinholz
                        1. 0

                          JSON

                          Der-Dennis
                          1. 0
                            Jörg Reinholz
                            1. 0
                              Der-Dennis
                          2. 0
                            Tabellenkalk
                            • hardware
                            1. 0
                              Der-Dennis
                  2. 1
                    dedlfix
                    1. 0
                      Der-Dennis
                  3. 0
                    Tabellenkalk
                    • perl
                    1. 0
                      Der-Dennis
              2. 0

                Meine Erklärung warum ich das als Serialize speichern möchte.

                Jnnbo
                1. 0
                  Der-Dennis
                2. 0
                  dedlfix
                  1. 0
                    Jnnbo
                3. 0
                  Jörg Reinholz
            3. 0
              Der Martin
            4. 0
              Jnnbo
              1. 0
                frankx
                1. 0
                  Jnnbo
                  1. 0
                    Der-Dennis
              2. 0
                Der-Dennis
                1. 0
                  Jnnbo
                  1. 0
                    Der-Dennis
              3. 0
                Jörg Reinholz
                1. 0
                  Der-Dennis
                2. 0
                  Jnnbo
              4. 1

                Jetzt habe ich gerafft, was Du überhaupt willst

                Jörg Reinholz
                1. 0
                  Jörg Reinholz
                  1. 0
                    Jnnbo
                    1. 0
                      Jörg Reinholz
                      1. 0
                        Jnnbo
                        1. 0
                          Jörg Reinholz
                          1. 0
                            Jörg Reinholz
                            1. 0

                              Notice: Undefined index: wps_strasse

                              Jnnbo
                              1. 1
                                Der Martin
                                1. 0
                                  Jnnbo
                                  1. 1
                                    Der Martin
                                2. 0
                                  dedlfix
                          2. 0
                            Jnnbo
            5. 1
              Sven Rautenberg
    2. 1
      dedlfix
      1. 0
        Jörg Reinholz
    3. 0
      Sven Rautenberg
      1. 1
        dedlfix

Moin,

ich möchte mehrere Werte in eine Tabellenspalte schreiben. Dazu habe ich bei php.net die Funktion serialize gefunden.

Wenn ich es richtig verstanden habe, dann sieht das so aus

$eingabe = array ( 'firma' => '1', 'strasse' => '1',);
$ausgabe = serialize ( $eingabe );
echo $ausgabe . "\n\n";

Das Ergebnis sieht so aus

a:2:{s:5:"firma";s:1:"1";s:7:"strasse";s:1:"1";}

Ist das denn so richtig? Ich meine, ich möchte mit den Daten wieder arbeiten z.B. wenn in dem Wert firma eine 1 steht, dann soll ein Feld angezeigt werden.

Könnte natürlich meine Datenbank um 10 Felder erweitern, ist aber denke ich nicht sinnvoll oder? Ich hab damit noch 0 Ahnung hab diese Vorgehensweise allerdings schon bei Joomla und Wordpress gesehen, die setzten das wohl sehr gerne ein.

akzeptierte Antworten

  1. Hallo,

    hier nochmals mein ganzes Beispiel

    <form name="form1" method="post" action="">
      <p>
        <input name="test[]" type="checkbox" id="test" value="firma">
        <label for="test"></label> 
        Firma
        <input name="test[]" type="checkbox" id="test" value="strasse">
        <label for="test"></label> 
        Straße
        <input name="test[]" type="checkbox" id="test" value="ort">
        <label for="test"></label> 
        PLZ / Ort
        <input name="test[]" type="checkbox" id="test" value="telefon">
        <label for="test"></label> 
        Telefon
    </p>
      <p>
        <input type="submit" name="button" id="button" value="Senden">
      </p>
    </form>
    

    Mein PHP

    $eingabe = array ( $_POST['test']);
    $ausgabe = serialize ( $eingabe );
    echo $ausgabe . "\n\n";
    

    Die Ausgabe sieht dann so aus

    a:1:{i:0;a:2:{i:0;s:5:"firma";i:1;s:3:"ort";}}

    Ich möchte die Straße später nur anzeigen, wenn in der oben genanten Ausgabe Straße vorkommt, ist das Möglich?

    1. Tach,

      <form name="form1" method="post" action="">
        <p>
          <input name="test[]" type="checkbox" id="test" value="firma">
          <label for="test"></label> 
          Firma
          <input name="test[]" type="checkbox" id="test" value="strasse">
          <label for="test"></label> 
          Straße
          <input name="test[]" type="checkbox" id="test" value="ort">
          <label for="test"></label> 
          PLZ / Ort
          <input name="test[]" type="checkbox" id="test" value="telefon">
          <label for="test"></label> 
          Telefon
      </p>
        <p>
          <input type="submit" name="button" id="button" value="Senden">
        </p>
      </form>
      

      Boolean-Werte für Adress-/Kontaktdaten?

      Die Ausgabe sieht dann so aus

      a:1:{i:0;a:2:{i:0;s:5:"firma";i:1;s:3:"ort";}}

      Ich möchte die Straße später nur anzeigen, wenn in der oben genanten Ausgabe Straße vorkommt, ist das Möglich?

      Ohne jetzt mehr über die Serialisierungsmethode in PHP zu wissen, würde ich aus dem String schließen, dass beim Unserialisieren, das Wort „strasse“ nicht wieder vorkommen kann. (Üblicherweise würde ich bei Serialisierung davon ausgehen, dass ich hinterher eine exakte Kopie meines Originalobjekts zurückerhalten würde, aber 1. ist das hier PHP und 2. gibt es da häufiger Einschränkungen, vorallem im Bereich Deep Copies, der hier allerdings eher nicht greifen sollte)

      mfg
      Woodfighter

      1. Hallo woodfighter,

        Ohne jetzt mehr über die Serialisierungsmethode in PHP zu wissen, würde ich aus dem String schließen, dass beim Unserialisieren, das Wort „strasse“ nicht wieder vorkommen kann.

        laut php.net sollte es so gehen

        $eingabe = array ( $_POST['test']);
        $ausgabe = serialize ( $eingabe );
        
        echo $ausgabe . "\n\n";
        
        $array = unserialize ( $ausgabe );
        
        print_r ( $array );
        
        if (in_array("firma", $array)) {
            echo "Firma enthalten";
        }
        

        Ich erhalte allerdings kein Ergebnis, irgendetwas mache ich noch falsch.

        1. Tach,

          laut php.net sollte es so gehen

          nö, beachte den dritten Parameter der dort beschrieben ist. Aber eigentlich möchtest du eher array_key_exists nutzen.

          mfg
          Woodfighter

          1. Hallo woodfighter,

            nö, beachte den dritten Parameter der dort beschrieben ist. Aber eigentlich möchtest du eher array_key_exists nutzen.

            auch so geht es leider nicht

            $eingabe = array ( $_POST['test']);
            $ausgabe = serialize ( $eingabe );
            
            $array = unserialize ( $ausgabe );
            
            if (array_key_exists('firma', $array)) {
                echo "Das Element 'erstes' ist in dem Array vorhanden";
            }
            
            1. Hallo Jnnbo,

              auch so geht es leider nicht

              $eingabe = array ( $_POST['test']);
              $ausgabe = serialize ( $eingabe );
              
              $array = unserialize ( $ausgabe );
              
              if (array_key_exists('firma', $array)) {
                  echo "Das Element 'erstes' ist in dem Array vorhanden";
              }
              

              hast Du mal var_dump() verwendet und Dir angesehen, was da überhaupt drin steht? So wie das aussieht, was Du da produzierst, erzeugst Du ein Array als Element eines Arrays. Die Abfrage wäre dann wohl array_key_exists('firma', $array[0]). Wie gesagt, verwende var_dump()!

              Gruß Dennis

              EDIT:

              Ich sehe gerade, Du hast hier schon var_dump()-Ausgaben gepostet. Dann sollte Dein Problem ja gelöst sein.

              1. Hallo Der-Dennis,

                hast Du mal var_dump() verwendet und Dir angesehen, was da überhaupt drin steht? So wie das aussieht, was Du da produzierst, erzeugst Du ein Array als Element eines Arrays. Die Abfrage wäre dann wohl array_key_exists('firma', $array[0]). Wie gesagt, verwende var_dump()!

                danke für deinen Hinweis. So funktioniert es

                if(isset($_POST['button'])){
                
                	$eingabe = array ( $_POST['test']);
                	$ausgabe = serialize ( $eingabe );
                	
                	$array = unserialize ( $ausgabe );
                	
                	if (in_array('firma', $array[0])) {
                		echo "Das Element 'Firma' ist in dem Array vorhanden";
                	}
                
                }
                

                Wenn ich allerdings array_key_exists verwende, erhalte ich weiterhin keine Aushabe.

                1. Hallo Jnnbo,

                  danke für deinen Hinweis. So funktioniert es

                  if(isset($_POST['button'])){
                  
                  	$eingabe = array ( $_POST['test']);
                  	$ausgabe = serialize ( $eingabe );
                  	
                  	$array = unserialize ( $ausgabe );
                  	
                  	if (in_array('firma', $array[0])) {
                  		echo "Das Element 'Firma' ist in dem Array vorhanden";
                  	}
                  
                  }
                  

                  Wenn ich allerdings array_key_exists verwende, erhalte ich weiterhin keine Aushabe.

                  das ist auch richtig so. Schau Dir den var_dump() an. "firma" ist kein Schlüssel eines assoziativen Arrays, sondern der Inhalt eines indizierten Arrays.

                  Gruß, Dennis

        2. Moin!

          Hallo woodfighter,

          Ohne jetzt mehr über die Serialisierungsmethode in PHP zu wissen, würde ich aus dem String schließen, dass beim Unserialisieren, das Wort „strasse“ nicht wieder vorkommen kann.

          laut php.net sollte es so gehen

          $eingabe = array ( $_POST['test']);
          $ausgabe = serialize ( $eingabe );
          
          echo $ausgabe . "\n\n";
          
          $array = unserialize ( $ausgabe );
          
          print_r ( $array );
          
          if (in_array("firma", $array)) {
              echo "Firma enthalten";
          }
          

          Ich erhalte allerdings kein Ergebnis, irgendetwas mache ich noch falsch.

          Du solltest unbedingt var_dump() benutzen und damit den Inhalt von $_POST, $eingabe, $ausgabe und $array ermitteln und uns hier auch mitteilen.

          Nur Code hinschreiben und sagen "geht nicht" geht nicht, daraus kann man nichts erkennen. Kann ja schon sein, dass dein Formular falsch ist und in $_POST nichts drinsteht - dann können wir uns lange wundern, warum mit "nichts" als durch deinen Code auch "nichts" wieder hinten rauskommt.

          Grüße Sven

          1. Hallo Sven,

            Du solltest unbedingt var_dump() benutzen und damit den Inhalt von $_POST, $eingabe, $ausgabe und $array ermitteln und uns hier auch mitteilen.

            var_dump($eingabe); bringt:

            array(1) { [0]=> array(4) { [0]=> string(5) "firma" [1]=> string(7) "strasse" [2]=> string(3) "ort" [3]=> string(7) "telefon" } }

            var_dump($ausgabe); bringt

            string(82) "a:1:{i:0;a:4:{i:0;s:5:"firma";i:1;s:7:"strasse";i:2;s:3:"ort";i:3;s:7:"telefon";}}"

            var_dump($array); bringt

            array(1) { [0]=> array(4) { [0]=> string(5) "firma" [1]=> string(7) "strasse" [2]=> string(3) "ort" [3]=> string(7) "telefon" } }

            var_dump($_POST); bringt

            array(2) { ["test"]=> array(4) { [0]=> string(5) "firma" [1]=> string(7) "strasse" [2]=> string(3) "ort" [3]=> string(7) "telefon" } ["button"]=> string(6) "Senden" }

            1. Moin!

              var_dump($eingabe); bringt:

              array(1) { [0]=> array(4) { [0]=> string(5) "firma" [1]=> string(7) "strasse" [2]=> string(3) "ort" [3]=> string(7) "telefon" } }

              var_dump($array); bringt

              array(1) { [0]=> array(4) { [0]=> string(5) "firma" [1]=> string(7) "strasse" [2]=> string(3) "ort" [3]=> string(7) "telefon" } }

              Wie man sehr schnell sieht, sind die Inhalte von $eingabe vor dem Serialisieren und von $array nach dem Entserialisieren identisch.

              Daraus ist knallhart zu schließen, dass der Fehler nicht im Serialisieren liegt.

              if (in_array("firma", $array)) {
                  echo "Firma enthalten";
              }
              

              $array ist ein Array, in dem mit Index 0 ein Array liegt, sonst nichts. Deshalb ist korrekt erkannt worden, dass der String "firma" nicht im Array liegt.

              Er liegt eine Ebene tiefer. Die durchsuchst du aber nicht.

              Grüße Sven

              1. Moin!

                array(1) {                          # Array ($arr)
                     [0]=> array(4) {               # Element 0 ($arr[0]) ist ein Array
                                                    # Elemente des Arrays, der Element 0 eines Arrays ist:
                         [0]=> string(5) "firma"    # ($arr[0][0]="firma")
                         [1]=> string(7) "strasse"  # ($arr[0][1]="strasse")
                         [2]=> string(3) "ort"      # ($arr[0][2]="ort")
                         [3]=> string(7) "telefon"  # ($arr[0][3]="telefon")
                     }
                }
                

                Um die richtige Aussage von Sven zu verdeutlichen habe ich den Text mal "formatiert"

                $array ist ein Array, in dem mit Index 0 ein Array liegt, sonst nichts. Deshalb ist korrekt erkannt worden, dass der String "firma" nicht im Array liegt.

                Er liegt eine Ebene tiefer. Die durchsuchst du aber nicht.

                Fazit: Durchsuche nicht $arr, sondern $arr[0].

                Jörg Reinholz

  2. Tach,

    ich möchte mehrere Werte in eine Tabellenspalte schreiben.

    das ist grundsätzlich eine schlechte Idee.

    Ist das denn so richtig? Ich meine, ich möchte mit den Daten wieder arbeiten z.B. wenn in dem Wert firma eine 1 steht, dann soll ein Feld angezeigt werden.

    Was ergibt denn dein Testausgabe nach dem Aufruf von unserialize?

    Könnte natürlich meine Datenbank um 10 Felder erweitern, ist aber denke ich nicht sinnvoll oder?

    Wenn du zehn weitere atomare Attribute brauchst, ist das vermutlich die saubere Lösung, vielleicht brauchst du aber auch eine weitere Tabelle mit Zuordnungen, das ist aus deinen Beispieldaten so nicht zu erkennen.

    Ich hab damit noch 0 Ahnung hab diese Vorgehensweise allerdings schon bei Joomla und Wordpress gesehen, die setzten das wohl sehr gerne ein.

    Ich bin kein PHP-Mensch, aber die Codequalität dieser beiden Projekte ist meines Wissens nicht berühmt.

    mfg
    Woodfighter

    1. Tach!

      ich möchte mehrere Werte in eine Tabellenspalte schreiben.

      das ist grundsätzlich eine schlechte Idee.

      Meist ja. Zumindest dann, wenn man nicht begründen kann, warum das für einen bestimmten Fall besser als einzelnen Felder ist und wieso man sich daruch keine Nachteile einhandelt.

      Ich hab damit noch 0 Ahnung hab diese Vorgehensweise allerdings schon bei Joomla und Wordpress gesehen, die setzten das wohl sehr gerne ein.

      Ich bin kein PHP-Mensch, aber die Codequalität dieser beiden Projekte ist meines Wissens nicht berühmt.

      Das ist wenig hilfreich für die Beurteilung, ob das an der Stelle gerechtfertigt ist.

      Ein Anwendungsfall ist, wenn man plugin-spezifische Konfigurationsdaten ablegen möchte. Die sind üblicherweise recht überschaubar in der Anzahl. In diesen Daten muss üblicherweise nicht gesucht werden. Es reicht, wenn die DB dafür einfach nur ein Datengrab ist. Es werden dann unter einem Key beliebige Daten abgelegt. Key-Value-Speicher - vor allem, wenn Value irgendwas mehr oder weniger komplexes serialisiertes ist - sind ja nun keine ganz unübliche Vorgehensweise. Die Alternative wäre, für jeden skalaren Typ eine eigene Tabelle anzulegen und die Daten auf diese zu verteilen. Oder aber jedes Plugin ist für seine Datenhaltung selbst verantwortlich und erzeugt sich eine eigene Konfigurationsdatentabelle. Dann hat man zig Tabellen mit nur je einem Datensatz und nutzt nach wie vor keinerlei Vorteile des RDBMS.

      dedlfix.

  3. Mahlzeit.

    ich möchte mehrere Werte in eine Tabellenspalte schreiben. Dazu habe ich bei php.net die Funktion serialize gefunden.

    Das Ergebnis sieht so aus

    a:2:{s:5:"firma";s:1:"1";s:7:"strasse";s:1:"1";}

    Ist das denn so richtig?

    Warum soll das nicht richtig sein?

    Mit serialize() erzeugst du aus einer PHP-Variablen einen Text, der anschließend mit unserialize() wieder in eine PHP-Variable zurückgewandelt werden kann.

    Genau genommen braucht es dich gar nicht interessieren, wie das serialize()-Ergebnis aussieht. Es ist ein Text (wichtig fürs Speichern, Text ist einfacher zu handhaben als Bytes) und der Text kann in PHP-Variablen zurückgewandelt werden. Mehr musst du nicht wissen.

    Ich meine, ich möchte mit den Daten wieder arbeiten z.B. wenn in dem Wert firma eine 1 steht, dann soll ein Feld angezeigt werden.

    Könnte natürlich meine Datenbank um 10 Felder erweitern, ist aber denke ich nicht sinnvoll oder?

    Wieso sollten eigene Felder nicht sinnvoll sein? Wenn du den serialize()-Text für die Datenbank nutzt, musst du die Daten erst durch serialize() jagen und in die Datenbank schreiben, andersrum den Text aus der Datenbank auslesen und mit unserialize() zurückwandeln. Hast du eigene Felder in der Datenbank, kannst du dir den serialize()/unserialize()-Schritt sparen.

    Der Umweg über serialize() ist nur dann sinnvoll, wenn du die Daten in der Datenbank nicht benutzt (d.h. sie werden mit SQL nicht angefasst außer zum Einspeichern und Auslesen) und es sich um eine variable Anzahl an Werten handelt (zum Datensatz gehörden mal drei Straßennamen, mal zehn, mal nur einer).

    1. Tach,

      Genau genommen braucht es dich gar nicht interessieren, wie das serialize()-Ergebnis aussieht. Es ist ein Text (wichtig fürs Speichern, Text ist einfacher zu handhaben als Bytes) und der Text kann in PHP-Variablen zurückgewandelt werden. Mehr musst du nicht wissen.

      nope: „Returns a string containing a byte-stream representation of value that can be stored anywhere. Note that this is a binary string which may include null bytes, and needs to be stored and handled as such. For example, serialize() output should generally be stored in a BLOB field in a database, rather than a CHAR or TEXT field.“

      Der Umweg über serialize() ist nur dann sinnvoll, wenn du die Daten in der Datenbank nicht benutzt (d.h. sie werden mit SQL nicht angefasst außer zum Einspeichern und Auslesen)

      ... und man weiß, dass sich an diesem Umstand niemals etwas ändern wird.

      und es sich um eine variable Anzahl an Werten handelt (zum Datensatz gehörden mal drei Straßennamen, mal zehn, mal nur einer).

      auch da würde ich sicher eher auf eine n:m-RElation setzen als auf nicht atomare Datenfelder.

      mfg
      Woodfighter

  4. Moin!

    ich möchte mehrere Werte in eine Tabellenspalte schreiben. Dazu habe ich bei php.net die Funktion serialize gefunden.

    nimm besser $str = json_encode($_POST);

    und bei Bedarf: $ar=json_decode($str);

    $arr = array ( 'firma' => '1', 'strasse' => '1',);
    $str = json_decode( $arr ), "\n\n";
    echo $str, "\n\n";
    

    Ergebnis:

    {"firma":"1","strasse":"1"}

    Könnte natürlich meine Datenbank um 10 Felder erweitern, ist aber denke ich nicht sinnvoll oder?

    Warum nicht? Das ist a) richtig und spart Dir b) später viel Arbeit.

    Ansonsten:

    Den String kannst Du jederzeit zu einem Array machen:

    $arr=json_decode($str);
    

    und ihn so behandeln wie Du willst:

    Du wolltest, dass "strasse" existiert?

    $keys=array_keys($arr);
    if ( array_search('strasse', $keys) ) {
      print $arr['strasse'],"\n\n";
    }
    

    oder

    if ( isset($arr['strasse']) ) {
       ...
    }
    

    Du wolltest, dass firma == 1 ist?

    if ( isset($arr['firma']) &&  1 == $arr['firma'] ) {
       ...
    }
    

    lese und staune über json und arrays statt mit den blöden Videos Zeit zu verschwenden.

    Jörg Reinholz

    1. Hallo Jörg,

      nimm besser $str = json_encode($_POST);

      und bei Bedarf: $ar=json_decode($str);

      $arr = array ( 'firma' => '1', 'strasse' => '1',);
      $str = json_decode( $arr ), "\n\n";
      echo $str, "\n\n";
      

      Ergebnis:

      {"firma":"1","strasse":"1"}

      Wie schaffst du es das Ergebnis anzeigen zu lassen? Ich habe dein Beispiel 1zu1 übernommen

      <?PHP
      $arr = array ( 'firma' => '1', 'strasse' => '1',);
      $str = json_decode( $arr ). "\n\n";
      echo $str. "\n\n";
      ?>
      

      Und ich sehe auf dem Bildschirm leider nichts. OK du hast aus den . ein , gemacht nutze ich diese, bekomme ich ein Fehler 500.

      1. Moin!

        <?PHP
        $arr = array ( 'firma' => '1', 'strasse' => '1',);
        $str = json_decode( $arr ). "\n\n";
        echo $str. "\n\n";
        ?>
        

        Wie schaffst Du es, aus den Videos auch nur etwas zu übernehmen. Beim Anpassen an Deine weiteren Fragen ist in Zeile 3 ganz offensichtlich das ' . "\n\n" ' stehen geblieben.

        <?php
        $arr = array ( 'firma' => '1', 'strasse' => '1',);
        $str = json_encode( $arr );
        echo $str, "\n\n";
        

        Und ich sehe auf dem Bildschirm leider nichts. OK du hast aus den . ein , gemacht nutze ich diese, bekomme ich ein Fehler 500.

        Tja. Wie ich dem Student schon mitteilte: Such Dir ein Video über error_reporting()!

        Jörg Reinholz

        1. Hallo Jörg,

          Tja. Wie ich dem Student schon mitteilte: Such Dir ein Video über error_reporting()!

          hör doch auf dauernt auf die Videos anzuspielen, ich lerne einfach lieber mit Videos, wie es viele Menschen gibt die lieber einen Kurs besuchen und wiederum einige die einfach ein Text lesen.

          Machen wir es also kurz, es geht überhaupt nicht was du mir geschrieben hast

          <form name="form1" method="post" action="">
            <p>
              <input name="test[]" type="checkbox" id="test" value="firma">
              <label for="test"></label> 
              Firma
              <input name="test[]" type="checkbox" id="test" value="strasse">
              <label for="test"></label> 
              Straße
              <input name="test[]" type="checkbox" id="test" value="ort">
              <label for="test"></label> 
              PLZ / Ort
              <input name="test[]" type="checkbox" id="test" value="telefon">
              <label for="test"></label> 
              Telefon
          </p>
            <p>
              <input type="submit" name="button" id="button" value="Senden">
            </p>
          </form>
          
          error_reporting(E_ALL);
          if(isset($_POST['button'])){
          	$eingabe = array ( $_POST['test']);
          	$str = json_decode( $eingabe );
          	echo $str, "\n\n";
          	
          	$keys=array_keys($eingabe);
          	if ( array_search('strasse'. $keys) ) {
            		print $eingabe['strasse']."\n\n";
          	}
          }
          
          1. Moin!

            Machen wir es also kurz, es geht überhaupt nicht was du mir geschrieben hast

            Nö. Das was Du daraus gemacht hast geht nicht.

                    $eingabe = array ( $_POST['test']);
                    $str = json_decode( $eingabe );
            

            Das reduziere ich mal auf:

                    $str = json_decode( $_POST['test'] );
            

            und frage mich, warum Du JSON dekodierst, wo gar keines sein kann.

            Schon Dein Formular ist schlicht Unsinn:

                <input name="test[]" type="checkbox" id="test" value="firma">
                <label for="test"></label> 
                Firma
                <input name="test[]" type="checkbox" id="test" value="strasse">
                <label for="test"></label> 
                Straße
            

            Das würde einen Array wie folgt liefern:

            • $_POST['test'][0]='firma';
            • $_POST['test'][1]='strasse';

            oder, je nach dem wie angeklickt:

            • $_POST['test'][0]='strasse';

            Wenn überhaupt, muss das wohl eher so aussehen:

                <input name="test[firma]" type="checkbox" id="test_firma" value="1">
                <label for="test_firma">Firma</label> 
                
                <input name="test[strasse]" type="checkbox" id="test_strasse" value="1">
                <label for="test_strasse">Straße</label> 
            

            Die Bezeichner gehören in das label-tag. Ein Element hat eine ID, eine ID gehört zu genau einem Element. Wenn Du schon im HTML-Formular dafür sorgst, dass ein sinnvoller Array gebaut wird, dann kannst Du den auch einfacher abfragen.

            Das Resultat ist dann, je nach dem was angeklickt wurde ein array $_POST mit:

            • $_POST['test']['firma']=1;
            • $_POST['test']['strasse']=1;

            und der lässt sich hübsch abfragen:

            if ( isset($_POST['test']['firma']) && 1 == $_POST['test']['firma'] ) {
              ... ToDo();
            }
            

            Was jetzt das serialisieren in dem ganzen Murks sollte hab ich bis jetzt nicht verstanden, wahrscheinlich ist es völliger Unsinn, aber das konnte ich am Anfang überhaupt nicht wissen.

            Jörg Reinholz

            1. Moin!

              So sieht der reparierte Murks bis jetzt aus.

                  <input name="test[firma]" type="checkbox" id="test_firma" value="1">
                  <label for="test_firma">Firma</label> 
                  
                  <input name="test[strasse]" type="checkbox" id="test_strasse" value="1">
                  <label for="test_strasse">Straße</label> 
              

              Das geht aber besser. Es folgt eine 2. Stufe der Auflösung: Irgendwie proggst Du nämlich nachdem Motto "Warum einfach, wenn es irre kompliziert geht". Vereinfachen wir das:

                   <input name="firma" type="checkbox" id="firma" value="1">
                   <label for="firma">Firma</label> 
                   
                   <input name="strasse" type="checkbox" id="strasse" value="1">
                   <label for="strasse">Straße</label> 
              

              ... was dann auch noch einfacher auszuwerten geht:

              $arKeys=array('firma', 'strasse');
              foreach ($arKeys as $key) {
                if ( isset($_POST[$key) && 1 == $_POST[$key] ) {
                  echo "$key war gesetzt<br>\n";
                }
              }
              

              Jörg Reinholz

            2. Tach!

              Was jetzt das serialisieren in dem ganzen Murks sollte hab ich bis jetzt nicht verstanden, wahrscheinlich ist es völliger Unsinn, aber das konnte ich am Anfang überhaupt nicht wissen.

              Das hat er ja erklärt, er möchte Datenbankfelder sparen. Das ist durchaus nicht völlig unsinnig, kann man (ich zumindest) aber ohne Kenntnis des Drumherum und damit fehlender Abschätzbarkeit der Folgen nicht beurteilen. Das kann einerseits nur eine andere Art der Komplexität reinbringen (De-/serialisieren statt zusätzlicher Felder und deren Berücksichtigung im DBMS-Handling) andererseits wirklich eine Erleichterung sein (eine Feld statt Beziehungstabellen, die man vielleicht nie aus fachlichen Gründen datenbanktechnisch berücksichtigen muss). Generell sollte man versuchen, das Serialisieren zu lassen und nur bei einer guten Begründung verwenden.

              dedlfix.

              1. Moin!

                Generell sollte man versuchen, das Serialisieren zu lassen und nur bei einer guten Begründung verwenden.

                Dann liefern wir mal Begründungen:

                Ein Grund wäre es, komplexe Daten in einer Textdatei speichern und aus einer solchen lesen zu wollen.

                Ein weiterer Grund wäre, dass man es sich einfach machen will und einen recht tief strukturierten (möglicherweise assoziativen) Array von einer Sprache zur anderen "transportieren" will.

                Beispiel: Erzeugen in PHP, Auswerten in Javascript:

                Auf dem Server:

                <?php
                # irre kompliziertes Zeug führe zu diesen Daten:
                $data['foo'][1]=0;
                $data['foo'][0]=true;
                $data['foo']['text']='Das ist Text.';
                $data['bar'][0]=false;
                $data['bar'][1]=1;
                $data['bar']['text']='In der Bar steht Bier.';
                
                $json=json_encode($data);
                ?>
                <html>
                <script type='text/javascript'>
                   var data=JSON.parse('<?php echo $json; ?>');
                   alert (data['bar']['text']);
                </script>
                </html>
                

                Im Browser:

                <html>
                <script type='text/javascript'>
                   var data=JSON.parse('{"foo":{"1":0,"0":true,"text":"Das ist Text."},"bar":{"0":false,"1":1,"text":"In der Bar steht Bier."}}');
                   alert (data['bar']['text']);
                </script>
                </html>
                
                
                

                Jörg Reinholz

                1. Hallo Jörg, hallo dedlfix, hallo alle,

                  eine ernstgemeinte Frage, denn ich weiß es nicht: Gibt es nicht auch bei solchen Austauschformaten eine Art indirekten Kontextwechsel, wonach man sich einigermaßen richten kann?

                  Also zum Beispiel: Wir haben verschiedene Sprachen, sagen wir einfach mal JavaScript, PHP und Perl. Könnte man dann nicht sagen:

                  • Möchten JavaScript und PHP Daten austauschen, "einigen sie sich" entweder auf JSON oder PHP-serialize
                  • Möchten JavaScript und Perl Daten austauschen, "einigen sie sich" entweder auf JSON oder Perl-Storable
                  • Möchten PHP und Perl Daten austauschen, "einigen sie sich" entweder auf PHP-serialize oder Perl-Storable
                  • Will JavaScript etwas z.B. im localStorage speichern wird JSON verwendet
                  • Will PHP etwas z.B. in einer Datei speichern wird PHP-serialize verwendet
                  • Will Perl etwas z.B. in einer Datei speichern wird Perl-Storable verwendet

                  Zum Austausch kann natürlich auch ein anderes Format (XML, CSV, was-weiß-ich) verwendet werden, aber innerhalb sollte doch immer die dafür geeignetste Methode verwendet werden!? Wenn dem so ist hätte man doch eine einigermaßen klare Regel für "richtig" und "falsch" mit der Begründung "Kontextwechsel".

                  Wie seht ihr das?

                  Gruß, Dennis

                  Ps: Mit Perl hab ich noch nie was gemacht, kann also sein, dass Perl-Storable völlig falsch ist :-)

                  1. Moin!

                    eine ernstgemeinte Frage, denn ich weiß es nicht: Gibt es nicht auch bei solchen Austauschformaten eine Art indirekten Kontextwechsel, wonach man sich einigermaßen richten kann?

                    Naja. Ich sags mal so. Ich habe säckeweise Daten. Ich habe ganze Rudel an Programmiersprachen. Ich weiss nie ganz genau, ob meine Daten mal in einer anderen Sprache verwendet werden.

                    Also speichere oder biete ich die in einem Format an, welches möglichst viele Sprachen möglichst einfach verwenden können.

                    Das führt mich derzeit eigentlich stets zu JSON. Denn JSON ist in JS, Perl, PHP, python, cpp, mono, c#, jscript , ... (eigentlich in allen) einfach, leicht und "billig" verwendbar, hat nicht den gewaltigen Overhead wie xml und nicht die mannigfaltigen Definitionsprobleme von csv.

                    Jörg Reinholz

                    1. Hallo Jörg,

                      eine ernstgemeinte Frage, denn ich weiß es nicht: Gibt es nicht auch bei solchen Austauschformaten eine Art indirekten Kontextwechsel, wonach man sich einigermaßen richten kann?

                      Naja. Ich sags mal so. Ich habe säckeweise Daten. Ich habe ganze Rudel an Programmiersprachen. Ich weiss nie ganz genau, ob meine Daten mal in einer anderen Sprache verwendet werden.

                      das kann man vorher natürlich auch nicht wissen. Deshalb dann auch eine weitere Abstraktionsschicht, z.B. ein DBS oder ein anderes Format.

                      Also speichere oder biete ich die in einem Format an, welches möglichst viele Sprachen möglichst einfach verwenden können.

                      Ist natürlich richtig und praxistauglich. Wobei man auch da sagen muss, dass das schon voraussetzt, zumindest halbwegs zu wissen, in Richtung welcher Sprachen sich das wahrscheinlich entwickelt.

                      Das führt mich derzeit eigentlich stets zu JSON. Denn JSON ist in JS, Perl, PHP, python, cpp, mono, c#, jscript , ... (eigentlich in allen) einfach, leicht und "billig" verwendbar, hat nicht den gewaltigen Overhead wie xml und nicht die mannigfaltigen Definitionsprobleme von csv.

                      Dem wollte ich auch nicht widersprechen, es sprechen einige Argumente für JSON und allgemein einige mindestens gegen CSV.

                      Ich wollte eigentlich auf eine etwas andere Richtung hinaus, auch wenn der Begriff "Kontextwechsel" wahrscheinlich irreführend gewählt war:

                      Hier wurde schon häufig "gepredigt", dass z.B. HTML-Markup nicht in eine Datenbank geschrieben werden soll. Stattdessen solle man beispielsweise BB-Code oder ähnliches verwenden, weil man den späteren Kontext nicht kennt.

                      Meine Überlegung ging jetzt dahin, ob man das nicht generell auch auf solche Formate wie JSON übertragen kann. Das würde bedeuten, dass z.B. JSON innerhalb JavaScript Verwendung findet, außer für Austauschzwecke aber nichts in PHP zu suchen hätte.

                      Davon unberührt bleiben natürlich begründete Ausnahmen, wie Du sie geliefert hast.

                      Ich frage auch nur deshalb, weil ich (nachdem ich den Wiki-Artikel zum Gruppenwechsel fertig hab) mich sonst mal an so einem Artikel versuchen würde. Das sind ja Dinge, die nicht jedem klar sind und später häufig Probleme bereiten können. Nur wenn ich da jetzt schon in eine falsche Richtung denke, bräuchte ich damit gar nicht erst anfangen.

                      Gruß, Dennis

                      1. Moin!

                        Meine Überlegung ging jetzt dahin, ob man das nicht generell auch auf solche Formate wie JSON übertragen kann. Das würde bedeuten, dass z.B. JSON innerhalb JavaScript Verwendung findet, außer für Austauschzwecke aber nichts in PHP zu suchen hätte.

                        Die Sache ist doch die:

                        "JSON" heisst "Javascript Object Notation". Stammt, wenn man so will, nativ aus Javascript. Und speichert angeblich Java-Skript-Objekte.

                        Wie weit es damit wirklich her ist zeigt das hier:

                           // einfaches Erzeugen eines hübschen Objektes mit nachvollziehbarer Wirkweise:
                                function classArithmetik(val1, val2) {
                                    // "Instanzierung" aus Parametern und festen Werten
                                    this.val1 = val1;
                                    this.val2 = val2;
                                    this.lastErg = false;
                                    this.lastErrorNbr = 0;
                                    this.lastErrorMsg  ='';
                        
                                    // Eine Handvoll niedlicher Methoden:
                                    this.add = function () {
                                        this.lastErg = val1 + val2;
                                        return this.lastErg;
                                    }
                        
                                    this.min = function () {
                                        this.lastErg = val1 - val2;
                                        return this.lastErg;
                                    }
                        
                                    this.multi = function () {
                                        this.lastErg = val1 * val2;
                                        return this.lastErg;
                                    }
                        
                                    this.div = function () {
                                        if (val2) {
                                            this.lastErg = val1 / val2;
                                            return this.lastErg;
                                        } else {
                                            this.lastErg = false;
                                            this.lastErrorNbr = 1;
                                            this.lastErrorMsg = "Division durch Null";
                                            return false;
                                        }
                                    }
                                }
                        
                                // Benutzen wir das Ding mal:
                                var o = new classArithmetik(6, 0);
                                alert (o.div());
                                if (false == o.lastErg) {
                                   alert (o.lastErrorNbr + ': ' + o.lastErrorMsg);
                                }
                        
                                // und jetzt JSON....
                                alert (JSON.stringify(o));
                        

                        letzter Alert:

                        {"val1":6,"val2":0,"lastErg":false,"lastErrorNbr":0,"lastErrorMsg":"","LastErrNbr":1,"LastErrMsg":"Division durch Null"}
                        

                        Von wegen "Object"- Notation! Es werden entggeen dem, was der Name erwarten lässt, nur die Eigenschaften, nicht die Methoden "stringifiziert"!

                        Soweit ich das verstehe hat das seinen Grund, weil in Javascript arrays, insbesondere assoziative Arrays (und sogar Strings) nicht wirklich Variablen sondern bereits Objekte sind.

                        Aber um die Inhalte von (assoziativen) Arrays zu transportieren ist es eine Klasse-Sache, so lange man sich daran hält, dass es für JSON.stringify inzwischen auch schon die zweite Vorschrift gibt, was auf php.net ganz nett erklärt wird. Das betrifft aber nur die Übertragung "skalarer Typen" ("Skalare" nennt man in Perl einfache Variablen) oder gleich von "NULL"-Werten. Nichts davon macht mir aber Sorgen, denn es gäbe, so die Gefahr bestände, die Konstante JSON_FORCE_OBJECT

                        Eines noch. JSON ist auch ein Klasse-Daten-Transportcontainer. Viele Dienste der Google-API benutzen z.B. JSON für die Antworten. Das lässt sich fummelfrei auswerten.

                        "Endgeil!" sag ich nur :)

                        Jörg Reinholz

                        1. Hey Jörg,

                          danke nochmal für Deine Antwort. Auch wenn ich noch nicht ganz gesehen habe, wie das zu meinem Beitrag passt, ist es dennoch interessant :-)

                          Meine Überlegung ging jetzt dahin, ob man das nicht generell auch auf solche Formate wie JSON übertragen kann. Das würde bedeuten, dass z.B. JSON innerhalb JavaScript Verwendung findet, außer für Austauschzwecke aber nichts in PHP zu suchen hätte.

                          Die Sache ist doch die:

                          "JSON" heisst "Javascript Object Notation". Stammt, wenn man so will, nativ aus Javascript.

                          Zumindest war es ursprünglich so gedacht, dass jede JSON gleichzeitig gültiges JavaScript ist.

                          Und speichert angeblich Java-Skript-Objekte.

                          Wie kommst Du darauf? Ich kann mir kaum vorstellen, dass das mal offiziell so kommuniziert wurde. Unabhängig davon: Nach meinem Verständnis ist es auch so, dass Objekte nur zur Laufzeit eines Programms existieren können. Gespeichert werden kann somit nur ein Objekt-Zustand. Da lasse ich mich aber gerne eines besseren belehren.

                          Wie weit es damit wirklich her ist zeigt das hier: [Beispiel]

                          letzter Alert:

                          {"val1":6,"val2":0,"lastErg":false,"lastErrorNbr":0,"lastErrorMsg":"","LastErrNbr":1,"LastErrMsg":"Division durch Null"}
                          

                          Von wegen "Object"- Notation! Es werden entggeen dem, was der Name erwarten lässt, nur die Eigenschaften, nicht die Methoden "stringifiziert"!

                          Es ist nur ein Name. Ich persönlich hätte auf jeden Fall nicht gedacht, dass das komplette Objekt "verstringt" wird (s.o.).

                          Wenn Du z.B. eine andere Notation, z.B. die Musik-Notation (a.k.a. Notenschrift) nimmst: Da speicherst Du ja auch nur die veränderlichen Dinge, also die Noten selbst und packst nicht auch noch das Klavier mit rein, denn das würde a) arg schwer werden (hier: großer Overhead) und b) könntest Du die Noten dann nicht mehr auf der Trompete spielen (hier: andere Programmiersprache).

                          Aber unabhängig davon ist der Name ja auch nicht wirklich falsch: Mit diesen Informationen kann ein Objekt wiederhergestellt werden.

                          Soweit ich das verstehe hat das seinen Grund, weil in Javascript arrays, insbesondere assoziative Arrays (und sogar Strings) nicht wirklich Variablen sondern bereits Objekte sind.

                          Das dürfte nicht der Grund sein. Auch wenn das mit den Arrays stimmt, ich aber gerade den Bogen von "speichert keine Methoden" zu "Arrays" nicht hinbekomme.

                          Warum nur die Eigenschaften gespeichert werden dürfte aber folgende Gründe haben: Erstens zur Schonung der Ressourcen. Du wärst sicher - völlig zurecht - einer der ersten, die sich beschweren würden, wenn JSON tausendmal die Methoden mit speichern bzw. versenden würde, obwohl die sich nicht ändern ;-) Zur Wiederherstellung des Objekts reichen die veränderlichen Eigenschaften. Zweitens wäre es unsinnig, wenn JSON als Austauschformat genutzt würde. Vielleicht willst Du ja auf der anderen Seite was völlig anderes mit den Daten anstellen!? Außerdem: Was kann ich beispielsweise mit JavaScript-Methoden oder -Objekten in PHP anfangen und umgekehrt!?

                          Aber um die Inhalte von (assoziativen) Arrays zu transportieren ist es eine Klasse-Sache, so lange man sich daran hält, dass es für JSON.stringify inzwischen auch schon die zweite Vorschrift gibt, was auf php.net ganz nett erklärt wird. Das betrifft aber nur die Übertragung "skalarer Typen" ("Skalare" nennt man in Perl einfache Variablen) oder gleich von "NULL"-Werten. Nichts davon macht mir aber Sorgen, denn es gäbe, so die Gefahr bestände, die Konstante JSON_FORCE_OBJECT

                          Skalare Typen dürfte es in den meisten Programmiersprachen geben, das heißt ja nichts anderes als dass die Variable nur einen Wert enthält (in Anlehnung an das mathematische Skalar).

                          Eines noch. JSON ist auch ein Klasse-Daten-Transportcontainer. Viele Dienste der Google-API benutzen z.B. JSON für die Antworten. Das lässt sich fummelfrei auswerten.

                          Ja, ist es.

                          "Endgeil!" sag ich nur :)

                          Ja, wenn es zum Anwendungszweck passt, bin ich völlig Deiner Meinung ;-)

                          Gruß, Dennis

                          1. Moin!

                            Und speichert angeblich Java-Skript-Objekte. Wie kommst Du darauf? Ich kann mir kaum vorstellen, dass das mal offiziell so kommuniziert wurde.

                            Der Name…

                            Es ist nur ein Name.

                            Ja. hach

                            Ich persönlich hätte auf jeden Fall nicht gedacht, dass das komplette Objekt "verstringt" wird (s.o.).

                            Ich hatte es ganz leise gehofft :)

                            In einem Punkt hast Du natürlich völlig recht: Würde man JSON mitsamst dem Objektmethoden z.B. in PHP auswerten wollen, dann wären diese Methoden der Logik zufolge in Javascript notiert - was PHP nicht versteht. Würde man das partout wollen, dann gäbe es einigen Aufwand um in PHP auch noch einen Javascript-Interpreter zu integrieren. Den könnte man dank node.js zwar noch irgendwie "stemmen" aber dann müsste man das weiter denken und auch womöglich in den Objekten benutzte globale Variablen (wird gemacht "weil es geht" auch wenn es nicht klug ist) ins JSON packen und würde sich (Sicherheits-)Probleme "ohne Ende" einhandeln. Also nur die Eigenschaften. Punkt!

                            Jörg Reinholz

                            1. Hallo Jörg,

                              Ich persönlich hätte auf jeden Fall nicht gedacht, dass das komplette Objekt "verstringt" wird (s.o.).

                              Ich hatte es ganz leise gehofft :)

                              und ich hatte befürchtet, dass Du das sagst ;-)

                              In einem Punkt hast Du natürlich völlig recht: Würde man JSON mitsamst dem Objektmethoden z.B. in PHP auswerten wollen, dann wären diese Methoden der Logik zufolge in Javascript notiert - was PHP nicht versteht. Würde man das partout wollen, dann gäbe es einigen Aufwand um in PHP auch noch einen Javascript-Interpreter zu integrieren. Den könnte man dank node.js zwar noch irgendwie "stemmen" aber dann müsste man das weiter denken und auch womöglich in den Objekten benutzte globale Variablen (wird gemacht "weil es geht" auch wenn es nicht klug ist) ins JSON packen und würde sich (Sicherheits-)Probleme "ohne Ende" einhandeln. Also nur die Eigenschaften. Punkt!

                              Vollkommen richtig, da sind wir uns wohl einig.

                              Gruß, Dennis

                          2. Hallo,

                            Wenn Du z.B. eine andere Notation, z.B. die Musik-Notation (a.k.a. Notenschrift) nimmst: Da speicherst Du ja auch nur die veränderlichen Dinge, also die Noten selbst und packst nicht auch noch das Klavier mit rein, denn das würde a) arg schwer werden (hier: großer Overhead) und b) könntest Du die Noten dann nicht mehr auf der Trompete spielen (hier: andere Programmiersprache).

                            Und was ist, wenn du eine Orgel mit reinpackst, die ein Trompetenregister hat?

                            scnr

                            Gruß
                            Kalk

                            1. Hey Kalk,

                              Wenn Du z.B. eine andere Notation, z.B. die Musik-Notation (a.k.a. Notenschrift) nimmst: Da speicherst Du ja auch nur die veränderlichen Dinge, also die Noten selbst und packst nicht auch noch das Klavier mit rein, denn das würde a) arg schwer werden (hier: großer Overhead) und b) könntest Du die Noten dann nicht mehr auf der Trompete spielen (hier: andere Programmiersprache).

                              Und was ist, wenn du eine Orgel mit reinpackst, die ein Trompetenregister hat?

                              scnr

                              das dürfte im übertragenen Sinne dann das von Jörg angesprochene node.js sein ;-)

                              Gruß, Dennis

                  2. Tach!

                    eine ernstgemeinte Frage, denn ich weiß es nicht: Gibt es nicht auch bei solchen Austauschformaten eine Art indirekten Kontextwechsel, wonach man sich einigermaßen richten kann?

                    Also zum Beispiel: Wir haben verschiedene Sprachen, sagen wir einfach mal JavaScript, PHP und Perl. Könnte man dann nicht sagen:

                    • Möchten JavaScript und PHP Daten austauschen, "einigen sie sich" entweder auf JSON oder PHP-serialize

                    In dem Fall besser JSON. JSON hat Tools in beiden Welten. PHPs serialize() ist nur bedingt mit Javascript verarbeitbar. Knackpunkt ist hier die unterschiedliche Handhabung von Arrays und Objekten in beiden Welten. Das geht zwar prinzipiell alles, aber man muss sich erstmal Tools herstellen oder anderenorts welche finden.

                    • Möchten JavaScript und Perl Daten austauschen, "einigen sie sich" entweder auf JSON oder Perl-Storable
                    • Möchten PHP und Perl Daten austauschen, "einigen sie sich" entweder auf PHP-serialize oder Perl-Storable

                    Vielleicht, vielleicht auch nicht. Kommt auf den Anwendungsfall an (und auf die vorhandenen Tools).

                    • Will JavaScript etwas z.B. im localStorage speichern wird JSON verwendet
                    • Will PHP etwas z.B. in einer Datei speichern wird PHP-serialize verwendet
                    • Will Perl etwas z.B. in einer Datei speichern wird Perl-Storable verwendet

                    Das ist wohl das vernüftigste, weil das individuell auf die Sprache und deren Belangen bei den Datenstrukturen abgestimmt ist.

                    Zum Austausch kann natürlich auch ein anderes Format (XML, CSV, was-weiß-ich) verwendet werden, aber innerhalb sollte doch immer die dafür geeignetste Methode verwendet werden!?

                    Besser ist das. Es sei denn, man hat Grunde es anders zu machen. Und damit meine ich nicht irgendwelche generellen Gründe sondern bezogen auf den konkreten Anwendungsfall.

                    Wenn dem so ist hätte man doch eine einigermaßen klare Regel für "richtig" und "falsch" mit der Begründung "Kontextwechsel".

                    Kontextwechsel braucht man nicht zu berücksichtigen, das machen die jeweiligen Tools. (Es sei denn, man schreibt das Tool selbst.) Der Kontextwechsel muss aber weiterhin beachtet werden, wenn solche serialisierten Daten in einen anderen Kontext gebracht werden.

                    Ps: Mit Perl hab ich noch nie was gemacht, kann also sein, dass Perl-Storable völlig falsch ist :-)

                    Ich kenne es auch nicht und gehe für die vorliegende Betrachtung mal davon aus, dass es etwas vergleichbares ist.

                    dedlfix.

                    1. Hallo dedlfix,

                      eine ernstgemeinte Frage, denn ich weiß es nicht: Gibt es nicht auch bei solchen Austauschformaten eine Art indirekten Kontextwechsel, wonach man sich einigermaßen richten kann?

                      Also zum Beispiel: Wir haben verschiedene Sprachen, sagen wir einfach mal JavaScript, PHP und Perl. Könnte man dann nicht sagen:

                      • Möchten JavaScript und PHP Daten austauschen, "einigen sie sich" entweder auf JSON oder PHP-serialize

                      In dem Fall besser JSON. JSON hat Tools in beiden Welten. PHPs serialize() ist nur bedingt mit Javascript verarbeitbar. Knackpunkt ist hier die unterschiedliche Handhabung von Arrays und Objekten in beiden Welten. Das geht zwar prinzipiell alles, aber man muss sich erstmal Tools herstellen oder anderenorts welche finden.

                      Hier würde ich auch JSON nehmen, es ging mir nur um das generelle Vorgehen.

                      • Will JavaScript etwas z.B. im localStorage speichern wird JSON verwendet
                      • Will PHP etwas z.B. in einer Datei speichern wird PHP-serialize verwendet
                      • Will Perl etwas z.B. in einer Datei speichern wird Perl-Storable verwendet

                      Das ist wohl das vernüftigste, weil das individuell auf die Sprache und deren Belangen bei den Datenstrukturen abgestimmt ist.

                      Das wäre auch meine Einschätzung gewesen.

                      Zum Austausch kann natürlich auch ein anderes Format (XML, CSV, was-weiß-ich) verwendet werden, aber innerhalb sollte doch immer die dafür geeignetste Methode verwendet werden!?

                      Besser ist das. Es sei denn, man hat Grunde es anders zu machen. Und damit meine ich nicht irgendwelche generellen Gründe sondern bezogen auf den konkreten Anwendungsfall.

                      Der konkrete Anwendungsfall sollte erstmal außenvorbleiben.

                      Wenn dem so ist hätte man doch eine einigermaßen klare Regel für "richtig" und "falsch" mit der Begründung "Kontextwechsel".

                      Kontextwechsel braucht man nicht zu berücksichtigen, das machen die jeweiligen Tools. (Es sei denn, man schreibt das Tool selbst.) Der Kontextwechsel muss aber weiterhin beachtet werden, wenn solche serialisierten Daten in einen anderen Kontext gebracht werden.

                      Ich habe nebenan als Antwort auf Jörg noch etwas mehr hierzu geschrieben. Ich habe "Kontextwechsel" wahrscheinlich irreführend benutzt und meine eher so einen "Meta-Kontextwechsel", auch wenn das die Sache nicht einfacher macht :-) Ich weiß halt nicht, wie man das nennen soll. Vielleicht eher "kontextgerecht"?

                      Gruß, Dennis

                  3. Hallo,

                    Ps: Mit Perl hab ich noch nie was gemacht, kann also sein, dass Perl-Storable völlig falsch ist

                    laut unserem Wiki scheinst du nicht ganz falsch zu liegen.

                    Gruß
                    Kalk

                    1. Hallo Kalk,

                      Ps: Mit Perl hab ich noch nie was gemacht, kann also sein, dass Perl-Storable völlig falsch ist

                      laut unserem Wiki scheinst du nicht ganz falsch zu liegen.

                      mir ist gerade zum ersten Mal bewusst aufgefallen, dass im Wiki überhaupt was über Perl drinsteht. Schon erstaunlich, wie man Dinge immer wieder einfach völlig ausblendet, wenn sie für einen nicht relevant sind. Wahrscheinlich hab ich das auch schon hundertmal gelesen, aber noch nie bewusst wahrgenommen. Jetzt weiß ich's aber, danke dafür. Und danke natürlich auch für den Hinweis.

                      Gruß, Dennis

              2. Hallo dedlfix,

                Das hat er ja erklärt, er möchte Datenbankfelder sparen. Das ist durchaus nicht völlig unsinnig, kann man (ich zumindest) aber ohne Kenntnis des Drumherum und damit fehlender Abschätzbarkeit der Folgen nicht beurteilen.

                warum ich das ganze mache hat folgenden Hintergrund:

                Ich möchte gerne später ein PDF zusammen stellen lassen, was dank http://html2pdf.fr/de/example absolut kein Problem ist. Dieses möchte ich dynamisch halten so dass ich mit einer Datei mehrere Bereiche abdecken kann. Jedes PDF (Angebot, Rechnung) hat später Grundelemente die immer gleich sind, dann möchte ich aber im Admin Bereich Bereiche hinzuschalten bzw. entfernen können. Da ich jetzt aber noch nicht weiß wie viele Felder ich benötige, möchte ich diese optionale Elemente als "Serialize" speichern um nicht ständig neue Felder hinzufügen zu müssen. Außerdem müsste ich dann ständig den insert Code anpassen, was auch nicht wirklich toll ist.

                1. Hallo Jnnbo,

                  Das hat er ja erklärt, er möchte Datenbankfelder sparen. Das ist durchaus nicht völlig unsinnig, kann man (ich zumindest) aber ohne Kenntnis des Drumherum und damit fehlender Abschätzbarkeit der Folgen nicht beurteilen.

                  warum ich das ganze mache hat folgenden Hintergrund:

                  Ich möchte gerne später ein PDF zusammen stellen lassen, was dank http://html2pdf.fr/de/example absolut kein Problem ist. Dieses möchte ich dynamisch halten so dass ich mit einer Datei mehrere Bereiche abdecken kann. Jedes PDF (Angebot, Rechnung) hat später Grundelemente die immer gleich sind, dann möchte ich aber im Admin Bereich Bereiche hinzuschalten bzw. entfernen können. Da ich jetzt aber noch nicht weiß wie viele Felder ich benötige, möchte ich diese optionale Elemente als "Serialize" speichern um nicht ständig neue Felder hinzufügen zu müssen. Außerdem müsste ich dann ständig den insert Code anpassen, was auch nicht wirklich toll ist.

                  ich hab vor kurzem ähnliches gemacht, übrigens unter anderem auch mit html2pdf. Ist für einfache Sachen wirklich gar nicht verkehrt.

                  In dem Fall würde ich Dir aber 1. vom serialisieren, 2. von der Verwendung nur eines Templates für alles und 3. für das Zu- und Abschalten im Admin-Panel abraten. Ich würde wetten, damit handelst Du Dir früher oder später Probleme ein.

                  Zu 1.: Ich würde eine sinnvolle Datenbankstruktur wählen. Ein Angebot und eine Rechnung haben Eigenschaften, manche davon überschneiden sich. Du könntest also z.B. eine Tabelle "Rechnung" mit den für eine Rechnung typischen Eigenschaften erstellen, gleiches für "Angebot". Sowohl ein Angebot als auch eine Rechnung haben aber typischerweise eine Anschrift. Das kannst Du in eine eigene Tabelle "Anschrift" auslagern und dann in der "Angebot"- und "Rechnung"-Tabelle "verlinken", also dort nur den Schlüssel der Anschrift speichern. Also schlicht und einfach eine normalisierte Datenbank.

                  Zu 2.: Verwende lieber mehrere Templates. Z.B. ein Haupt-Template, was nur Header (z.B. mit Anschrift) und Footer (z.B. Deine Kontaktdaten) bereitstellt. Dann gibt es die Templates "Angebot" und "Rechnung", die in den Inhaltsbereich des Haupttemplates geladen werden. Zusätzlich gibt es z.B. ein Template "Tabelle mit den Einzelpositionen", welches Du dann wiederrum in die beiden Templates "Angebot" und "Rechnung" inkludieren kannst.

                  Zu 3.: Im Allgemeinen braucht das keine Option im Admin-Bereich zu sein. Das geben die Templates schon von sich her und es ist zudem sehr unwahrscheinlich, dass Du da ständig was Ein- und Ausschalten musst. Konzentriere Dich lieber auf die anderen Baustellen. Außerdem kannst Du in den Templates ja auch Abfragen wie "wenn keine Telefonnummer angegeben, schreibe k.A." einbauen.

                  Gruß, Dennis

                2. Tach!

                  Da ich jetzt aber noch nicht weiß wie viele Felder ich benötige, möchte ich diese optionale Elemente als "Serialize" speichern um nicht ständig neue Felder hinzufügen zu müssen. Außerdem müsste ich dann ständig den insert Code anpassen, was auch nicht wirklich toll ist.

                  Mal ganz salopp gesagt und ohne einen Vorwurf: wenn es nur darum geht, der eigenen Faulheit ihren Lauf zu lassen, dann solltest du das lieber nicht tun, besonders dann nicht, wenn du in diesen Daten später mal suchen möchtest.

                  Andererseits kann das was du vorhast auch eine Art dokumentenbasierte Speicherung sein. Betrachte dabei den Begriff „Dokument“ nicht als das fertige PDF sondern als eine Sammlung von zusammengehörigen Daten zu einem Thema.

                  Beispielsweise wären da Fließtextbausteine, die beliebig viele Platzhalter aufweisen können, deren Daten nicht aus den relationalen Bestand (Kundendaten, Artikeldaten, Bestelldaten, etc.) genommen werden sollen, sondern vom Bearbeiter individuell eingegeben werden. Da weiß man auch nicht, wieviele Felder es in die Fließtexte schaffen. Man kann das natürlich auch mit einer Tabelle aufbauen, in der Fließtext-ID, Platzhaltername und Inhalt als drei Felder stehen nebst einem Verweis auf den Kunden oder wem auch immer dieser Textbaustein zugewiesen werden soll. Jeder Platzhalter hat dann einen eigenen Datensatz. Oder aber, man legt die Platzhalter als Serialized LOB (Large Object) ab.

                  Am Ende musst du das dann für dich entscheiden. Und wenn es sich später als ungünstig herausstellt, dann war das ein Fall für die Erfahrungssammlung.

                  dedlfix.

                  1. Hallo dedlfix,

                    Am Ende musst du das dann für dich entscheiden. Und wenn es sich später als ungünstig herausstellt, dann war das ein Fall für die Erfahrungssammlung.

                    vielleicht habe ich mich auch falsch ausgedrückt. Ich möchte mit diesen Daten die ich derzeit versuche zu speichern meine Vorlage zusammen bauen. In diesen Daten soll später natürlich nicht gesucht werden.

                    Ein Beispiel wäre, dass ich z.B. ein Weihnachtsangebot vorbereite aber ich jetzt noch nicht weiß welcher Kunde dieses bekommt, also hinterlege ich dieses in einer separaten Tabelle wenn ich ein Angebot erstelle gibt’s eine Checkbox wo ich anklicken kann soll dieser Text mit auf die Seite.

                    Mit diesen Daten wird später überhaupt nicht mehr gearbeitet, diese stehen einfach als Text und oder Grafiken auf dem PDF Dokument.

                3. Moin!

                  warum ich das ganze mache hat folgenden Hintergrund:

                  Ich möchte gerne später ein PDF zusammen stellen lassen, was dank http://html2pdf.fr/de/example absolut kein Problem ist.

                  Die Ergebnisse von html2pdf sind schnell erzielt, aber die "genügen nicht jedem für alles". (Das ist die Höflichkeitsform).

                  Tipp: Wenn Dir der Server gehört, Du also pdflatex installieren kannst, dann könntest Du auch machen, was ich gemacht habe:

                  Rechnung in libreoffice, gleich mit allen Platzhaltern erzeugen. Rechnungsvorlage als tex-Datei exportieren. Rechnungsvorlage mit Editor öffnen und verbessern, Dir ggf. anschauen was Du machen musst um Tabellenzeilen einzufügen (Ich habe stets genau eine Position.)

                  Auf dem Webserver: Formular für die Daten... und dann in PHP die Vorlage.tex öffnen, die Platzhalter durch die Werte aus dem Formular ersetzen, mit pdflatex umwandeln, das PDF auf dem Server speichern (drucken könnte man es auch) und an den Benutzer ausliefern (wenn man das denn will). Das Ergebnis sind Ausdrucke, die wirklich "klasse" aussehen.

                  Wieso die sogar besser aussehen als das mit libreOffice oder auch Word überhaupt erreichbar ist muss mir mal jemand erklären, der sowohl von der graphischen Seite als auch von der technischen Seite (LaTeX) her davon was versteht.

                  <?php
                  include 'defaults.php'; # setzt z.B. SAFE_DIR
                  
                  $ar_suchen=array();
                  $ar_ersetzen=array();
                  
                  $betrag=floatval(trim(str_replace(',', '.', $_POST['D_NETTO'])));
                  $ustsatz=floatval(trim($_POST['D_USTSATZ']))/100;
                  $_POST['D_RNUMMER']=intval(trim($_POST['D_RNUMMER']));
                  
                  $_POST['D_NETTO']=number_format($betrag , 2 , ',' , '.' ).' '.$_POST['D_WAEHRUNG'];
                  $_POST['D_UST']=number_format($betrag*$ustsatz , 2 , ',' , '.' ).' '.$_POST['D_WAEHRUNG'];
                  $_POST['D_BRUTTO']=number_format($betrag*(1+$ustsatz) , 2 , ',' , '.' ).' '.$_POST['D_WAEHRUNG'];
                  
                  foreach (array_keys($_POST) as $key) {
                      $ar_suchen[]=str_replace('_', '.', $key);
                      $ar_ersetzen[]=string_to_latex(trim($_POST[$key]));
                  }
                  
                  $tmpfile=tempnam('/tmp', 'php_') ;
                  #unlink ($tmpfile);
                  #die($tmpfile);
                  $tmpfile_tex=$tmpfile . '.tex';
                  $tmpfile_pdf=$tmpfile . '.pdf';
                  $tmpfile_err=$tmpfile . '.log';
                  $tex= file_get_contents(VORLAGE);	
                  $tex=str_replace ($ar_suchen,$ar_ersetzen,  $tex);
                  file_put_contents ($tmpfile_tex, $tex);
                  
                  chdir ('/tmp');
                  $system="pdflatex  -interaction=nonstopmode -synctex=0 -output-directory=/tmp $tmpfile_tex";
                  #die($system);
                  $dummy=exec($system);
                  header('content-type: application/pdf');
                  header('Content-Disposition: attachment; filename="' .$_POST['D_RNUMMER']. '.pdf"');
                  print file_get_contents($tmpfile_pdf);
                  
                  unlink ($tmpfile_tex);
                  exec ('mv "' . $tmpfile_pdf . '"  "' . SAFE_DIR . $_POST['D_RNUMMER'] . '.pdf"');
                  exec ('chmod 666 "' . SAFE_DIR . $_POST['D_RNUMMER'] . '.pdf"');
                  unlink ($tmpfile_tex);
                  unlink ($tmpfile_log);
                  unlink ($tmpfile);
                  exit;
                  
                  function char_2_tex () {
                    $ar['\\'] = '\textbackslash ';
                    $ar['&']  = '\&';
                    $ar['_']  = '\_';
                    $ar['<']  = '\textless';  
                    $ar['>']  = '\textgreater';  
                    $ar['§']  = '\textascii§';  
                    $ar['$']  = '\$';  
                    $ar['#']  = '\#';  
                    $ar['{']  = '\textbraceleft';  
                    $ar['}']  = '\textbraceright';  
                    $ar['%']  = '\%';  
                    $ar['~']  = '\textasciitilde';  
                    $ar['"']  = '\textquotedbl';  
                    $ar['|']  = 'textbar';  
                    $ar['€']  = '\texteuro';  
                    $ar['Ø']  = '\O';  
                    $ar['...']  = '\dots';
                    $ar['ß'] = '\ss';
                    $ar['<<'] = '\guillemotleft';
                    $ar['>>'] = '\guillemotright';
                    return $ar;
                  }
                  
                  
                  function string_to_latex ($str) {
                        $ar= char_2_tex();
                        $s=array_keys($ar);
                        foreach ($s as $t) {
                          $r[]=$ar[$t];
                        }
                        return str_replace($s, $r, $str);
                  }
                  

                  Jörg Reinholz

            3. Hallo,

              Das würde einen Array wie folgt liefern:

              • $_POST['test'][0]='firma';
              • $_POST['test'][1]='strasse';

              oder, je nach dem wie angeklickt:

              • $_POST['test'][0]='strasse';

              was meinst du mit "je nach dem wie angeklickt"? (Abgesehen davon, dass der Halbsatz ein Komma zu wenig und ein Leerzeichen zu viel hat.)

              Die Index-Reihenfolge der Einträge in $_POST (gilt analog für $_GET) ist durch die Reihenfolge der Elemente im Formular bestimmt. Die Reihenfolge des Focussierens oder der Eingabe spielt dabei keine Rolle.

              Die Bezeichner gehören in das label-tag.

              Ähm, nein. Aber ins label-Element.

              Ein Element hat eine ID, eine ID gehört zu genau einem Element. Wenn Du schon im HTML-Formular dafür sorgst, dass ein sinnvoller Array gebaut wird, dann kannst Du den auch einfacher abfragen.

              Oh. Die mehrfache Vergabe gleichlautender IDs ist mir noch gar nicht aufgefallen.

              So long,
               Martin

            4. Hallo Jörg,

              auch das geht nicht, so wich es es benötige. Mit dem blöden json habe ich mit Ärger als alles andere, darauf habe ich kein Bock mehr. Ich bleib bei meiner Version

              	$eingabe = array ( $_POST['test']);
              	$ausgabe = serialize ( $eingabe );
              	
              	echo $ausgabe;
              	
              	$array = unserialize ( $ausgabe );
              	
              	if (array_key_exists('firma', $array[0])) {
              		echo "Das Element 'Firma' ist in dem Array vorhanden";
              	}
              
              1. Ahoi Jnnbo

                serialize und unserialize funktionieren doch hervorragend für dein beispiel. was willst du mehr?

                Dank und Gruß,

                bob from berlin

                1. Hallo frankx,

                  serialize und unserialize funktionieren doch hervorragend für dein beispiel. was willst du mehr?

                  gar nichts, deshalb bleibe ich auch dabei. Jörg hat mir irgendetwas mit "json" erklärt, was überhaupt nicht funktioniert und wo ich auch gar kein Sinn drin sehe.

                  1. Hallo Jnnbo,

                    serialize und unserialize funktionieren doch hervorragend für dein beispiel. was willst du mehr?

                    gar nichts, deshalb bleibe ich auch dabei. Jörg hat mir irgendetwas mit "json" erklärt, was überhaupt nicht funktioniert und wo ich auch gar kein Sinn drin sehe.

                    JSON macht grundsätzlich nicht viel anderes als serialize. Du kannst es prinzipiell genauso wie serialize verwenden. Wenn Du ein Array hast kannst Du json_encode($array) genauso wie serialize($array) und json_decode($array) genauso wie unserialize($array) verwenden. Versuch's einfach mal, einfach das eine durch das andere ersetzen, das funktioniert genauso.

                    Wenn Du innerhalb PHP bleibst würde ich aber auch serialize() und unserialize() benutzen.

                    Gruß, Dennis

              2. Hallo Jnnbo,

                	$eingabe = array ( $_POST['test']);
                	$ausgabe = serialize ( $eingabe );
                	
                	echo $ausgabe;
                	
                	$array = unserialize ( $ausgabe );
                	
                	if (array_key_exists('firma', $array[0])) {
                		echo "Das Element 'Firma' ist in dem Array vorhanden";
                	}
                

                hat das eigentlich einen besonderen Grund, dass Du $_POST['test'] nochmal in ein Array steckst?

                Gruß, Dennis

                1. Hallo Der-Dennis,

                  hat das eigentlich einen besonderen Grund, dass Du $_POST['test'] nochmal in ein Array steckst?

                  das $_POST['test'] existiert später überhaupt nicht mehr, ich habe dieses kleine Formular nur genutzt um zu testen ob die Ausgabe richtig funktioniert. Später kommen die Daten aus meiner Datenbank.

                  1. Hallo Jnnbo,

                    hat das eigentlich einen besonderen Grund, dass Du $_POST['test'] nochmal in ein Array steckst?

                    das $_POST['test'] existiert später überhaupt nicht mehr, ich habe dieses kleine Formular nur genutzt um zu testen ob die Ausgabe richtig funktioniert. Später kommen die Daten aus meiner Datenbank.

                    dann nur schon mal als Tipp: Je nachdem, wie Deine Struktur später aussieht, musst Du das $array[0] evtl. wieder durch $array, evtl. auch etwas anderes ersetzen. Schau Dir dann am besten wieder den var_dump() an, falls etwas unerwartet "nicht funktioniert".

                    Gruß, Dennis

              3. Moin!

                Mit dem blöden json habe ich mit Ärger als alles andere

                Daran liegt es aber nicht. Du hast einfach zu wenig Geduld und weißt scheinbar gar nicht, was Du tust, weil Du dir die Ergebnisse der Schritte nicht ausgeben lässt aber mit komplexem Zeug rummachst:

                darauf habe ich kein Bock mehr. Ich bleib bei meiner Version

                	$eingabe = array ( $_POST['test']);
                	$ausgabe = serialize ( $eingabe );
                	
                	echo $ausgabe;
                	
                	$array = unserialize ( $ausgabe );
                	
                	if (array_key_exists('firma', $array[0])) {
                		echo "Das Element 'Firma' ist in dem Array vorhanden";
                	}
                

                Du musst wirklich lernen, Dir Deine Daten mit var_dump($_POST) oder print_r($_POST) anzusehen und aus den Ausgaben zu schließen, was Du zu tun hast.

                z.b. kannst Du schon hier abkürzen: $array=$_POST['test']; Das spart Dir die ersten 3 nichtleeren Zeilen und das Gefummel mit

                # Unsinn:
                $array=deserialize(serialize($_POST['test'])); 
                

                worauf Deine Zeilen hinauslaufen. Das obige ist aber auch sonst völlig "von hinten durch die Brust ins Auge" weil

                 if (array_key_exists('firma', $_POST)) {
                 	echo "Das Element 'Firma' ist in dem Array vorhanden";
                 }
                

                das gewünschte Ergebnis erzielen sollte wenn Dein Formular so aussieht:

                <form method="post">
                 <input type="checkbox" name="firma" id="firma" value="1"><label for="firma">Firma</label>
                </form>
                

                und Firma angeklickt wurde.

                Noch mal: Wozu Du in Deinem Skriptstück Daten erst serialisiert und dann deseralisierst erschließt sich überhaupt nicht. Das ist wie wenn Du Deine deutsche Zeitung morgens ins Russische übersetzen lässt um sie dann nachmittags in Deutsche übersetzen zu lassen und abends zu lesen. Mit dem Speichern hat das nichts zu tun und json ist ganz gewiss nicht schuld.

                Jörg Reinholz

                1. Hallo Jörg,

                  Wozu Du in Deinem Skriptstück Daten erst serialisiert und dann deseralisierst erschließt sich überhaupt nicht

                  ich tippe mal darauf, dass das einfach nur zum Testen ist.

                  Gruß, Dennis

                2. Hallo Jörg,

                  Noch mal: Wozu Du in Deinem Skriptstück Daten erst serialisiert und dann deseralisierst erschließt sich überhaupt nicht. Das ist wie wenn Du Deine deutsche Zeitung morgens ins Russische übersetzen lässt um sie dann nachmittags in Deutsche übersetzen zu lassen und abends zu lesen. Mit dem Speichern hat das nichts zu tun und json ist ganz gewiss nicht schuld.

                  ich kann es auch dir gerne nochmals schreiben $_POST['test'] habe ich später nicht, das Formular habe ich derzeit nur um zu testen was ich überhaupt mache, meine Daten wie im ersten Posting bereits beschrieben kommen aus einer MySQL Tabelle in dieser sind mehrere Werte vorhanden, da ich meine Felder nicht ständig erweitern möchte.

              4. Moin!

                Also, ok. Deine Daten stammen aus einem Formular und stehen in der Datenbank, sehen etwa so aus:

                id     sonstwas       json
                0      foo            {"firma":1,"strasse":1}
                1      bar            {"strasse":1} 
                2      tok            {"firma":1}
                

                Die Datensätze holst du mit

                SELECT `ID`, `json` FROM `tabelle`
                

                aus der Datenbank.

                Du bekommst im Endeffekt für jede Zeile etwas wie

                $row['id']=0;
                $row['json']='{"firma":1,"strasse":1}';
                

                jetzt machst Du aus $row['json'] das Array:

                $arr=json_decode($row['json'])

                var_dump sollte etwas liefern wie:

                [firma] => 1
                [strasse] => 1
                

                und Du kannst den Array befragen:

                if ( array_key_exists('firma', $arr) ) {
                   echo "In Datensatz ", $row['id'], " ist firma vorhanden.<br>\n";
                }
                

                ohne Datenbank - aber getestet:

                <?php
                # Daten aus der Datenbank:
                $row['json']='{"firma":1,"strasse":1}';
                $row['id']=0;
                
                # Deserialisieren:
                $arr=json_decode($row['json']);
                
                # Dump
                var_dump($arr);
                
                # Test
                if ( array_key_exists('firma', $arr) ) {
                   echo "In Datensatz ", $row['id'], " ist firma vorhanden.<br>\n";
                }
                
                

                Ausgaben:

                object(stdClass)#1 (2) {
                  ["firma"]=>
                  int(1)
                  ["strasse"]=>
                  int(1)
                }
                In Datensatz 0 ist firma vorhanden.<br>
                

                Jörg Reinholz

                1. Moin!

                  Noch ein Nachsatz:

                  Aus der Datenhaltung

                  id     sonstwas       json
                  0      foo            {"firma":1,"strasse":1}
                  1      bar            {"strasse":1} 
                  2      tok            {"firma":1}
                  

                  und der Tatsache, dass Du dann doch wissen willst, ob in dem Datensatz die firma drin ist ergibt sich geradezu zwingend, dass es besser und einfacher wäre die Datenhaltung wie folgt umzustellen:

                  id     sonstwas       hasFirma     hasStrasse
                  0      foo            1            1
                  1      bar            0            1
                  2      tok            1            0
                  

                  Dann kannst Du das gleich mit SQL abfragen.

                  SELECT `hasFirma` FROM `tabelle` WHERE `id`=0;
                  

                  Rückgabe: 1

                  SELECT `hasFirma` FROM `tabelle` WHERE `id`=1;
                  

                  Rückgabe: 0

                  SELECT `hasFirma` FROM `tabelle` WHERE `id`=2;
                  

                  Rückgabe: 1

                  oder

                  SELECT `id` FROM `tabelle` WHERE `hasFirma`=1;
                  

                  Rückgabe: 1,3

                  Kein Gefummel, keine Fehler, geringster Aufwand. Und vorbereitet für künftige Erweiterungen der Aufgabe.

                  Jörg Reinholz

                  1. Hallo Jörg,

                    und der Tatsache, dass Du dann doch wissen willst, ob in dem Datensatz die firma drin ist ergibt sich geradezu zwingend, dass es besser und einfacher wäre die Datenhaltung wie folgt umzustellen:

                    id     sonstwas       hasFirma     hasStrasse
                    0      foo            1            1
                    1      bar            0            1
                    2      tok            1            0
                    

                    das würde dann aber wieder bedeuten, dass ich 4 Felder anlegen müsste richtig? Und genau das wollte ich ja die ganze Zeit vermeiden, denn ich weiß jetzt noch nicht wie viele Felder es später wirklich sind.

                    1. Moin!

                      das würde dann aber wieder bedeuten, dass ich 4 Felder anlegen müsste richtig? Und genau das wollte ich ja die ganze Zeit vermeiden, denn ich weiß jetzt noch nicht wie viele Felder es später wirklich sind.

                      Ich sag Dir was: "Scheiß drauf!" Es ist fast immer so, dass man erstmal sehr wenig Zeit einspart und oft genug schon nach weniger als der vermeintlich eingesparten Zeit den zigfachen Aufwand hat um den Pfusch zu reparieren.

                      Fazit: Gleich richtig machen.

                      Jörg Reinholz

                      1. Hallo Jörg,

                        Ich sag Dir was: "Scheiß drauf!" Es ist fast immer so, dass man erstmal sehr wenig Zeit einspart und oft genug schon nach weniger als der vermeintlich eingesparten Zeit den zigfachen Aufwand hat um den Pfusch zu reparieren.

                        also würdest du für jede Option ein eigenes Feld anlegen? Ich hab gerade noch eine andere Idee, dass ich eine zweite Tabelle anlegen mit id, formularID, wert und speichere einfach alles untereinander in diese Tabelle.

                        1. Moin!

                          also würdest du für jede Option ein eigenes Feld anlegen?

                          Jaaaaaaaaaa!

                          Ich hab gerade noch eine andere Idee, dass ich eine zweite Tabelle anlegen mit id, formularID, wert und speichere einfach alles untereinander in diese Tabelle.

                          Auch nicht so prickelnd. Schau Dir den Datentyp "set" an ob das wa sein könnte. Aber auch dann müsstest Du diesen neu definieren wenn ein bis dahin unbekannter Wert hinzukommt. Da dürfte es sehr viel einfacher sein eine weitere Spalte vom typ boolean hinzuzufügen.

                          Jörg Reinholz

                          1. Moin!

                            Man kann sogar seine Tabellen fragen wie die aufgebaut sind:

                            SHOW COLUMNS FROM `angebote`;
                            

                            liefert:

                            +-------------------------+------------+------+-----+---------+----------------+
                            | Field                   | Type       | Null | Key | Default | Extra          |
                            +-------------------------+------------+------+-----+---------+----------------+
                            | id                      | bigint(11) | NO   | PRI | NULL    | auto_increment |
                            | ticket                  | text       | NO   | MUL | NULL    |                |
                            | erstellt                | datetime   | YES  | MUL | NULL    |                |
                            | kunde                   | int(11)    | YES  | MUL | NULL    |                |
                            | ersteller               | int(11)    | YES  | MUL | NULL    |                |
                            | bearbeiter              | int(11)    | NO   |     | NULL    |                |
                            | auftrag_registriert_von | int(11)    | YES  | MUL | NULL    |                |
                            | rabatt                  | int(3)     | NO   | MUL | 0       |                |
                            | land                    | tinytext   | NO   |     | NULL    |                |
                            | lieferadresse           | int(11)    | YES  |     | NULL    |                |
                            | status                  | int(11)    | NO   | MUL | 0       |                |
                            +-------------------------+------------+------+-----+---------+----------------+
                            

                            Aus der Information kann man sogar Formulare bauen - phpmyadmin macht genau das. Treibt man das auf die Spitze, dann ändert man also nur die Datenbank - und der Rest geht ganz von alleine. Ohne dass man das PHP-Script überhaupt anfasst.

                            Jörg Reinholz

                            1. Hallo Jörg,

                              ich verstehe eines nicht, möchte mein Feld so speichern

                              <p>
                              <input type="checkbox" name="wps_strasse" id="wps_strasse" value="1" <?php echo ($wps_strasse == '1'?'checked="checked"':NULL) ?>>
                              <label for="wps_strasse">Straße</label>
                               </p>
                              
                              
                              if(isset($_GET['pdf'])) {
                              			$pdf = $_GET['pdf'];	
                              	}
                              
                              if ($stmt = $mysqli->prepare("Update 
                              				web_pdf_settings SET 
                              					wps_strasse=?
                              				WHERE wps_id=?"))
                              		 {    
                              				$wps_strasse 		= $_POST["wps_strasse"];
                              			
                              			$stmt->bind_param("ss",	
                              			$wps_strasse,
                              			$pdf
                              		);
                              

                              Wenn die die Checkbox nicht anklicke, bekomme ich die oben genannten Meldung. Ich dachte immer bei einer Checkbox wenn die nicht angeklickt ist, ist der Wert 0?

                              1. Hallo,

                                Ich dachte immer bei einer Checkbox wenn die nicht angeklickt ist, ist der Wert 0?

                                das ist ein Irrtum. Eine nicht angeklickte Checkbox übermittelt gar keinen Wert, sie ist in den GET- oder POST-Daten überhaupt nicht vorhanden. Du solltest also vor dem Zugriff erst prüfen, ob dieser Eintrag überhaupt existiert, beispielsweise mit isset().

                                So long,
                                 Martin

                                1. Hallo Der,

                                  Du solltest also vor dem Zugriff erst prüfen, ob dieser Eintrag überhaupt existiert, beispielsweise mit isset().

                                  danke für deine Antwort, also müsste ich es so prüfen?

                                  if(isset($_POST["wps_firma"])) { $wps_firma = $_POST["wps_firma"]; } else { $wps_firma = '';};
                                  

                                  wenn ich diesen Code ausführe, erhalte ich keine Fehlermeldung mehr. Geht das auch irgendwie kürzer?

                                  1. Hi,

                                    danke für deine Antwort, also müsste ich es so prüfen?

                                    if(isset($_POST["wps_firma"])) { $wps_firma = $_POST["wps_firma"]; } else { $wps_firma = '';};
                                    

                                    ja, korrekt.

                                    wenn ich diesen Code ausführe, erhalte ich keine Fehlermeldung mehr. Geht das auch irgendwie kürzer?

                                    Nicht wirklich. In Javascript könnte man das mit dem Oder-Operator eleganter formulieren; in PHP eher nicht. Man kann den ternären Operator (aka Fragezeichen-Operator) verwenden, aber merklich kürzer oder kompakter wird es damit auch nicht mehr:

                                    $wps_firma = (isset($_POST['wps_firma']) ? $_POST['wps_firma'] : '');
                                    

                                    Mir gefällt das besser, weil es auf den ersten Blick zeigt, dass auf jeden Fall irgendeine Zuweisung an $wps_firma stattfindet, aber das ist sicher Geschmackssache.

                                    So long,
                                     Martin

                                2. Tach!

                                  Eine nicht angeklickte Checkbox übermittelt gar keinen Wert, sie ist in den GET- oder POST-Daten überhaupt nicht vorhanden. Du solltest also vor dem Zugriff erst prüfen, ob dieser Eintrag überhaupt existiert, beispielsweise mit isset().

                                  Alternativ kann man ein input type=hidden mit dem value=0 und demselben name wie die Checkbox vor selbigen in den Code schreiben. Dann kommt das Hidden-Input wenn die Checkbock nicht angehakt ist und der Checkbox-Wert beim Haken in den PHP-Arrays $_GET/$_POST an.

                                  dedlfix.

                          2. Hallo Jörg,

                            also würdest du für jede Option ein eigenes Feld anlegen? Jaaaaaaaaaa!

                            ok, dann lege ich jetzt auch die ganzen Feldern an, danke aber für die Geduld und die ausführliche Erklärungen.

            5. Moin!

              Moin!

              Machen wir es also kurz, es geht überhaupt nicht was du mir geschrieben hast

              Nö. Das was Du daraus gemacht hast geht nicht.

                      $eingabe = array ( $_POST['test']);
                      $str = json_decode( $eingabe );
              

              Das reduziere ich mal auf:

                      $str = json_decode( $_POST['test'] );
              

              und frage mich, warum Du JSON dekodierst, wo gar keines sein kann.

              Das hat er von dir, aus DEINEM Quellcode.

              http://forum.selfhtml.org/self/2015/may/21/serialize/1641126#m1641126

              nimm besser $str = json_encode($_POST);

              und bei Bedarf: $ar=json_decode($str);

              $arr = array ( 'firma' => '1', 'strasse' => '1',);
              $str = json_decode( $arr ), "\n\n";
              echo $str, "\n\n";
              

              Ergebnis:

              {"firma":"1","strasse":"1"}
              

              Das Ergebnis kann bei diesem Code nie rauskommen - du hast deinen Code also nicht vorher getestet und den offensichtlichen Fehler nicht bemerkt.

              Grüße Sven

    2. Tach!

      ich möchte mehrere Werte in eine Tabellenspalte schreiben. Dazu habe ich bei php.net die Funktion serialize gefunden.

      nimm besser $str = json_encode($_POST);

      Warum ist das besser? (Abgesehen davon, dass es vermutlich generell nicht die beste Lösung für den Anwendungsfall ist.) serialize/unserialize kann PHP-Strukturen zu 100% wiederherstellen, was JSON prinzipbedingt nicht kann.

      dedlfix.

      1. Moin!

        $str = json_encode($_POST);

        Warum ist das besser?

        Nun ja. Ich hätte schreiben sollen "Im konkreten Fall ist es, wie in vielen anderen auch, vermutlich besser ..."

        Gründe:

        • Geringere Datenmenge
        • ggf. einfacher in JS oder einer anderen Sprache auszuwerten
        • im Hinblick auf die gezeigten Datenstrukturen auch kein Fehler.

        Jörg Reinholz

    3. Moin!

      Den String kannst Du jederzeit zu einem Array machen:

      $arr=json_decode($str);
      

      Der Fehler ist hier, dass json_decode keine Arrays produziert, wenn in JSON-Notation Objekte (sprich: ehemalige PHP-Arrays mit Text-Keys) vorkommen, sondern stdClass-Objekte erzeugt.

      Korrekt muss die Zeile lauten:

      $arr=json_decode($str,true);
      

      Grüße Sven

      1. Tach!

        Den String kannst Du jederzeit zu einem Array machen:

        $arr=json_decode($str);
        

        Der Fehler ist hier, dass json_decode keine Arrays produziert, wenn in JSON-Notation Objekte (sprich: ehemalige PHP-Arrays mit Text-Keys) vorkommen, sondern stdClass-Objekte erzeugt.

        Korrekt muss die Zeile lauten:

        $arr=json_decode($str,true);
        

        Damit klappt das Rückwandeln zwar in diesem Fall, aber so gehen Objekte verloren - Klassenzugehörigkeiten sowieso, das ist in JSON nicht vorgesehen.

        JSON ist ein wunderbares Austauschformat - wenn man was mit einem Browser auszutauschen hat. Für reine PHP-Zwecke ist es jedoch keine gute Wahl.

        dedlfix.