POST string mit gleichen namen (Checkboxen) auswerten?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • POST string mit gleichen namen (Checkboxen) auswerten?

    hi!

    wie kann ich einen POST string mit gleichen namen (Checkboxen) auswerten?

    ich weiß das man es normalerweise mit eckigen klammern macht, aber ich erzeuge mit javascript die checkboxen und kann daher keine eckigen klammern mit erzeugen (code nicht gültig).

    Code:
    append("<input type='checkbox' name='Postbox' value='" + ID + "'>");
    d.h. jetzt, mein string (mit jquery serialisitert) sieht so aus:

    ...?Postbox=1&Postbox=293&&Postbox=12&Postbox=889


    usw.

    geht es techn. in php, das ich in der speichern.php den string doch noch auswerten kann und der mit nicht nur den letzten stringwert speichert?

    sonst muß ich wohl in javascript den string umständlicher zusammen basteln.

    also meine frage bezieht sich trotzdem auf php, obwohl ich hier javascript erwähnt habe (denke das ich damit im richtigen forum bin).

    mfg

  • #2
    Ja das geht - auch mit eckigen Klammern. Das hat auch weniger mit PHP, sondern eher etwas mit HTML zu tun. Erkundige Dich bitte über das HTML Element Checkbox (Deine Lösung steht im Abschnitt "Beachten Sie") und den Umgang mit Arrays innerhalb von PHP.

    Dann sollte Dein Problem eigentlich gar kein Problem mehr darstellen.
    Zuletzt geändert von ezkimo; 11.04.2012, 08:29.
    MM Newmedia | MeinBlog

    Kommentar


    • #3
      OffTopic:
      Zitat von ezkimo Beitrag anzeigen
      Das hat auch weniger mit PHP, sondern eher etwas mit HTML zu tun.
      Nein, das hat nur was mit PHP zu tun - andere Sprachen schaffen es durchaus, bei mehreren gleichnamigen Parametern diese nicht zu überschreiben, sondern Zugriff auf alle zur Verfügung zu stellen - auch ohne eckige Klammern …
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Zitat von Gamer20 Beitrag anzeigen
        hi!

        wie kann ich einen POST string mit gleichen namen (Checkboxen) auswerten?

        ich weiß das man es normalerweise mit eckigen klammern macht, ...
        Wie hier schon gesagt wurde: NORMALERWEISE macht man das ohne eckige Klammern. PHP brät sich hier (mal wieder) eine Extrawurst.

        geht es techn. in php, das ich in der speichern.php den string doch noch auswerten kann und der mit nicht nur den letzten stringwert speichert?
        Ja, mit einer Ausnahme (siehe weiter unten).

        sonst muß ich wohl in javascript den string umständlicher zusammen basteln.
        Das wäre auch eine Lösung. So schwer ist das String-Zusammenkleben in JavaScript nun auch wieder nicht.

        Falls doch: PHP stellt "freundlicherweise" per POST hochgeladene Daten per Stream zur Verfügung. Der Pseudopfad dafür heißt 'php://input'. Man kann die Rohdaten von dort mit file_get_contents() einlesen. Danach muss man sie allerdings selbst in die gewünschte Form bringen, also bspw. so wie sie im $_POST-Array "normalerweise" zu finden sind.

        Ein weiterer Knackpunkt ist, dass das Ganze nur funktioniert, wenn keine File-Uploads dabei sind. In dem Fall löscht PHP (aus nicht nachvollziehbaren Gründen) den Input-Stream mit den POST-Daten.

        Hier mal eine ausbaufähige Beispielklasse, die so etwas handhabt. Sie kann statt der POST- auch die GET-Daten verarbeiten. Das erweist sich als praktisch, falls man mal schnell im Browser ein wenig herumtesten möchte:
        PHP-Code:
        class cgi_params
        implements
            
        ArrayAccessIteratorCountable
        {

            
        // clumsy attempt to prevent from HashDOS attacks
            // used in ->split()
            
        const max_items 200;

            
        /// return input as an array 
            
        static function simulate_post() {
                return 
        self::split(self::read());
            }

            
        /// update the given array with the input
            
        static function update_post(
                & 
        $post_array
            
        ) {
                foreach (
        self::split(self::read()) as $name => $param) {
                    
        $post_array[$name] = $param;
                }
                return 
        true;
            }

            function 
        __construct(
                
        $mode self::post
            
        ) {
                
        $this->params $this->split($this->read($mode));
            }

            
        // mode
            
        const get 0;
            const 
        post 1;

            
        /// read raw input data from POST or GET
            /// return str() encoded POST|GET data | null() if an error occured
            
        static function read(
                
        $mode self::post /// ::post|::get
            
        ) {
                if (
        self::post === $mode) {
                    if (
                        isset (
        $_SERVER['CONTENT_TYPE'][0]) &&
                        
        preg_match('/\Amultipart\/form-data/i'$_SERVER['CONTENT_TYPE'])
                    ) {
                        return 
        null;
                    }
                    return 
        file_get_contents('php://input');
                }
                return 
        $_SERVER['QUERY_STRING'];
            }

            
        /// split raw input data into a nice hash
            
        static function split(
                
        $data /// raw input data (from POST or GET)
            
        ) {
                
        $parts preg_split('/[&;]/'$dataself::max_items 1PREG_SPLIT_NO_EMPTY);
                if (
        count($parts) > self::max_items) {
                    
        array_pop($parts);
                }
                
        $hash = array ();
                foreach (
        $parts as $part) {
                    @list (
        $name$value) = preg_split('/=/'$part);
                    
        // note: rawurldecode() does not work, because it ignores '+'-encoded spaces
                    
        $name_decoded urldecode($name);
                    
        // handle multiple entries sharing the same $name; eg: &bla=x&bla=y&bla=z
                    
        if (!isset ($hash[$name_decoded])) {
                        
        $hash[$name_decoded] = array ();
                    }
                    
        $hash[$name_decoded][] = urldecode($value); // add to list
                
        /// end foreach $parts
                
        return $hash;
            }

            
        /// output as string
            
        function __toString() {
                return 
        var_export($this->paramstrue);
            }

            
        /// ArrayAccess:: interface

            
        function offsetExists($offset) {
                return isset (
        $this->params[$offset]);
            }

            function 
        offsetGet($offset) {
                return 
        $this->params[$offset];
            }

            function 
        offsetSet($offset$value) {
                throw new 
        Exception('not yet implemented');
            }

            function 
        offsetUnset($offset) {
                throw new 
        Exception('not yet implemented');
            }

            
        /// Iterator:: interface (for fun)

            
        function rewind() {
                
        reset($this->params);
            }

            function 
        valid() {
                return 
        null !== key($this->params);
            }

            function 
        current() {
                return 
        current($this->params);
            }

            function 
        key() {
                return 
        key($this->params);
            }

            function 
        next() {
                
        next($this->params);
            }

            
        /// Countable:: interface

            
        function count() {
                return 
        count($this->params);
            }

        /// end class 
        Anwenden kann man den POST-Teil auf altmodische prozedurale Art:
        PHP-Code:
        // usage:

        // overwrite $POST
        cgi_params::update_post(
            
        $_POST
        );
        var_dump($_POST);

        // use your own array of parameters

        $my_post_vars cgi_params::simulate_post();
        var_dump($my_post_vars); 
        ... oder man bedient sich der OO-Möglichkeiten (das funktionert mit POST oder GET):

        PHP-Code:
        // OO-style + using Interfaces
        $input = new cgi_params();

        // check if a parameter 'test' exists
        var_dump($input['test']);

        // dump all parameters
        foreach ($input as $name => $param) {
           
        printf('%s$name: %s $param: '"\r\n"$name);
           
        var_dump($param);

        Zuletzt geändert von fireweasel; 13.04.2012, 23:44. Grund: typos (what else)
        Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

        Kommentar


        • #5
          danke für die infos. ich habe das in JS so geklärt:

          Code:
          $(eobj + " input[name='Boxen']:checked").each(function()
          {Kette = Kette + '&Boxen%5B%5D=' + $(this).val();});
          ich denke mal das ist die kürzeste variante!

          Kommentar


          • #6
            Du verwendest doch offenbar ein Framework (vermutl. jQuery) - warum zum Geier bastelst du dir sowas dann selber, anstatt eine vorgefertigte Lösung wie Form.serialize zu verwenden, die dir die Arbeit komplett abnimmt …?
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Zitat von Gamer20 Beitrag anzeigen
              danke für die infos. ich habe das in JS so geklärt:

              Code:
              $(eobj + " input[name='Boxen']:checked").each(function()
              {Kette = Kette + '&Boxen%5B%5D=' + $(this).val();});
              ich denke mal das ist die kürzeste variante!
              Bei deiner Variante hast du auf das URL-Encoding vergessen!

              Aber wie wahsaga schon sagte, warum machst du das überhaupt per Hand?

              Kommentar


              • #8
                weil das mit $(#formblog1).serialize(); nicht geklappt hat. der hatte mir das trotzdem ohne klammern serlialisiert und in php konnte ich es nicht normal als array speichern.

                das ist doch das problem, weshalb ich hier geschrieben habe.

                selbst mit serializeArray(); hat es nicht geklappt, deshalb mußte ich in meinen string irgendwie die eckigen klammern noch mit einbauen.

                Kommentar


                • #9
                  Zitat von Gamer20 Beitrag anzeigen
                  weil das mit $(#formblog1).serialize(); nicht geklappt hat. der hatte mir das trotzdem ohne klammern serlialisiert und in php konnte ich es nicht normal als array speichern.
                  Halt ich für unwahrscheinlich, dass .serialize() deine Klammern entfernt. Bei mir macht es das zumindest nicht.

                  Kommentar


                  • #10
                    Zitat von Gamer20 Beitrag anzeigen
                    weil das mit $(#formblog1).serialize(); nicht geklappt hat. der hatte mir das trotzdem ohne klammern serlialisiert
                    Natürlich müssen die Klammern in den Feldnamen schon enthalten sein, damit serialize sie auch als Parameternamen übernimmt.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar

                    Lädt...
                    X