-1

皆さんおはよう、

データベースに一度に複数の行を追加するために使用しているフォームがあります。チェックボックスを除いて、すべて正常に機能しているようです。フォーム行ごとに1つのチェックボックスがあります。チェックボックスがオンになっている順序に関係なく、結果は送信後に常に同じ順序で返されます。

重要なフォームの主要部分は次のとおりです。

<tr>
<td class='border'>
<input type='text' name='rowid[]' value='".$row."' style='display:none;' />
<input type='text' name='ref[]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='obs[]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='act[]' style='width:100%;' />
</td>
<td class='border' align='center'>
<input type='checkbox' name='comp[]' value='Yes' />
</td>
<td class='border'>
<input type='text' name='compby[]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='compdate[]' id='completeddate".$row."' class='completeddate' style='width:100%;' />
</td>
</tr>

このフォームが送信され、私のPHPコードがそれを処理します。最初の入力は、フォームの行のIDであることがわかります。これは非表示のフィールドであり、フォームに表示される行ごとに値が1ずつ増加します。

フォームが送信されたら、以下のPHPを使用して、各行を1つずつ処理します。

foreach($_POST['rowid'] as $key=>$rowid) {

これは基本的に、ROWIDの場合、次のROWIDに到達するまで、残りの入力が関連付けられていることを示しているはずです。

私がそれから印刷するとしたら

echo $_POST['ref'][$key];

最初の行の参照を取得し、ループが完了して再度印刷すると、2番目の行の参照を取得します。

しかし、私が置くとしたら

echo $_POST['comp'][$key];

次に、これが壊れます。

たとえば、各行について、チェックボックスを次の順序でチェックしたとします。

row 1, tick, row 2, untick, row 3, tick

次に、ループにすべてのチェックボックス値を出力させると、次のように表示されます。

'Yes', 'Yes', ''

しかし、それはこの順序でなければなりません

'Yes', '', 'Yes'

これは、チェックボックスが通常の配列であるためですか。次に、comp []という名前を付けて、これを別の配列に入れますか?

とにかくこの問題を回避することはできますか、それとも、1つは「はい」、もう1つは「いいえ」のラジオボタンを使用したほうがよいでしょうか。

どうもありがとう

エド

4

2 に答える 2

1

配列インデックスに添え字を付けてみてください。comp[]つまり、に変更することで、どの行に属するかを明示的にしcomp[$row]ます。重要なのは、チェックされていないボックスは送信されないため、すべてのボックスがチェックされていないcomp[]場合、リクエストには2つの要素しかなく、それらがどの行に属しているかがわかりません。

$_POST['comp'][$key]ところで、その最後の(存在しない)にアクセスするときに警告が表示されるはず$keyです。そうでない場合は、すべての警告を有効にします。警告は一般的に非常に便利です。

于 2012-09-19T10:30:30.590 に答える
1

フォームに技術的な隠しフィールドを作成する適切な方法は、hiddenタイプを使用することです。とにかく、ここではこのフィールドは必要ありません。代わりに、$rowすべてのフィールドで使用して、それらを適切に識別します。

<tr>
<td class='border'>
<input type='text' name='ref[<?php echo $row; ?>]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='obs[<?php echo $row; ?>]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='act[<?php echo $row; ?>]' style='width:100%;' />
</td>
<td class='border' align='center'>
<input type='checkbox' name='comp[<?php echo $row; ?>]' value='Yes' />
</td>
<td class='border'>
<input type='text' name='compby[<?php echo $row; ?>]' style='width:100%;' />
</td>
<td class='border'>
<input type='text' name='compdate[<?php echo $row; ?>]' id='completeddate<?php echo $row; ?>' class='completeddate' style='width:100%;' />
</td>
</tr>

ループを変更します(rowidフィールドはもう存在しません)。空の場合でも送信されるため、任意のフィールドをループできますtext(チェックボックスのフィールドとは異なり、チェックされている場合にのみ送信されます)。

foreach($_POST['ref'] as $key => $rowid) {

PHPコードを確認してください。更新するものが他にもある可能性があります。

于 2012-09-19T10:37:42.620 に答える