2010-05-04 81 views
2

真的堅持這個......基本上我的系統有4個表格;用戶,項目,用戶項目和活動。用戶表有一個用戶類型字段,用於定義他們是管理員還是用戶(通過整數)...刪除用戶>還需要刪除他們的項目,然後刪除該項目的活動?

管理員可以創建項目,爲項目創建活動並分配用戶(受限訪問用戶) 一個活動。因此,此設置意味着管理員從不直接與活動(而不是項目)關聯。

當我的管理員用戶刪除管理員時,我需要刪除所有項目和活動(對於他們的項目)。我的用戶刪除腳本到目前爲止很簡單並且很有效,但我在如何獲取項目ID以便知道要刪除哪些活動(與即將刪除的項目相關聯)方面遇到問題:

$userid = $_GET['userid']; 

$query = "DELETE FROM users WHERE userid=".$userid; 
$result = mysql_query($sql, $connection) 
    or die("Error: ".mysql_error()); 

$query = "DELETE FROM projects WHERE userid=".$userid; 
$result = mysql_query($sql, $connection) 
    or die("Error: ".mysql_error()); 

$query = "DELETE FROM userprojects WHERE userid=".$userid; 
$result = mysql_query($sql, $connection) 
    or die("Error: ".mysql_error()); 


$query = "DELETE FROM activities WHERE projectid=".$projectid; 
$result = mysql_query($sql, $connection) 
    or die("Error: ".mysql_error()); 

現在前三個查詢執行的很好,顯然是因爲用戶標識正在成功檢索。然而,我所知道的第四次也是最後一次查詢是錯誤的,因爲從任何地方都沒有獲得投射,但是我把它放在那裏以幫助理解我想要得到的東西!

我猜想我需要像'WHERE projectid ='之類的東西,然後收集用戶標識中可以與該項目活動相關的已刪除項目!它的一個簡單的概念,但我有麻煩...

回答

0

如果我正確理解你的問題,你必須先重新排序您的查詢。在刪除項目之前,您必須刪除用戶項目的活動。按照所述的順序進行操作,您將失去以後刪除所需的信息。

因此,嘗試他們在這個順序(我沒有使用實際的語法使其更清晰自己在做什麼):

- delete from activities where projectid in (select projectid from projects where userid = $userid) 
- delete from users... 
- delete from projects... 
- delete from userprojects... 

順便說一句,我必須依法推薦您使用綁定變量,而不是像這樣即時創建SQL字符串。好像你自己在填充這些字符串,但是像這樣的代碼會受到SQL注入的影響,並且你可能不希望這樣做。

+0

謝謝,我會嘗試了這一點,現在 – Jamie 2010-05-04 00:48:08

+0

對不起,我只是意識到,「選擇從項目專案編號其中userid」行不通,因爲在項目表中沒有用戶ID。 userprojects包含projectid和userid:S – Jamie 2010-05-04 00:59:24

+0

但似乎用戶標識必須存儲在別的地方,作爲另一個表中的外鍵。也許這是一個兩步檢查,對用戶項目?如果沒有看到表格的結構,我無法分辨,但如果它是您想要的,則可以根據此邏輯推斷。 – MJB 2010-05-04 01:11:53

1

你可能想看看MySQL支持多表DELETE syntax

$sql = "DELETE u, p, up, a 
     FROM users u 
     LEFT OUTER JOIN projects p ON (u.userid = p.userid) 
     LEFT OUTER JOIN userprojects up ON (u.userid = up.userid) 
     LEFT OUTER JOIN activities a ON (p.projectid = a.projectid) 
     WHERE u.userid = {$userid}"; 

$result = mysql_query($sql, $connection) 
    or die("Error: ".mysql_error()); 

作爲一個方面的問題,請小心防範SQL注入風險。不要使用Web請求參數而不進行篩選。至少,做這樣的事情:

$userid = intval($_GET['userid']);