iT邦幫忙

0

如何記憶 array 當有分頁的時候?資料比對?

假設現在取出的資料有六十筆
每一個品項都有一個,當勾了 checkbox 後表示我要選中這個品項
稍微示意一下

<input type="checkbox">
<input name="store[]" value="1">
<input name="store[]" value="2">
<input name="store[]" value="3">
<input name="store[]" value="4">....

假設勾選後我會把 store[] 賦值
所以當後端接收時會這樣

foreach ($_POST['store'] as $key => $val) {
    ...
}

我就會根據 store array 裡面有的東西去 INSERT INTO 表示你選中這些
但如果當我某一個品項不選了呢 我要怎麼知道?
我現在的做法是 INSERT INTO 之前會先將所有有關的 store 清除
再重新 INSERT INTO 一次,就表示你最新要的就是這些

現在遇到一個問題是
資料現在可能有一百筆,於是需要做分頁,分頁事小
但我假設在第一頁也勾了我要勾的按送出(此時正常)
但是當我到第二頁勾好後送出,就會把其他頁的 store 資訊刪除
因為上面那步驟是我 INSERT INTO 前會先清除所有相關 store
所以我很好奇怎麼做才能解決這個問題?
解法可能是需要用比對的?那是怎麼個比對法呢

看更多先前的討論...收起先前的討論...
淺水員 iT邦大師 6 級 ‧ 2019-05-27 13:39:35 檢舉
如果有分頁的依據,例如照 key 的大小分頁,那麼找出 key 的最大最小值,只刪掉這個區間的資料再INSERT即可。(如果有其他依據就按照其他依據刪除舊資料)
另外可能的話也可以在前端就處理好這些資料,再一次送給後端。
weiclin iT邦高手 4 級 ‧ 2019-05-27 13:40:25 檢舉
checkbox 取消勾選時 ajax 通知後端
火爆浪子 iT邦研究生 1 級 ‧ 2019-05-27 14:06:08 檢舉
請問「在前端就處理好這些資料,再一次送給後端」會怎麼實現法?
WQ iT邦新手 2 級 ‧ 2019-05-27 14:06:10 檢舉
用weiclin的方式比較即時性,但....會不會發生資料交易頻度提高,這就因需求而異了~
火爆浪子 iT邦研究生 1 級 ‧ 2019-05-27 14:07:49 檢舉
確實直接用 ajax 好像比較好?直接記憶也不需要保存按鈕
火爆浪子 iT邦研究生 1 級 ‧ 2019-05-27 14:25:42 檢舉
淺水員 能怎麼找出這一頁最大的 storeID跟最小的 storeID呢
我的分頁是這樣運行

算出這個表總共多少筆
```
$page_res = mysqli_fetch_array($pdo->query(
"SELECT XXX "
));
```

```
$page_size = 20;
$page = $_GET['page'] == '' ? 1 : $_GET['page'];
$page_num = ceil($page_res['num'] / $page_size);
$offset = ($page - 1) * $page_size;
```

```
$productList = $pdo->query(
"SELECT ...
LIMIT $offset, $page_size "
);
```
火爆浪子 iT邦研究生 1 級 ‧ 2019-05-27 14:27:32 檢舉
所以第一頁會是 LIMIT 0, 20
weiclin iT邦高手 4 級 ‧ 2019-05-27 14:35:06 檢舉
不用 ajax 也是可以的, checkbox 的勾選或取消可以先記在 cookie 或 local storage, 按送出時一併附上新增了什麼取消了什麼即可
淺水員 iT邦大師 6 級 ‧ 2019-05-27 15:20:17 檢舉
"SELECT ...
ORDER BY storageId
LIMIT $offset, $page_size "
取最頭最尾的 storageId
用 <input type="hidden" > 就可以傳回來了?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
WQ
iT邦新手 2 級 ‧ 2019-05-27 13:30:55
最佳解答

個人的寫法是判斷 if ($val<>''){它有沒有值,來判斷要不要寫入變數,後續再跟資料庫進行交易。

foreach ($_POST['store'] as $key => $val) {
    if ($val<>''){
        if ($str=='') {$str=$val;}
        else {$str = $str."','".$val;}
    }
}
$str = "'".$str."'";

然後一次性跟資料庫比對那些是新增的,那些是要刪除的。

if ($str <>"''" ){
    //增加
    $l_sql = "....";<--找出原本有,這次要增加的  
    while(...){
        一筆一筆加;
    }	
    //減少
    $l_sql="...";<--找出原本有,這次要減少的   
    while(...){
        一筆一筆刪;
    }
}
1

你第一個程式碼怪怪的。正常因該是如下才對

<input type="checkbox" name="store[]" value="1" />
<input type="checkbox" name="store[]" value="2" />
<input type="checkbox" name="store[]" value="3" />
<input type="checkbox" name="store[]" value="4" />

這邊要先了解一下checkbos的特性。一但沒有任意值被選擇的情況下,正常是不會有該post值的。
所以要判斷有無值可以用

if(isset($_POST['store']))

這樣就可以處理了。

再來就是參數,你可以用session記錄下來。這樣就不用擔心參數無法傳送的問題

不明
【**此則訊息已被站方移除**】

我要發表回答

立即登入回答