1

行数が不明なテーブルがあります。チェックボックスフィールドに編集内容を保存しようとしています。フィールドとテキストフィールドを選択します。

テーブルの行がどのように見えるか(一般化)のサンプルを次に示します。

<tr onMouseover="this.bgColor='#EEEEEE'"onMouseout="this.bgColor='#FFFFFF'">
    <input type="hidden" name="batchupdate[][item1]" value="118">
    <td><a target="blank" href="www.link.com">Link</a></td>
    <td>Name</td>
    <td><input value="" type="text" name="batchupdate[][item2]" size=35></td>
    <td>
        <select name="batchupdate[][item3]">
        <optgroup label="Group 1">
            <option >1</option>
            <option >2</option>
            <option >3</option>
            <option >4</option>
            <option >5</option>
        </optgroup>
        <optgroup label="Group 2">
            <option >6</option>
            <option >7</option>
            <option >8</option>
            <option >9</option>
        </optgroup>
        </select>                           
    </td>
    <td><input type="checkbox" value="FALSE" name="batchupdate[][item4]"></td>
</tr>

「id」(item1)は、私のpostgresqlデータベースの自動インクリメントフィールドです。

これがphpです:

if(isset($_POST['savebutton'])) {
    if(isset($_POST['bachtupdate']) || is_array($_POST['batchupdate']))
    {
        foreach($_POST['batchupdate'] as $i)
        {   
            $item1 = $i['item1'];
            $item2 = $i['item2'];
            $item2 = pg_escape_string($item2);
            $item3 = $i['item3'];

            if(isset($i['item4'])){
                $item4 = "TRUE";
            } else {
                $item4 = "FALSE";
            }

        $query = "UPDATE schema.table SET field2='$item2', field3='$item3', field4='$item4' WHERE id='$item1'";

        $result = pg_query($database, $query);

        if ($result) {
            // success
        } else {
            die("Error: " .pg_last_error());
        }

この後、他のロジックがいくつかありますが、クエリ部分は失敗する場所です。基本的にitem3とid(item1)が空であるため、更新する行が見つからないというエラーが表示されます。アイテム2と4は正常に動作し、postgresによって提供されるエラーメッセージにそれらが何を含んでいるかを確認できます。

私はこのソリューションをオンラインで見つけ、自分の用途に適合させました。一部のフィールドが機能し、他のフィールドが機能しない理由について、私は混乱しています。アイデア?

編集:

これは、エコーを使用した場合の出力の外観です(foreachループ内)。postgresクエリをコメントアウトしました。2回実行することに注意してください。また、チェックボックスがtrueを返さないことに気づきました。しかし、すべての情報がそこにあります...、

118(id)、テキストボックス1、オプション2、FALSE(チェックボックス)

119(id)、テキストボックス2、オプション3

118(id)、テキストボックス1、オプション2、FALSE(チェックボックス)

119(id)、テキストボックス2、オプション3

編集:

次に、次のいずれかを試してみます。

  1. phpを使用して、一意の名前属性(、、、など)を作成しitem11、テーブル内の行数をカウントするループをインクリメントし、変数を変更してクエリを実行します。これは面倒すぎるようですが、他に何も考えられません...、item12item13for

  2. を実行する代わりに、私が見つけた他の例に見られるforeachようにループを実行します。for何が変わるかはわかりませんが、一見の価値があると思います。

見つけたものを報告します。

4

1 に答える 1

0

表示するHTMLはどの程度一般化されていますか?

つまり、あなたが書くとき

 <input type="hidden" name="batchupdate[][item1]" value="118">

batchupdateの最初のキーに何かを配置しますか?

それ以外の場合、POSTは送信されます。

batchupdate[][item1]=118&batchupdate[][item3]=124...

[]は自動インクリメント構文であるため、batchupdate []に​​2つの異なる行が作成されます。1つはitem1で、もう1つはitem3のみです。

行の各「グループ」には、最初のインデックスとして異なるIDが必要です。

 <input type="hidden" name="batchupdate[row1][item1]" value="118">
 <input type="hidden" name="batchupdate[row1][item2]" value="119">
 <input type="hidden" name="batchupdate[row1][item3]" value="120">
 ...
 <input type="hidden" name="batchupdate[row2][item1]" value="123">

これにより、item1、2、および3が定義され、118、119、および120に等しいbatchupdateのエントリが1つ作成されます。これは、探しているもののようです。

于 2012-07-09T00:08:42.547 に答える