iT邦幫忙

0

while 迴圈裡面需要 query和ajax

我想問大家寫法跟我是不是一樣?
假設我要用迴圈撈資料時

while ($row=mysql_fetch_array($sql)){ 
資料顯示...
}

但假設我需要迴圈資料中的$row[id]去做其他事情
我就得把mysql_query放進while裡面 這樣我才能知道每一筆的$row[id]
像這樣

while ($row=mysql_fetch_array($gettimeline)){
$sql2 = mysql_query("SELECT * FROM `xxx`
WHERE `id` = '".$row['id']."'
");
}

那這樣每一筆資料撈出來之後
他不就會重複每一筆的$sql2查詢?
這樣寫法是對的嗎
以及ajax也是一樣
假設我要刪除某文章 為了取得該文章id我還是得把它放進while迴圈內

while ($row=mysql_fetch_array($gettimeline)){

$sql2 = mysql_query("SELECT * FROM `xxx`
WHERE `id` = '".$row['id']."'
");

<script>
      $("#remove_timeline_<? echo $row['timeline_id'];?>").click(function(){
        $.ajax({
         type: "POST",
         url:"remove?to=<? echo $row['timeline_id'];?>",
         cache: false,
         success: function(){	

         }
        });
       }
      });
      </script>
}

這樣每一筆都會有重複的ajax和query 越多筆一定會越慢吧....
請問大家會怎麼做?

WQ iT邦新手 2 級 ‧ 2016-09-08 11:20:59 檢舉
我個人的習慣會先把"初步的條件($row[id])" 放在陣列之中,再用迴圈去處理呈現!
火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:11:22 檢舉
但是我目前需要有五個query查詢 且都個別需要$rowID的資訊 但每個SELECT的條件也不同 這該怎麼做呢
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
weiclin
iT邦高手 4 級 ‧ 2016-09-08 16:50:38
最佳解答

關於問題 1:

你可以先把所有的 $row['id'] 都紀錄起來,然後在 sql 用 WHERE id IN ('id1', 'id2', ....),這樣就可以讓多個查詢變成只要一個。

建議你可以來這邊學習 sql select 語法: http://www.codedata.com.tw/database/mysql-tutorial-basic-query

關於問題 2:

你其實不需要把每個刪除文章的按鈕都給一個 id,也很少人會給這些相同功能的按鈕都個別寫程式去執行的。我舉個例子:

html

<a class="del_article" href="#" data-article_id="1">刪除文章 1</a>
<br />
<a class="del_article" href="#" data-article_id="2">刪除文章 2</a>
<br />
<a class="del_article" href="#" data-article_id="3">刪除文章 3</a>
<br />
<a class="del_article" href="#" data-article_id="4">刪除文章 4</a>
<br />

js

$(".del_article").click(function(e) {
	let id = e.target.dataset.article_id;
	alert("deleting " + id);
});

Demo: https://jsfiddle.net/mbqkchhu/

這樣子弄,你只要每個 row 改動 data-article_id,就都能用同一段 js 去處理。上面的範例你把 alert 的部份改成你的 ajax 就行了。

看更多先前的回應...收起先前的回應...
火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:08:48 檢舉

謝謝~了解 但因為我的ajax中我除了要傳遞文章id以外 也要傳遞其他的數值 請問這該怎麼添加呢?再加入一個data-然後另外取名就可以了嗎

weiclin iT邦高手 4 級 ‧ 2016-09-09 15:10:04 檢舉

是的

火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:11:53 檢舉

感謝weiclin的幫助~哈哈

火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:12:14 檢舉

只是第一點我可能要好好想一下了 我的邏輯已死

火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:13:50 檢舉

對了關於第二點 是不是一定得用.del_article class的方式 不可使用#del_article id的方式呢?因為id只能一個~

weiclin iT邦高手 4 級 ‧ 2016-09-09 15:20:12 檢舉

有別的用途的話, 你可以另外給它們 id, 但在我給的例子裡用 class 一次解決是最方便的

火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:21:06 檢舉

另外因為假設按下click後 我會找到該按鈕且會讓他disabled 但這樣好像沒辦法個別針對按下去的按鈕做disabled ?

火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:22:06 檢舉

所以說就算給id 一樣可以只有一個js去處理? 我試試看

weiclin iT邦高手 4 級 ‧ 2016-09-09 15:24:37 檢舉

沒那麼麻煩, 看這邊: https://jsfiddle.net/mbqkchhu/1/

火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:34:50 檢舉

他會出現確定刪除undefined?

<button class="n2"
                            data-timeline_id="<? echo $row['timeline_id'];?>" data-userid="<? echo $_SESSION['id'];?>">
                            刪除
                            </button>
$(".n2").click(function(e){
       let timeline_id = e.target.dataset.timeline_id;
       let userid = e.target.dataset.userid;
       if(confirm('刪除'+timeline_id+'?'))
       {.......}
       });
火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:36:29 檢舉

確定data有值

weiclin iT邦高手 4 級 ‧ 2016-09-09 15:43:16 檢舉

你用檢視原始碼看一下輸出的長怎樣吧, 這是我做的測試: https://jsfiddle.net/mbqkchhu/2/

2
海綿寶寶
iT邦大神 1 級 ‧ 2016-09-08 11:19:21

只要回答一個問題就有解答了
問題是:「一筆 $row['id'] 可以對應幾筆 xxx.id」

  1. 一筆
    將 FROM xxx WHERE xxx.id = $row['id'] 「合併」到原本挑出 $gettimeline 的 SQL 中
  2. 很多筆
    那目前寫法就可以了

報告完畢
收工放飯
/images/emoticon/emoticon71.gif

尼克 iT邦大師 1 級 ‧ 2016-09-08 11:48:08 檢舉

/images/emoticon/emoticon32.gif

火爆浪子 iT邦研究生 1 級 ‧ 2016-09-09 15:04:58 檢舉

海綿寶寶 謝謝 但我不太懂第一點的合併 /images/emoticon/emoticon02.gif

因為我沒看到實際 SQL
所以我只能隔空抓藥

假設目前 $gettimeline 的 SQL 是
SELECT id,A,B,C... FROM TA, TB, TC WHERE 這個 AND 那個 AND 什麼
and
$sql2 = mysql_query("SELECT * FROM `xxx` WHERE `id` = '".$row['id']."'

所謂的合併就是

SELECT id,A,B,C...xxx.id FROM TA, TB, TC, xxx WHERE 這個 AND 那個 AND 什麼 AND id = xxx.id

我要發表回答

立即登入回答