:::

8-1 update() 更新資料的物件方法

  1. 上單元的表單界面送出後,會執行流程的 submission_update,會執行的物件方法是:Submission::update(),其預設內容如下:
    //更新 submission 某一筆資料 Submission::update()
    public static function update($where_arr = [], $data_arr = [])
    {
        global $xoopsDB, $xoopsUser;
        Tools::chk_is_adm('', '', __FILE__, __LINE__);
    
        $and = Tools::get_and_where($where_arr);
    
        if (!empty($data_arr)) {
            $col_arr = [];
    
            foreach ($data_arr as $key => $value) {
                $value     = Tools::filter($key, $value, 'write', self::$filter_arr);
                $col_arr[] = "`$key` = '{$value}'";
            }
            $update_cols = implode(', ', $col_arr);
            $sql         = "UPDATE `" . $xoopsDB->prefix("submission") . "` SET
            $update_cols WHERE 1 $and";
        } else {
            //XOOPS表單安全檢查
            Utility::xoops_security_check(__FILE__, __LINE__);
    
            foreach ($_POST as $key => $value) {
                $$key = Tools::filter($key, $value, 'write', self::$filter_arr);
            }
    
            //取得使用者編號
            $uid         = ($xoopsUser) ? $xoopsUser->uid() : 0;
            $create_time = date("Y-m-d H:i:s", xoops_getUserTimestamp(time()));
    
            $sql = "UPDATE `" . $xoopsDB->prefix("submission") . "` SET
            `title` = '{$title}',
            `content` = '{$content}',
            `start` = '{$start}',
            `end` = '{$end}',
            `info` = '{$info}',
            `uid` = '{$uid}',
            `create_time` = '{$create_time}'
            WHERE 1 $and";
        }
        $xoopsDB->queryF($sql) or Utility::web_error($sql);
    
    
        if($where_arr['id']) {
            $TadUpFiles = new TadUpFiles("submission");
            $TadUpFiles->set_col("submission_id", $where_arr['id']);
            //$TadUpFiles->set_dir('subdir', "");
            $TadUpFiles->upload_file('submission_files', '', '', '', '', true, false);
        }
    
        return $where_arr['id'];
    }
  2. 會傳入兩個資料陣列 $where_arr 以及 $data_arr
  3. 一樣先用 Tools::chk_is_adm() 檢查權限,若是有傳入 $where_arr ,則用 Tools::get_and_where($where_arr) 來產生SQL的篩選語法,以便找出要更新哪些資料。
    Tools::chk_is_adm('', '', __FILE__, __LINE__);
    
    $and = Tools::get_and_where($where_arr);
  4. 檢查有無傳入資料陣列,然後執行之
    if (!empty($data_arr)) {
        //有傳入$data_arr,產生更新指定欄位的sql語法
    } else {
        //沒傳入$data_arr,產生更新所有表單欄位的sql語法
    }
    $xoopsDB->queryF($sql) or Utility::web_error($sql);
  5. 若是有傳入資料陣列 $data_arr,那就用  Utility::xoops_security_check() 檢查 token 後,將 $_POST 做為資料陣列 $data_arr 以便後續處理
  6. 若是有傳入資料陣列 $data_arr,那就根據篩選條件,只更新 $data_arr 中指定的欄位值,這部份不用改。
    $col_arr = [];
    
    foreach ($data_arr as $key => $value) {
        $value     = Tools::filter($key, $value, 'write', self::$filter_arr);
        $col_arr[] = "`$key` = '{$value}'";
    }
    $update_cols = implode(', ', $col_arr);
    $sql         = "UPDATE `" . $xoopsDB->prefix("submission") . "` SET
    $update_cols WHERE 1 $and";
  7. 若是沒有傳入資料陣列 $data_arr,那就檢查表單後,依序提取由表單送過來的內容,過濾後,全都更新之。其中若需要字東抓取某些值,例如目前登入者的編號 $uid,或者目前的建立時間,可以在過濾後,自行補上。
    //XOOPS表單安全檢查
    Utility::xoops_security_check(__FILE__, __LINE__);
    
    foreach ($_POST as $key => $value) {
        $$key = Tools::filter($key, $value, 'write', self::$filter_arr);
    }
    
    //取得使用者編號
    $uid         = ($xoopsUser) ? $xoopsUser->uid() : 0;
    //$create_time = date("Y-m-d H:i:s", xoops_getUserTimestamp(time()));
    
    $sql = "UPDATE `" . $xoopsDB->prefix("submission") . "` SET
    `title` = '{$title}',
    `content` = '{$content}',
    `start` = '{$start}',
    `end` = '{$end}',
    `info` = '{$info}',
    `uid` = '{$uid}',
    `create_time` = '{$create_time}'
    WHERE 1 $and";

    $create_time 可以註解掉,避免建立時間被修改成當下時間

  8. 更新後,就可以開始處理上傳檔案的部份,TadUpFiles 詳細用法可以看這裡
    if ($where_arr['id']) {
        $TadUpFiles = new TadUpFiles("submission");
        $TadUpFiles->set_col("submission_id", $where_arr['id']);
        //$TadUpFiles->set_dir('subdir', "");
        $TadUpFiles->upload_file('submission_files', '', '', '', '', true, false);
    }

    set_col()set_dir() 的參數及值務必和 store() 中的設定一致

  9. 最後,請試試修改是否有作用


:::

書籍目錄

展開 | 闔起

快速登入


https%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D2079%26tbsn%3D56

計數器

今天: 810810810
昨天: 1856185618561856
總計: 8776734877673487767348776734877673487767348776734