2

真的坚持这个......基本上我的系统有4个表;用户、项目、用户项目和活动。用户表有一个用户类型字段,它定义了他们是管理员还是用户(通过整数)...

管理员可以创建项目、为项目创建活动并为用户(受限访问用户)分配活动。因此,此设置意味着管理员永远不会与活动(而是项目)直接关联。

当我的首席管理员用户删除管理员时,我还需要删除所有项目和活动(对于他们的项目)。到目前为止,我的用户删除脚本很简单并且可以工作,但是我在如何获取 projectID 以便知道要删除哪些活动(与即将删除的项目相关联)方面遇到了麻烦:

$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());

现在前三个查询执行良好,显然是因为成功检索了用户 ID。然而,我知道的第四个也是最后一个查询是错误的,因为没有可以从任何地方获得的投影,但是我把它放在那里以帮助理解我想要得到的东西!

我猜我需要像'WHERE projectid ='这样的东西,然后从用户ID中收集已删除的项目,这些项目可能与该项目的活动相关!这是一个简单的概念,但我遇到了麻烦......

4

3 回答 3

4

必读:MySQL Manual - FOREIGN KEY Constraints

请特别注意触发器,这将为您完成所有繁重的工作。=)ON DELETE CASCADE

于 2010-05-04T00:47:44.977 回答
1

您可能想查看MySQL 支持的多表DELETE语法:

$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']);
于 2010-05-04T01:07:58.960 回答
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 注入的影响,您可能不希望这样。

于 2010-05-04T00:38:04.973 回答