2

本当にこれで立ち往生しています...基本的に私のシステムには4つのテーブルがあります。ユーザー、プロジェクト、user_projects、およびアクティビティ。ユーザーテーブルには、ユーザーが管理者かユーザーかを (整数で) 定義する usertype フィールドがあります...

管理者は、プロジェクトを作成し、プロジェクトのアクティビティを作成し、ユーザー (制限付きアクセス ユーザー) にアクティビティを割り当てることができます。したがって、このセットアップは、管理者がアクティビティ (プロジェクトではなく) に直接関連付けられることは決してないことを意味します。

ヘッド管理者ユーザーが管理者を削除すると、すべてのプロジェクトとアクティビティ (そのプロジェクトの) も削除する必要があります。ユーザーの削除スクリプトはこれまでのところ単純で機能しますが、削除するアクティビティを知るために 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 が正常に取得されているため、最初の 3 つのクエリは正常に実行されます。しかし、私が知っている 4 番目と最後のクエリは間違っています。なぜなら、どこからでも得られる projectid がないからです。

「WHERE projectid =」のようなものが必要であり、そのプロジェクトのアクティビティに関連する可能性のあるユーザーIDから削除されたプロジェクトを収集する何かが必要になると思います! 単純なコンセプトですが、私は問題を抱えています...

4

3 に答える 3

4

必読:MySQLマニュアル-外部キー制約

トリガーに特別な注意を払ってください、これはあなたのためにすべての重労働を行います。=)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 に答える