台灣最大程式設計社群網站
線上人數
426
 
會員總數:246037
討論主題:189624
歡迎您免費加入會員
討論區列表 >> PHP >> 找出符合條件的筆數並刪除
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
找出符合條件的筆數並刪除
價值 : 10 QP  點閱數:715 回應數:14
樓主

mypetertw
門外漢
0 97
925 145
發送站內信

$del_sql = "select * from `test` WHERE `visit` <= '10' ";
$delresult = mysql_query($del_sql,$link) or die(mysql_error());
$delrow=mysql_fetch_array($delresult);

if ($delrow['visit'] <=10)
{
$sql = "DELETE FROM `test` WHERE `visit` <= '10' ";
mysql_query($sql)or die ("error".mysql_error());
}

我想讓他找test table上所有visit低於10的筆數並直接刪除
但我現在遇到一個問題
假設資料庫中第一筆不是低於10的話
就算下面有多少筆低於10的筆數他完全不會刪...除非要把第一筆的VISIT改成低於10
下面的才會跟著刪除
是哪裡寫錯了?

搜尋相關Tags的文章: [ 找出符合條件的筆數並刪除 ] ,
本篇文章發表於2016-01-27 22:25
1樓
作者回應

mypetertw
檢舉此回應
本篇文章回覆於2016-01-27 22:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

皮皮快跑
檢舉此回應
第一個:你那個if的條件式是多餘的,因為delete本身就有條件了。
第二個:你這樣是比對字串而不是數值吧!
這樣一來9 不會小於 10
而且你有確定你的欄位形態是INT嗎?
本篇文章回覆於2016-01-27 22:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
我記得在sql裡面的單引號表示字串吧...visit的型態是字串還是數字?
本篇文章回覆於2016-01-28 09:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

彩虹
檢舉此回應
上面兩位大大(皮皮、Daimom ),你們著重的地方錯誤了

$del_sql = "select * from `test` WHERE `visit` <= '10' ";
$delresult = mysql_query($del_sql,$link) or die(mysql_error());
$delrow=mysql_fetch_array($delresult);
此時$delrow裡面已經是陣列數組資料了,所以當然不能直接以$delrow['visit']來使用
if ($delrow['visit'] <=10) //一直都沒有進入此判斷
{
$sql = "DELETE FROM `test` WHERE `visit` <= '10' ";
mysql_query($sql)or die ("error".mysql_error());
}


請參考
本篇文章回覆於2016-01-28 09:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

彩虹
檢舉此回應
本篇文章回覆於2016-01-28 09:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
不錯的參考

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
整理一下好了@@"真傷腦筋

先不考量邏輯設計的問題,單針對你寫的程式的問題來做討論。

首先,你知道mysql_fetch_array是在做什麼嗎??
它是取得目前指標的記錄數並轉成陣列輸出的意思。取完後,將指標再指向下一筆。

也就是說,你的程式 $delrow=mysql_fetch_array($delresult);
這堛熒N思,因為之前還未取得。所以理所當然的就是取第一筆資料為陣列並做判斷。
這就是為何~~~你第一筆資料如果超過10就不會運行的問題。
因為你只拿第一筆當判斷啊~~~~

再來就是字串判斷跟數值判斷的問題了。
要知道一件事。字串的判斷,短位元會比長位元大。
也就是說。依字串比較來說。'1' > '10'
所以在判斷上要很小心的下條件。
==================================================================
再來就是針對你要的東西。基本上並不需要再用if來判斷。那是多餘了。
而且也容易增加連結筆數。很容易增加主機負載。

正常來講是只要下delete的命令就行了。
所以你要的東西語法就是


這樣就行了。

==================================================================
to:彩虹
原則上在你#5的程式碼。9~15行的部份。不該教的最好不要教。
雖然也是會有同樣的效果。但最好不要這樣教。
畢竟對一個初學者而已。有可能會因為你這樣教而覺得這樣才比較正常。
如真要讓人了解這樣的寫法。最好還是加上其這樣的做法缺點。
其可能會這樣使用的可能性。
(雖然我想不出有什麼情況下,才需要這樣一筆一筆跑)

而且,你也著重錯地方了。
因為他的問題就是只取第一筆資料做判斷。所以才會發生這樣的事。
且你的說法也是錯誤的。
============================================================================
「此時$delrow裡面已經是陣列數組資料了,所以當然不能直接以$delrow['visit']來使用」
============================================================================
其實是有$delrow['visit']值的。(這是第一筆資料的'visit'值)
你該不會認為它是 $delrow[0]['visit']這樣子的模式吧。

所以正常來講,你才是搞錯地方的人喔!!
本篇文章回覆於2016-01-28 10:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
不錯的參考

彩虹
檢舉此回應
to:版主
關於您說的:因為他的問題就是只取第一筆資料做判斷。所以才會發生這樣的事。
是的,我也搞錯了,謝謝版主提醒,因為後來都是用PDO,對於mysqli、mysql越生疏了
版主另外說:在9~15行的部份。不該教的最好不要教
嚴格上來說我也不是該教或不該教
我有附上正確使用方式,而不是直接打發掉他的想法,這樣只會讓他侷限在一個框框裡
$sql = "DELETE FROM `test` WHERE `visit` <10 ";
mysql_query($sql)or die ("error".mysql_error());
每個人都是錯中學。
切記:不要急著打發初學者的熱情,有想法是好事,未來可以磨練出頂級的工程師

