2

TL;DRバージョン

何百ものhtml入力要素を含む大きなフォームがあります。すべての要素名を格納するためにphp配列を作成しました。process.phpファイルを実行すると、ループを使用してその配列を実行し、新しい配列を作成します。その配列のキーは各要素の名前であり、その配列の値は各要素の値です。このコードは、テキストボックス、ラジオボタンの要素値として機能し、ドロップダウン選択は正常に機能することを知っています。チェックボックスには値が配列に入れられていません。代わりに、キーと値は同じもの、つまり要素の名前を読み取ります。$ _POSTが、値ではなく、チェックボックスの名前またはIDを教えてくれるのはなぜですか?

完全な説明/wコードサンプル:

私が抱えている問題は、私の理解からすると、$ _ POSTがどのように機能するかに反するため、私にはかなり珍しいように思われます。

いずれにせよ、私はこの1年間旅行保険のウェブサイトを開発していて、完成に近づいています。クライアントは、ユーザーがアプリケーションを送信した後に表示できるバージョンのフォームを作成することを望んでおり、選択したファイルから値を取得します。

私の問題は、$ _ POSTがチェックボックス要素の値を取得しておらず、名前またはIDを取得していることです(どちらも同じであるため、どちらを取得しているかわかりません)。$ _POSTは、チェックボックスだけでなく、すべてのラジオ、テキスト、およびドロップダウン要素の値を正常に取得しています。

フォームが非常に大きいため、process.phpファイルに非常に大きな配列があります。私が行ったことは、アクセスしたい各要素の名前を持つ配列を作成することです。以下は、配列が従う構造のサンプルです。ここにすべてを投稿するのは非常に大きなものです(400以上の要素がフォームにあります)。

$form_data = array 
('trav_emer_med_insur',
'trav_emer_single',
'trav_emer_single_date_go',
'trav_emer_single_date_ba',
'trav_emer_single_days',

'trav_emer_annual',
'trav_emer_annual_date_go',
'trav_emer_annual_days',

'trav_emer_extend',
'trav_emer_extend_date_go',
'trav_emer_extend_date_ef',
'trav_emer_extend_date_ba',
'trav_emer_extend_days',
);

これは、process.phpで実行され、サーバー上の保護されたフォルダーに保存されるユーザーデータファイルを作成するコードです。

// Create user output data
$out_data = array();
$count = count($form_data); 
for( $i = 0; $i < $count; $i++ ) 
{
    if(empty($_POST[$form_data[$i]])) {
        $out_data[$form_data[$i]] = " ";
        }
    else {
        $out_data[$form_data[$i]] = $_POST[$form_data[$i]];
        }
}

//Set variable names for new file
$dir = "/home/imelnick/public_html/getawayinsured.ca/userdata/";
$timestamp=date("YmdGis");
$name = $out_data['txtApp1Name'];
$value = str_replace(" ", "", $name);
$item = $value . "^" . $timestamp  . ".txt";
$filename = $dir . $item;

//Put data in file
//Open file for writing
$fileHandle = fopen($filename, 'w') or die("Can't open file");

//Write contents of out_data array to file
foreach ($out_data as $key => $value) {
$fileLine = $key . "\t" . $value . "\r\n";
fwrite($fileHandle, $fileLine);
}

//Close file
fclose($fileHandle);

配列内の名前の最初のブロックはチェックボックスに属し、次の形式に従います。

<input type="checkbox" name="trav_emer_med_insur" id="trav_emer_med_insur_if"  value="YES" class="form_elements" onClick="if(this.checked){document.getElementById('trav_emer_med_options').style.display='block';}else{document.getElementById('trav_emer_med_options').style.display='none';}"/>

onClickステートメントは、申請者に追加のオプションを提供する追加のチェックボックスを含むdivを展開します。

フォームデータから作成された出力データ配列には、要素の名前として配列内の各項目のキーがあり、配列内の各項目の値は対応するHTML要素の値です。

配列を分割して$key/ $ valueの組み合わせを書き込むと、の期待値は$_POST[$form_data[0]] (note: $form_data[0] = trav_emer_med_insur)上記のチェックボックスコードの値になりますvalue="YES"。ただし、ファイルの出力は次のようになります。

trav_emer_med_insur trav_emer_med_insur

フォーム上の他の要素の値がファイルに完全に保存されているため、フォーム自体を処理するコードに問題はないと確信しています(ラジオボタン、テキストボックス、ドロップダウンはすべて機能します)。チェックボックスはそうではなく、HTML要素の値を$ _POSTすることを拒否し、単に名前を2回出力し続けます。

たとえば、smoke_ifという名前の上記の配列サンプルにリストされていない形式の別の要素は、申請者が喫煙したかどうかを尋ねるラジオボタンのペアです。これは最近のアプリケーションからの出力例です。

ご覧のとおり、私のコードの望ましい結果が実行されています。

smoked_if no

これは$_POST自体の機能と矛盾するだけでなく、フォーム上の他のすべての要素に問題なく値が投稿されるため、チェックボックス要素と$_POSTに問題があることがわかります。

どんな援助も大歓迎です。

4

3 に答える 3

2

あなたの問題は、チェックボックスがチェックされていないときにチェックボックスが投稿されないという事実に関連していると思います。

この動作を回避する必要がある場合は、チェックされていないチェックボックスを投稿するを参照してください

于 2012-12-11T21:42:13.003 に答える
1

情報が Form タグ内にある限り、サーバーに渡されます。そうは言っても、サーバーに送信されるのはアイテムの名前と値であることを理解する必要があります。

PHP を見ている場合、送信したい文字列は次のようになります

?vehicle=car&vehicle=truck

PHP で投稿する場合、アイデアは同じですが、未熟な目から隠されているだけです。私の例でその値を取得するには:

$vehicle= $_POST["vehicle"];
echo ''.$vehicle;   //shows   ARRAY

foreach( $item in $vehicle){
    echo ''.$item.'\n';   //will iterate through all the vehicle and print them out
}

次のようなことも言えます

if(in_array("car", $vehicle)){
   echo "there exists a car\n";
}
http://php.net/manual/en/function.in-array.php
于 2012-12-11T21:50:06.930 に答える
1

チェックボックスは、チェックされている場合にのみ投稿されるため、回避策が必要です。最も一般的な修正は、チェックボックスと同じ名前で、通常は値として 0 の非表示の入力を使用することだと思います。そして、隠し入力をチェックボックスの前に置くことを忘れないでください:) このようにして、チェックボックスがチェックされていなくても、隠し入力の値を取得します。チェックボックスが選択されている場合、隠しフィールドの値は POST 配列でチェックボックスの値で上書きされます。

于 2012-12-11T22:05:05.823 に答える