2012-03-17 3 views
1

PHPで初めてのことで、フォームから送信されたチェックボックスの読み込みに問題があります。それを説明する前に、私はもっと大きなアプリケーションを編集しようとしており、データは他の方法では送信できないと言いたいと思います。それは送信されているものを読む良い方法を見つけることの問題です。PHPの多次元配列(チェックボックス付きのフォームデータ)

通常のテキスト入力が送信されると、フォームは、以下をポストする:

custom[0][type]="text" 
custom[0][name]="VariableName" 
custom[0][value]="VariableName" 

基本的にいくつかの要素(0,1,2,3など)を有する主「カスタム」多次元配列があります各要素は名前と値を持ちます。要素の1つは、チェックボックスであるとき

ただし、以下のものが掲載されます:

custom[1][type]="list" 
custom[1][name]="SelectedOptions" 
custom[1][value]="Value1" 
custom[1][value]="Value3" 
custom[1][value]="Value5" 

は、物事のPHP側への行き方、これは私がによって送信されたデータを読み取るために使用しているコードがありますフォーム。以下のコードは、シナリオ1(テキストベースの入力)では正常に機能しますが、リストタイプのカスタムデータがある場合は1つの値しか読み込みません。

foreach($_POST['custom'] as $item){ 
    if($item['value'] != "") echo $item['name'].'='.$item['value'] 
} 

問題が$アイテム[「値」]だけの値のいずれかを読み込むことで、すべての3はどのように私は、変数内のすべての3つの値を得ることができませんか?それはすべての組み合わせに置くことは非常に簡単なこと...

であることは、おそらく、これは(それがPOSTで送信されるものである(3つのチェックボックスを変数2がチェックされます)

custom[0][name] Variable1 
custom[0][type] text 
custom[0][value] ValueForVariable1 
custom[1][name] Variable2 
custom[1][type] checkbox 
custom[1][value] Value1 
custom[1][value] Value3 
custom[1][value] Value5 

そして、これは何ますprint_rです$ _POST)

[custom] => Array ( [0] => Array ( [value] => ValueForVariable1 [name] => Variable1 [type] => text ) [1] => Array ( [value] => Value1 [name] => Variable2 [type] => checkbox ) 

上記の掲載データの
ショーだけで、我々はすべて同じページに、実際のデータは、より複雑なシステムによって生成されていることを確認することが、私たちは本当にそれを変更することはできません。 POSTで送信されたVariable2の3つの値をすべて読み取る方法を調べることに興味があります。

ありがとうございます!

+1

'print_r($ _ POST)'は何を正確に生成しますか? (ちょうどこのチャンクが大丈夫です) – jcmeloni

+0

あなたの命名を正しく理解していれば、チェックボックスの名前は正しくありません。チェックボックス名はcustom [1] [value] []でなければならないか、最後の値で値を上書きします。 – Rufinus

+0

@jcmeloni - 質問を編集し、print_rデータを追加しました。 – Cornel

答えて

2

編集: あなたが提供して以来の追加情報で、私はもともと問題を誤解していたことがわかります。

PHPスクリプトにデータを送信するフォームを制御できないため、後で同じ名前のチェックボックスを使用して以前のものを上書きしないように変更することはできません。生の投稿データ自体にアクセスして処理することができます。ちょうどGETのクエリ文字列など

$postdata = file_get_contents("php://input"); 
echo $postdata; 

...意志出力POSTDATA:何とか= 1つの&何とか= 2 &何とか= 3(何とか同じ名前何とかで3つのフォームフィールドを示し、最初の二つはなり$ _POSTに上書きされます($ _POST ['blah'] = 3)。 が少し爆発して&になり、問題の変数、あるいは矛盾する変数を探すループや解析が、あなたが行っている場所に移動します。


オリジナル回答:

HTMLフォームのみがチェックされたチェックボックス(またはラジオボタン)を提出します。チェックされていない場合、ブラウザはデータをサーバに返送しません。

これを解決するための主な方法は、あなたがそれのためのバックエンドとテストに探しているものを知ることです(つまり、もし(ISSET($ _ POST [「checkboxname」]))。

本当にあなたの場合すべてのチェックボックス要素を動的に組み込む一般的なバックエンドが必要です。これは過去にこれを解決した方法は、javascriptを使用してページのすべてのフォーム要素を記録し、残りのフォームとともに情報を送信することですそして、私の場合には、も)そのフィールドが変更されたかどうかを提出するかではない。


ここでは、POSTを治療するためのスクリプトの先頭に実行できる機能ですあなたのASPの背景からそれを扱うことを期待する方法:

function post_process() { 
    $rawpostdata = file_get_contents('php://input'); 
    if (!$rawpostdata) return; 
    $fields = explode('&', $rawpostdata); 
    $post = array(); 
    foreach ($fields as $field) { 
     list($key, $val) = explode('=', $field); 
     if (isset($post[$key])) $post[$key] .= ','.$val; 
     else $post[$key] = $val; 
    } 
    $_POST = $post; 
} 
+0

または世界で最も古いトリックを使用していますvalue = "0"(チェックされた値が1の場合)と同じ名前の隠しフィールドを追加して、常にすべてのフィールドを取得します。ラジオ/チェックボックスをオンにすると、0の値が上書きされます。 – Rufinus

+0

@ Jason投稿されたデータには3つの値が表示されています。つまり、3つのチェックボックスがフォームページで選択されています。 – Cornel

+0

私の特定のシナリオで@Rufinus私は、存在するすべてのフィールド(イントラネットデータベースアプリケーション)に隠れフィールドを追加する(または変更する)ことを忘れることなく、常に同じコードにプレミアムを置いていました数十ページに及ぶ)、あなたは正しいですが、より制限のある(そしてより一般的な)アプリケーションでは、より耐えられるかもしれません。 – Jason