另外第二個方法,原則上我的想法是這樣,情查看
希望版主能夠了解
本篇文章回覆於2016-01-28 10:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

皮皮快跑
檢舉此回應
@彩虹:
你說一直沒有進入那個if……
可我說的是「第一個:你那個if的條件式是多餘的,因為delete本身就有條件了。」

你認為我沒有著重到那個點嗎?

有的時候…我們只是想單純的對發問者做個提醒,讓他好好思考問題點。
這樣要被說成沒「著重」到什麼事。
說真的我們也只能當成茶餘飯後的閒聊笑笑而已。

本篇文章回覆於2016-01-28 10:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
不錯的參考

皮皮快跑
檢舉此回應
@mypetertw
沒辦法,還是特別的再告訴你好了。

基本上sql層級已經能做到的事情,就不太需要在其他的程式語言重覆再做一次。
當然有一種情形是例外,但是就你這次的案例我不太看得出來。
如果是的話你下次最好說明清楚。
這個例外就是「你只是在進行一個測試」

只不過就你這次的案例來說,我看起來你就是已經要去執行這樣一個動作了。
其實,善用sql語句,連帶的可以簡化很多其他語言程式碼的問題,也可以加快sql的處理速度。
我想這個,才是你真正應該要學的方向。

再來,看你問過那麼多的問題,我想是時候該告訴你,你要學習程式碼的「重構」了。
把物件導向學好,把重構和設計模式也學好。
你可以精進更多,也省卻更多的力氣。

我想,也是時候讓你看看我跟我的「老師」過去學習的一個過程。
好好思考一下,你接下來該精進在什麼地方。


重談「佛祖流」敏捷軟體開發
本篇文章回覆於2016-01-28 11:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
TO:彩虹

其實我指的並非是你的程式寫法錯誤。
而是這樣子的寫法。並不是一個好的理念寫法。

要知道,對於操作mysql,(不要說mysql好了,就說資料庫好了)。能盡量能降低sql命令的運行。才是最好的方式。
而這樣的寫法。只會增加sql命令。是非常不好的方式。
(不是指你這樣的寫法不對,只是不好)

當然我指的是單純的刪除動作時。實在沒必要去做這樣的事。
如果是你指需要額外處理的模式。正常來講也只是用select先將該做的事處理好。

最後才直接下一條delete處理。而不是在while內一條一條下delete
這樣說好了。光一條一條去做刪除這樣的動作就已經是不對的做法了。

這樣有明白嗎??

ps:我也是用PDO的。但基本的語法命令我還是有記熟。
原因是有時得要改客戶舊系統的程式。不可能將客戶的程式全數大改版成使用PDO。
再加上PDO是PHP5才開始出現的東西。而我碰上的客戶有很多都是在PHP5還沒出來時的開發產品。
所以我還是會記得有關MYSQL的函數語法。

不過現在用CI框架。多少會忘記函數用法。有很多我還是會上網查看一下的。嘿嘿嘿!!
(老人家記性已經不好了~~)
本篇文章回覆於2016-01-28 11:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
對了~~~再附帶一提好了。

如果說是需要做特殊比對下刪除條件的。
無法用where做到的話。

我會採用如下的做法
先用select。然後將比對出來要刪除的id(主鍵)建立一個陣列$ids。

最後才下達


這樣也可以達到一個刪除命令的做法。
本篇文章回覆於2016-01-28 12:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
忘記是誰講的...如果你只有一把鎚子你會把所有問題都當成是釘子敲下去,但如果他不是釘子,而是螺絲呢?
我會同意皮大的說法,能用資料庫解決的,通常我都是用資料庫直接解決。
如果要刪多筆不同id某個特定條件的話我會變成


本篇文章回覆於2016-01-28 14:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

mypetertw
檢舉此回應
感謝各位大大 我寫出來了
其實這一部分只是我程式裡面中的一部分
其他我還要判斷如果七天後仍低於十則及當資料匯入資料庫的同時也會產生一個php此時這個檔案也必須要被刪除等等等等等等
我這個發問的點數開得太少啦~不夠給各位大大啊!再多也不夠!
我是使用彩虹大大的第二個方法然後再融入我的程式內的
所以我在這裡問的問題雖然拿到答案但其實我會參考各位大大的答案再改成我要的樣子
總之日後還要麻煩各位大大多多指教了
我目前也在慢慢的學習中!
另外我點數好像分配錯誤了....
本篇文章回覆於2016-01-28 15:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

皮皮快跑
檢舉此回應
嘛……這次換我傷腦筋……
所以只好再把這篇挖出來一下了。
學習是這樣,一次錯就不要二次犯,更重要的是不要把一次犯不好的東西教下去。
sql的處理基本上不要去做二次以上的迴圈處理這應該是常識才對。
更加嚴格一點的話……sql語句跟html根本就不應該塞在同一個地方。
我們要學習的是資料的處理和資料的呈現應該是要分開來做的。
想個問題,一個有點複雜的sql
你第一次query結果再做第二次sql…就會變成倍乘的請求和查詢。
如果還再做到第三次………
這無疑就是在增加主機的負擔……

是不是有時候該問一下怎麼跑個網頁會跑那麼久?到底是怎麼回事?

希望這已經是第二次在講不要去用複雜的迴圈來處理sql這件事。而不要同樣的過錯再有同樣的人犯第三次……
本篇文章回覆於2016-03-06 10:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.