我想問大家寫法跟我是不是一樣?
假設我要用迴圈撈資料時
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 越多筆一定會越慢吧....
請問大家會怎麼做?
關於問題 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 就行了。
謝謝~了解 但因為我的ajax中我除了要傳遞文章id以外 也要傳遞其他的數值 請問這該怎麼添加呢?再加入一個data-然後另外取名就可以了嗎
是的
感謝weiclin的幫助~哈哈
只是第一點我可能要好好想一下了 我的邏輯已死
對了關於第二點 是不是一定得用.del_article class的方式 不可使用#del_article id的方式呢?因為id只能一個~
有別的用途的話, 你可以另外給它們 id, 但在我給的例子裡用 class 一次解決是最方便的
另外因為假設按下click後 我會找到該按鈕且會讓他disabled 但這樣好像沒辦法個別針對按下去的按鈕做disabled ?
所以說就算給id 一樣可以只有一個js去處理? 我試試看
沒那麼麻煩, 看這邊: https://jsfiddle.net/mbqkchhu/1/
他會出現確定刪除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+'?'))
{.......}
});
確定data有值
你用檢視原始碼看一下輸出的長怎樣吧, 這是我做的測試: https://jsfiddle.net/mbqkchhu/2/
只要回答一個問題就有解答了
問題是:「一筆 $row['id'] 可以對應幾筆 xxx.id」
報告完畢
收工放飯