PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   POST string mit gleichen namen (Checkboxen) auswerten? (https://www.php-resource.de/forum/php-developer-forum/102845-post-string-mit-gleichen-namen-checkboxen-auswerten.html)

Gamer20 11-04-2012 06:39

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

ezkimo 11-04-2012 08:23

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. ;)

wahsaga 11-04-2012 14:31

OffTopic:
Zitat:

Zitat von ezkimo (Beitrag 660328)
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 …

fireweasel 11-04-2012 22:34

Zitat:

Zitat von Gamer20 (Beitrag 660327)
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. ;)

Zitat:

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).

Zitat:

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);



Gamer20 12-04-2012 06:14

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!

wahsaga 12-04-2012 19:29

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 …?

h3ll 12-04-2012 19:43

Zitat:

Zitat von Gamer20 (Beitrag 660354)
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?

Gamer20 13-04-2012 05:36

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.

h3ll 13-04-2012 08:45

Zitat:

Zitat von Gamer20 (Beitrag 660395)
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.

wahsaga 13-04-2012 12:25

Zitat:

Zitat von Gamer20 (Beitrag 660395)
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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:38 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG