▼スレッド
│
└◇1812:Re:ログインボーナスとタイムボスに購入ランキング [moon] 10/24 20:46
└◇1813:Re[2]:ログインボーナスとタイムボスに購入ランキング [YOUME] 10/25 11:12
└◇1814:Re[3]:ログインボーナスとタイムボスに購入ランキング [moon] 10/25 13:58
└◇1815:Re[4]:ログインボーナスとタイムボスに購入ランキング [moon] 10/25 14:21
└◇1816:Re[5]:ログインボーナスとタイムボスに購入ランキング [YOUME] 10/26 18:49<-last
> ログインボーナスについて度々申し訳ないです…コメントを書く(引用) | スレッド一覧
> どうしても分からない不具合があり、お伺いにきました。
>
> 何故かプレイヤーAが他のプレイヤーBに会いに行くと
> プレイヤーBのログイン日数カウントが奇妙な事に変化するのです。
> ↓こんな感じの記述
> 1414080452△0△なし△0△0
> や
> 1414111040△0△△△
> など
>
> いろいろ見てはみたのですが分からず…
> どういった場合にこうなってしまうことが考えられますでしょうか?
> 申し訳ないです…
疑わしいのは、ユーザーデータの読み書きが正常に行われていないのではないか、という点です。
ということで、まずはsub get_user、get_partner、userout、partneroutにきちんと$loginの処理が追加されているかどうかを確認してみてください。
接触後ということで特にsub get_partnerとsub partneroutが怪しいです。
sub get_partnerなどが問題なさそうでしたら、次はすべてのファイルを対象に「login」を検索して、もし今回追加したもの以外に$loginまたは$ploginがありましたら変数が競合している可能性があるということなので今回追加した変数名を別のものにする必要があるかもしれません。
これでも原因が特定できない場合は同様にすべてのファイルを対象に「なし」を検索して何かのパラメータ変数に代入しているような箇所を探してみてください。
手元にあるバージョン(0.17β、Finalβ)にはそのような箇所はないようなので、もしあるようならそのあたりが影響していそうです。
いつもお世話になります、いろいろ見直したのですが自分で何が悪いのか見つけることができませんでした…コメントを書く(引用) | スレッド一覧
> 疑わしいのは、ユーザーデータの読み書きが正常に行われていないのではないか、という点です。
> ということで、まずはsub get_user、get_partner、userout、partneroutにきちんと$loginの処理が追加されているかどうかを確認してみてください。
> 接触後ということで特にsub get_partnerとsub partneroutが怪しいです。
自分で見た限りはちゃんと追加してると思っているのですが、以下のような追加方法で間違いないでしょうか?
# Sub Get User #
sub get_user {
return if $getuserflag;
open(IN,"$usrdir$_[0]\.dat") || &error("ID $_[0]は存在しません $nm");
@_ = <IN>;
close(IN);
if (!@_)
{
open(IN,"$usrdir$_[0]\.log") || &error("ID $_[0]は存在しません");
@_ = <IN>;
close(IN);
}
if (!@_) { &error("ID $_[0] 読みこみエラー") }
$_[0] =~ s/[\n\r]//g;
($id,$nm,$ps,$jb,$ig,$sp,$bp,$bn,$ak,$dd,$hp,$xp,$ab,$db,$av,$wn,$lz,$dt,$mn,$bg,$xi,$tm,$lf,
$fe,$cm,$is,$ht,$fg,$rw,$kl,$sex,$itemmakemax,$list,$saying,$tep,$lasttm,$itbreak,$buyfig,$buymon,$steal,$stolen,$karma,$attribute,$fighter,$Dg,$Dm,$md,$sj,$login) = split(/<>/,$_[0]);
if($itemmakemax eq "") {$itemmakemax = 0;}
if($tep eq "") {$tep = 0;}
if($itbreak eq "") {$itbreak = 0;}
if($buyfig eq "") {$buyfig = 0;}
if($buymon eq "") {$buymon = 0;}
if($steal eq "") {$steal = 0;}
if($stolen eq "") {$stolen = 0;}
if($karma eq "") {$karma = 0;}
if($attribute eq "") {$attribute = "-20_10_20_-10__20_-10_-20_10__0_0_0_0__0_0_0_0";}
&error("パスワードが違います") if $Fm{'ps'} ne $ps && $Fm{'ps'} ne $admpas && $Fm{'mode'} ne 'make_con' && $Fm{'mode'} ne 'make_con_m';
$userline = shift(@_);
$getuserflag = 1;
return @_;
}
# Sub Get Partner #
sub get_partner {
return if $getpartnerflag;
open(IN,"$usrdir$_[0]\.dat") || &error("ID $_[0]は存在しません");
@_ = <IN>;
close(IN);
if (!@_)
{
open(IN,"$usrdir$_[0]\.log") || &error("ID $_[0]は存在しません");
@_ = <IN>;
close(IN);
}
if (!@_)
{
&error("ID $_[0] 読みこみエラー");
}
$_[0] =~ s/[\n\r]//g;
($pid,$pnm,$pps,$pjb,$pig,$psp,$pbp,$pbn,$pak,$pdd,$php,$pxp,$pab,$pdb,$pav,$pwn,$plz,$pdt,$pmn,$pbg,$pxi,$ptm,$plf,
$pfe,$pcm,$pis,$pht,$pfg,$prw,$pkl,$psex,$pitemmakemax,$plist,$psaying,$ptep,$plasttm,$pitbreak,$pbuyfig,$pbuymon,$psteal,$pstolen,$pkarma,$pattribute,$pfighter,$pDg,$pDm,$pmd,$plogin) = split(/<>/,$_[0]);
if($pitemmakemax eq "") {$pitemmakemax = 0;}
if($ptep eq "") {$ptep = 0;}
if($pitbreak eq "") {$pitbreak = 0;}
if($pbuyfig eq "") {$pbuyfig = 0;}
if($pbuymon eq "") {$pbuymon = 0;}
if($psteal eq "") {$psteal = 0;}
if($pstolen eq "") {$pstolen = 0;}
if($pkarma eq "") {$pkarma = 0;}
if($pattribute eq "") {$pattribute = "-20_10_20_-10__20_-10_-20_10__0_0_0_0__0_0_0_0";}
shift(@_);
$getpartnerflag = 1;
return @_;
}
# Sub User Out #
sub userout {
$tm = time;
$line =
join('<>',$id,$nm,$ps,$jb,$ig,$sp,$bp,$bn,$ak,$dd,$hp,$xp,$ab,$db,$av,$wn,$lz,$dt,$mn,$bg,$xi,$tm,$lf,
$fe,$cm,$is,$ht,$fg,$rw,$kl,$sex,$itemmakemax,$list,$saying,$tep,$lasttm,$itbreak,$buyfig,$buymon,$steal,$stolen,$karma,$attribute,$fighter,$Dg,$Dm,$md,$sj,$login,"\n");
unshift (@rcdlines,$line);
&writedat("$usrdir$id\.dat",@rcdlines);
&writedat("$usrdir$id\.log",@rcdlines);
chmod(0666,"$usrdir$id\.log");
# if(-s "$usrdir$id\.dat" < 10){&writedat("$usrdir$id\.dat",@rcdlines);}
}
# Sub Partner Out #
sub partnerout {
$pline =
join('<>',$pid,$pnm,$pps,$pjb,$pig,$psp,$pbp,$pbn,$pak,$pdd,$php,$pxp,$pab,$pdb,$pav,$pwn,$plz,$pdt,$pmn,$pbg,$pxi,$ptm,$plf,
$pfe,$pcm,$pis,$pht,$pfg,$prw,$pkl,$psex,$pitemmakemax,$plist,$psaying,$ptep,$plasttm,$pitbreak,$pbuyfig,$pbuymon,$psteal,$pstolen,$pkarma,$pattribute,$pfighter,$pDg,$pDm,$pmd,$psj,$plogin,"\n");
unshift (@prclines,$pline);
&writedat("$usrdir$pid\.dat",@prclines);
&writedat("$usrdir$pid\.log",@prclines);
chmod(0666,"$usrdir$pid\.log");
# if(-s "$usrdir$pid\.dat" < 10){&writedat("$usrdir$pid\.dat",@prclines);}
}
> sub get_partnerなどが問題なさそうでしたら、次はすべてのファイルを対象に「login」を検索して、もし今回追加したもの以外に$loginまたは$ploginがありましたら変数が競合している可能性があるということなので今回追加した変数名を別のものにする必要があるかもしれません。
これも検索して探したのですが、被りはありませんでした…
> これでも原因が特定できない場合は同様にすべてのファイルを対象に「なし」を検索して何かのパラメータ変数に代入しているような箇所を探してみてください。
これも特になったです…
そして何故かプレイヤーによっていろいろな表記に代わっていて、その数値がどこから来てるのか不明なのです…
妙な数値が入る人もいれば、そもそものカウントがリセットされてしまっている人もいて;
もうどうしたらいいのか…涙
> 自分で見た限りはちゃんと追加してると思っているのですが、以下のような追加方法で間違いないでしょうか?コメントを書く(引用) | スレッド一覧
sub get_partnerの$ploginの前の$psjが抜けているようです。
> > これでも原因が特定できない場合は同様にすべてのファイルを対象に「なし」を検索して何かのパラメータ変数に代入しているような箇所を探してみてください。
>
> これも特になったです…
> そして何故かプレイヤーによっていろいろな表記に代わっていて、その数値がどこから来てるのか不明なのです…
> 妙な数値が入る人もいれば、そもそものカウントがリセットされてしまっている人もいて;
上記の抜けが原因のようですが、「なし」が見付からないのは探し方によるものではないか、と思います。
コマンドプロンプトを開いて以下を入力してみると該当箇所が見付かるかもしれません。
cd "sos2.cgiのあるフォルダパス"
findstr /S /C:"なし" *.*
これを実行して見付かった箇所が$sjまたは$psjに関係している部分でしたら$psjの抜けが原因である可能性が高いということになります。
追記です。コメントを書く(引用) | スレッド一覧
$psjの漏れが原因である場合、ユーザーデータによっては$sjと$loginの内容がおかしくなっている場合がありますので、可能ならファイルの中身(全体は無理な場合は少なくとも$sjと$login部分)を正常な状態に戻したほうが良いと思います。
もし、正常な状態に戻さないとなると先の状況を例にすると「1414080452△0△なし△0△0」だと$loginが「1414080452」として扱われてしまいますので。
どちらにせよ、ローカルでのデバッグと適用前のバックアップが重要ということですね。
私としても修正時は他人ごとではないのでお互いに気を付けましょう。
相談にのって頂き本当に感謝感謝です!コメントを書く(引用) | スレッド一覧
まさにSub Get Partnerに$psjが無かったのが原因でした…
$psjを追記したところ、不具合が治りました!
凡ミスをしてしまい大変お恥ずかしいです…
教えて頂いた事を知識に加えながら、いろいろ勉強していきます!
また相談しにきてしまうかもしれないのですが、その時はまた宜しくお願いします!