1

データベースからデータを取得し、それを行に出力して、ユーザーが必要なアイテムを確認できるようにするPHPフォームがあります。保存時には、最後のオプションのみが$_POSTに送信されます。これが私のコードです:

global $dbc; 

$afQuery = "SELECT fid, facility_name, city, state, country, phone from facilities 
            WHERE uid = '123'
            AND fid != '456'
            GROUP BY fid;";
        $afResult = $dbc->query($afQuery,__FILE__,__LINE__);
        $i = 0;
        while ($affiliated = $dbc->fetch($afResult)) {      
            ++$i;
            echo '<div class="action" style="float:left;">';
                echo '<input type="checkbox" name="affiliated[afid]" id="afid" value="'.$affiliated->fid.'">';
            echo '</div>';
            echo '<div class="facility-name">';
                echo '<input type="hidden" id="facility-name '.$i.'" name="affiliated[facility_name]" value="'.$affiliated->facility_name.'" />';
                echo $affiliated->facility_name;
            echo '</div>';
            echo '<div class="facility-location">';
                echo '<input type="hidden" id="facility-location '.$i.'" name="affiliated[facility_location]" value="'.$affiliates->city. ', ' . $affiliated->state . ' ' . $affiliated->country.'" />';
                echo $affiliated->city. ', ' . $affiliated->state . ' ' . $affiliated->country;
            echo '</div>';
            echo '<div class="facility-phone">';
                echo '<input type="hidden" id="facility-phone '.$i.'" name="affiliated[facility_phone]" value="'.$affiliated->phone.'" />';
                echo $affiliated->phone;
            echo '</div>';
            echo '<div class="clear"></div>';
            echo '<input type="hidden" id="update" name="update" value="' . $affiliated->fid . '" />';
        }

$dbc->fetchと同等mysql_fetch_assocです。

これらの値を配列に保存しようとしていますが$affiliated、選択したアイテムごとにサブ配列が必要なので、データベースの各値を別々の行に格納できます。どこにありませんか?whileループ内でforeachを試しましたが、どこにも行きませんでした。

ご協力いただきありがとうございます!

* アップデート *

私は@Pinetreeの提案に従い$i、次のように追加しました。

<input type="checkbox" name="affiliated[afid]['.$i.']" id="afid" value="'.$affiliated->fid.'">

ただし、次の出力が表示されます。

Array
(
    [afid] => Array
        (
            [1] => 5289
            [2] => 5290
            [3] => 5291
            [4] => 5292
        )

    [facility_name] => Array
        (
            [1] => Test Company
            [2] => Test Company 2
            [3] => Test Company 3
            [4] => Test Company 4
        )

    [facility_location] => Array
        (
            [1] => Address, State US
            [2] => Address, State US
            [3] => Address, State US
            [4] => Address, State US
        )

    [facility_phone] => Array
        (
            [1] => 555-555-5555
            [2] => 555-555-5555
            [3] => 555-555-5555
            [4] => 555-555-555
        )

)

データベースのテーブルに各完全な行を挿入できるように、代わりに次のようにする必要があります。

Array
    (
        [0] => Array
            (
                [afid] => 5289
                [facility_name] => Test Company
                [facility_location] => Address, ST USA
                [facility_phone] => 555-555-5555
            )

    [1] => Array
        (
            [afid] => 5290
            [facility_name] => Test Company 1
            [facility_location] => Address, ST USA
            [facility_phone] => 555-555-5555
        )
)

提案?

4

2 に答える 2

3

私が正しく理解していれば、入力の複数の行をエコーし​​ています。その場合は、各行の入力に同じ名前を使用しています。投稿が発生すると、最後の値のみが取得されます。各入力名に別の「[]」を追加できます。

'<input name="affiliated[afid][]"/>'

またはそれに$iを入れます:

'<input name="affiliated[afid]['.$i.']"/>'

投稿では、次のようになります。

affiliated
    afid
        1: val
        2: val
        3: val
        ...
    facility_name
        1: val
        2: val
        3: val
        ...
    ...

整数は元の形式の行に対応します。したがって、afid[1]とfacility_name[1]は、フォーム(およびテーブル)の同じ行からのものです。

編集:配列を元の形式に戻すには:

$affiliated = array();
foreach($_POST['affiliated']['afid'] as $k => $v) {
    $affiliated[] = array(
        'afid' => $v,
        'facility_name' => $_POST['affiliated']['facility_name'][$k] // same key here
         // other fields
    );
}

重要な編集

チェックボックスがあるので、入力名にインデックスを明示的に設定してください。

'<input name="affiliated[afid]['.$i.']"/>'

チェックボックスがチェックされていない場合、およびテキストフィールドなどが投稿されていないため、たとえば、2番目のPOSTEDチェックボックス(0から始まる場合はインデックス1)が$_POSTの2番目の行にマップされるという状況になる可能性があります。ただし、チェックボックスは実際にはフォーム自体の3行目または4行目にあり、その前のチェックボックスは投稿されていませんでした。

于 2012-08-14T21:34:11.870 に答える
1

$affiliatedは配列ではなく、オブジェクトであり、ループを通過するたびに(再)設定します。

while ($affiliated = $dbc->fetch($afResult)){...}

また、input一般に、DOM要素IDには、生成しているスペースを含めることはできません。

echo '<input type="hidden" id="facility-name '.$i.'"
于 2012-08-14T21:27:09.973 に答える