プロジェクト

全般

プロフィール

Bug(バグ) #2299

isao sano12年以上前に更新

h3. Overview (現象)

紹介文を書くと、書いたユーザーと書かれたユーザー、そして書かれたユーザーが招待を出したユーザーが退会動作を行うと500エラーが発生して退会できない。
書いたユーザーが招待を出したユーザーは退会出来ます。
また、退会動作は管理画面、ユーザー側どちらから行っても再現いたします。

h3. 報告元

http://sns.openpne.jp/diary/26651
<pre>
■現象
会員の退会/強制退会を実行すると、500エラーが発生して退会できない。

■環境
OpenPNE 3.6 beta11

■再現手順
1.会員Aが会員Bを招待する
2.会員Bで登録&ログインして、会員A向けにフレンド紹介文を作成する
3.会員Aが会員Cを招待する
4.会員Cで登録&ログインする
5.管理画面を開いて、「メンバー管理」から会員Cを強制退会する
→ 500エラー画面が表示される。
6.会員Cで自主退会しても同様に500エラーとなる

Apacheのエラーログには以下のエラーメッセージが記録されます。
[Thu Jul 21 23:50:20 2011] [error] [client xxx.xxx.xxx.xxx] SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`beax`.`intro_friend`, CONSTRAINT `intro_friend_member_id_to_member_relationship_member_id_to` FOREIGN KEY (`member_id_to`) REFERENCES `member_relationship` (`member_id_to`)), referer: http://xxx.xxx.xxx.xxx/pc_backend.php/member/delete/id/3

■原因(推測)
intro_friendテーブルの以下の外部キー定義に問題があるように思います。
CONSTRAINT `intro_friend_member_id_to_member_relationship_member_id_to` FOREIGN KEY (`member_id_to`) REFERENCES `member_relationship` (`member_id_to`)

再現手順を行うと、以下のようなレコード構成になります。

memberテーブル
・レコード1:会員A
・レコード2:会員B
・レコード3:会員C

member_relationshipテーブル
・レコード1:A <- B
・レコード2:B <- A
・レコード3:A <- C
・レコード4:C <- A

intro_friendテーブルのレコード
・レコード1:A <- B

上記状態で会員Cを削除すると、以下のように削除に失敗します。

memberテーブルのレコード3削除する
→ DELETE ON CASCADE定義により、member_relationshipテーブルのレコード3と4が削除される
→ intro_friendテーブルの外部キー定義により、member_relationshipテーブルのレコード3の削除に失敗する(Aが外部キーとして参照されている)

</pre>

h3. 再現バージョン

* OpenPNE3.6beta11
* beta12
* beta13

* opIntroFriendPlugin-0.9.2.1
OpenPNE3.6beta12

h3. 再現手順

1. ユーザーAでログインし、ユーザーBに招待メールを送る ユーザーAでログイン。
2. ユーザーBでログインし、ユーザーAの紹介文を書く ユーザーBに紹介文を書く。(/introfriend/xx)
3. ユーザーAがユーザーCに招待メールを送る 管理画面よりユーザーAを強制退会させる。(/pc_backend.php/member/delete/id/xx)
4. ユーザーCでプロフィール登録を行う 500エラーが出て退会できない。
5. 管理画面よりユーザーCを強制退会させる 管理画面よりユーザーBを強制退会させる。(/pc_backend.php/member/delete/id/xx)
6. 500エラーが出て退会できない

手順4を行わず、手順3で送信した招待を取り消そうとしても500エラーが発生する
500エラーが出て退会できない。
7. ユーザーBでログイン
8. ユーザーCに招待メールを送る。
9. ユーザーCがプロフィール登録する
10. 管理画面よりユーザーBを強制退会させる。(/pc_backend.php/member/delete/id/xx)
11. 500エラーが出て退会できない。


h3. Causes (原因)

バグが発生した原因を記入

h3. Way to fix (修正内容)

修正内容を記入

戻る