0

Webフォームのチェックボックスを使用してギャラリーから画像を選択し、ファイルシステムとデータベースから画像を削除できる管理ページを設定しようとしています。私が抱えている問題は、データベースを更新する方法です。

モデルでわかるように、現在、各ファイルが削除された後にデータベースを更新しています。削除される前の10枚の画像の後に画像23が終了するため、削除された数のカウントを保持し、それを「古い」注文番号から差し引くだけですアップは画像 23-10 = 13) です。これが機能しないいくつかのブレークケースがあるかどうかはわかりません。

うまくいっているようですが、ギャラリーにたくさんの写真がある場合、データベースの注文 ID が 35 以降に更新されないことに気付きました。時間の?すべての注文IDを保存して一度に更新する方法はありますか、それともデータベースに接続するたびに正しい方法がありますか(それは悪い習慣のように思えるので疑問です)?

ウェブフォーム:

<form action="http://localhost/admin/galleryRemove" method="post" enctype="multipart/form-data">
    <input type="checkbox" name="orderID[]" value="1"  />
    <img src="http://localhost/img/galleries/001/img01.jpg" alt="1" class="imgCheck" />

    <input type="checkbox" name="orderID[]" value="2"  />
    <img src="http://localhost/img/galleries/001/img02.jpg" alt="2" class="imgCheck" />

    <input type="checkbox" name="orderID[]" value="3"  />
    <img src="http://localhost/img/galleries/001/img03.jpg" alt="3" class="imgCheck" />

    <input type="checkbox" name="orderID[]" value="4"  />
    <img src="http://localhost/img/galleries/001/img04.jpg" alt="4" class="imgCheck" />

    <input type="checkbox" name="orderID[]" value="5"  />
    <img src="http://localhost/img/galleries/001/img05.jpg" alt="5" class="imgCheck" />

    <input type="checkbox" name="orderID[]" value="6"  />
    <img src="http://localhost/img/galleries/001/img06.jpg" alt="6" class="imgCheck" />

    <input type="checkbox" name="orderID[]" value="7"  />
    <img src="http://localhost/img/galleries/001/img07.jpg" alt="7" class="imgCheck" />

    <input type="checkbox" name="orderID[]" value="8"  />
    <img src="http://localhost/img/galleries/001/img08.jpg" alt="8" class="imgCheck" />

    <input type="checkbox" name="orderID[]" value="9"  />
    <img src="http://localhost/img/galleries/001/img09.jpg" alt="9" class="imgCheck" />

    <input type="checkbox" name="orderID[]" value="10"  />
    <img src="http://localhost/img/galleries/001/img10.jpg" alt="10" class="imgCheck" />

    <input type="hidden" name="galleryID" value="1" />
    <input type="submit" name="remove" value="Remove"  /> This will remove all images checked.
</form>

フォーム投稿を処理するための CI モデル。

// Start of removing an image functions
    function imgRemove()
    {
        $cnt = 0;
        $id = $this->input->post('galleryID');
        foreach ($_POST['orderID'] as $order)
        {                
            $order = $order - $cnt;
            // get the picture name
            $this->db->select('*');
            $this->db->where("gallery_id = '$id'");
            $this->db->where("`order` = '$order'");
            $this->db->from('gallery');
            $q = $this->db->get();
            if ($q->num_rows != 0)
            {
                $result = $q->result();
                $picture = $result[0]->picture;

                // Get the path and then unlink(delete) the file and it's thumbnail
                $imgPath = $this->imgPath($id);
                $img =  $imgPath . $picture;
                $thumbImg =  $imgPath . 'thumbs/thumb' . $picture;
                if (file_exists($img))
                {
                    unlink($img);
                }
                if (file_exists($thumbImg))
                {
                    unlink($thumbImg);
                }

                // Remove the line from the database
                $this->db->where('gallery_id', $id);
                $this->db->where('order', $order);
                $this->db->delete('gallery');
                // Reorder all images after the deleted one.
                $this->imgOrderCheckRemove($id, $order);
                $cnt++;
            }
        }
    }

データベース テーブルのレイアウト:
ここに画像の説明を入力

var_dump($images); の結果 update_batch の直前。

array(3) {
    [2]=>
    array(5) {
        ["prim_id"]=>
        string(1) "8"
        ["gallery_id"]=>
        string(1) "2"
        ["picture"]=>
        string(21) "002.jpg"
        ["order"]=>
        string(1) "2"
        ["alt_text"]=>
        string(1) "2"
    }
    [10]=>
    array(5) {
        ["prim_id"]=>
        string(2) "16"
        ["gallery_id"]=>
        string(1) "2"
        ["picture"]=>
        string(18) "010.jpg"
        ["order"]=>
        string(2) "10"
        ["alt_text"]=>
        string(2) "10"
    }
    [13]=>
    array(5) {
        ["prim_id"]=>
        string(2) "19"
        ["gallery_id"]=>
        string(1) "2"
        ["picture"]=>
        string(15) "013.jpg"
        ["order"]=>
        string(2) "13"
        ["alt_text"]=>
        string(2) "13"
    }
}
4

1 に答える 1

2

ほら何か。これはほぼオンザフライで書いたので、何かを見逃しているかもしれませんが、問題なく動作するはずです。

function imgRemove()
    {
        $id = $this->input->post('galleryID');
        $imgPath = $this->imgPath($id);

        $this->db->where('gallery_id', $id);
        $result = $this->db-get('gallery');
        $tempArray = $result->result_array();

        // reindex $tempArray for more less processing next loop
        foreach($tempArray as $img)
            $images[$img['order']] = $img;

        foreach ($_POST['orderID'] as $order)
        {
            $removethese[] = $order;
            if( isset($images[$order]) ) {
                $unlinkthese[] = $imgPath . $images[$order]['picture'];
                $unlinkthese[] = $imgPath . 'thumbs/thumb' . $images[$order]['picture'];

            }
            // lets keep $images clear, it should contain only images that will exists after cleanup
            unset($images[$order]);

        }
        // now lets remove files
        foreach($unlinkthese as $unlink )
            unlink ($unlink);

        // and then remove them from database
        $this->db->query("DELETE * FROM gallery where order IN (" . implode(',',$removethese) . " AND gallery_id=$id";

        // now lets do some re-ordering. We want to use CIs update_batch to make complex IF WHEN query

        for( $i = 1; $i <= count($images); $i++ )
            $images['order'] = $i;

        $this->db->update_batch('gallery', $images, 'prim_id'); 

    }
于 2012-09-15T09:27:47.577 に答える