|
-- 作者: 一窍不通
-- 发布时间: 2003/05/29 09:50pm
以前看到小石榴写的一个用户数据集中读写的帖子,看了好几遍,没看懂,实在对不起,又没看懂。没看懂就自己写,下面是个我写的集中写入用户数据的过程。 [code] sub upmemberdate { my $membernametemp = shift; my %userinfo = @_; my $filetoopen = "$lbdir$memdir/$membernametemp.cgi"; if (-e $filetoopen) { open (FILE,$filetoopen); my $filedata=<FILE>; close(FILE); chomp $filedata; local ( $membername, $password, $membertitle, $membercode, $numberofposts, $emailaddress, $showemail, $ipaddress, $homepage, $oicqnumber, $icqnumber, $location, $interests, $joineddate, $lastpostdate, $signature, $timedifference, $privateforums, $useravatar, $userflag, $userxz, $usersx, $personalavatar, $personalwidth, $personalheight, $rating, $lastgone, $visitno, $addjy, $meili, $mymoney, $postdel, $sex, $education, $marry, $work, $born, $chatlevel, $chattime, $jhmp, $useradd3, $useradd4, $onlinetime, $userquestion, $useradd6, $useradd7, $useradd8) = split(/\t/,$filedata); local($numberofposts,$numofreplys)=split(/\|/,$numberofposts); foreach my $info (keys %userinfo) { if ($userinfo{$info}=~/^[\+\-][0-9]+$/) { $$info += $userinfo{$info}; } else { $userinfo{$info} =~ s/^\\(\-|\+)/$1/; $userinfo{$info} =~ s/^\\\\/\\/; $$info = $userinfo{$info}; } #print "$info $$info\n"; } open(FILE,">$filetoopen"); print FILE "$membername\t$password\t$membertitle\t$membercode\t$numberofposts\|$numberofreplys\t$emailaddress\t$showemail\t$ipaddress\t$homepage\t$oicqnumber\t$icqnumber\t$location\t$interests\t$joineddate\t$lastpostdate\t$signature\t$timedifference\t$privateforums\t$useravatar\t$userflag\t$userxz\t$usersx\t$personalavatar\t$personalwidth\t$personalheight\t$rating\t$lastgone\t$visitno\t$addjy\t$meili\t$mymoney\t$postdel\t$sex\t$education\t$marry\t$work\t$born\t$chatlevel\t$chattime\t$jhmp\t$useradd3\t$useradd4\t$onlinetime\t$userquestion\t$useradd6\t$useradd7\t$useradd8\t\n"; close(FILE); } } [/code] 所传递的参数,第一个是所要写入的用户名,后面是一个哈希表,哈希表的关键字是要被改变的变量名,值是增减的值或被改为的值。 如果哈希表的值以 + - 开头,则是对相应的用户数据增减,否则就将相应的用户数据设为哈希表的值。 如果要将一个以 + - 开头的字串付给一个变量的话,就要用 \ 对其进行一次转义,如果以 \ 开头还要进行一次转义。 例如,将用户 test 的发贴数加1 ,威望设为 -6 ,可以这样调用过程。 &upmemberdate('test',numofposts,'+1',rating,'\-6');
-- 作者: 红岭小石榴
-- 发布时间: 2003/05/30 02:01am
[quote][b]下面引用由[u]一窍不通[/u]在 [i]2003/05/29 09:50am[/i] 发表的内容:[/b] 以前看到小石榴写的一个用户数据集中读写的帖子,看了好几遍,没看懂,实在对不起,又没看懂。没看懂就自己写,下面是个我写的集中写入用户数据的过程。 sub upmemberdate { my $membernametemp = shift; ... [/quote] 晕.... 我的方法就是 sub upmemberdata($$){ my($membername,$upmemberdatacode) = @_; ### 这里读用户数据 &$upmemberdatacode; ### 这里写用户数据 } 调用方法: 比如在 post.cgi 中 sub upcode { ...... $numberofposts++; $numberofreplys++; ........ } upmemberdata($inmembername,\&upcode); 类似这样的
-- 作者: 红岭小石榴
-- 发布时间: 2003/05/30 02:04am
你的方法也有它的方便之处, 但缺点是可控制的范围小
-- 作者: 一窍不通
-- 发布时间: 2003/05/30 05:51am
我还是不明白你的方法,你最好能详细的写一下。 你的好象还要根据不同的需要写出不同的过程再调用,只是把读取写入用户数据的内容集中到一起了。我的不管如何更新数据,只用这一个过程就行了。就是调用的时候累点。 你说的控制范围小是什么意思?我不明白。
-- 作者: 红岭小石榴
-- 发布时间: 2003/05/30 11:54am
[quote][b]下面引用由[u]一窍不通[/u]在 [i]2003/05/29 05:51pm[/i] 发表的内容:[/b] 我还是不明白你的方法,你最好能详细的写一下。 你的好象还要根据不同的需要写出不同的过程再调用,只是把读取写入用户数据的内容集中到一起了。我的不管如何更新数据,只用这一个过程就行了。就是调用的时候累 ... [/quote] 你调用的时候是轻松点, 因为我的要单独写子程序 而控制范围小是只能修改变量,而不能让其它复杂的代码参与运算 比如在不同情况下,根据用户原有经验, 来求得新的经验值
-- 作者: 红岭小石榴
-- 发布时间: 2003/05/30 11:57am
在更新帖子列表的时候,情况会更复杂
-- 作者: 红岭小石榴
-- 发布时间: 2003/05/30 00:01pm
我没有这个的LB的子程序 我只是在我写的社区程序里用到了,目前该程序还没开发完呢
-- 作者: 红岭小石榴
-- 发布时间: 2003/05/30 06:13pm
[code]sub putonemember($$){ ### 写入用户数据 my($membername,$memberdata_updatecode) = @_; $membername =~ tr/A-Z/a-z/; $membername =~ s/[\a\f\n\e\0\r\t\s\`\~\!\@\#\$\%\^\&\*\(\)\+\=\\\{\}\;\'\:\"\,\.\/\<\>\?]//isg; $membername = "客人" if($membername eq ""); my$memberdata_indir = ord(lc(substr($membername,0,1))); ### 用户资料分目录存放 my$memberdatafile = "${datadir}members/$memberdata_indir/$membername.cgi"; if((-e $memberdatafile)&&($membername ne "客人")){ winlock($memberdatafile,1) if($use_winlock); open(FILE,$memberdatafile); flock(FILE,1) if($OS_USED eq "Unix"); my$memberdatastr = <FILE>; close(FILE); $files_opened++; chomp($memberdatastr); if(($use_xp_report)&&(($memberdatastr eq "")||($memberdatastr=~/^\s+$/))){ xp_report("用户 $membername 的社区资料可能已经完全丢失了!"); }else{ ($Mem{name},$Mem{password},$Mem{class},$Mem{authcode},$Mem{title},$Mem{prestige},$Mem{jhmp},$Mem{medal},$Mem{postnum},$Mem{lastpost},$Mem{attr},$Mem{regtime},$Mem{regip},$Mem{lvisit},$Mem{numvisit},$Mem{onlinet},$Mem{nation},$Mem{comefrom},$Mem{pinfo},$Mem{email},$Mem{showemail},$Mem{homepage},$Mem{oicq},$Mem{icq},$Mem{avatar},$Mem{avatarw},$Mem{avatarh},$Mem{photostatus},$Mem{intro},$Mem{signature},$Mem{pwprotect})=split(/\t/,$memberdatastr); &$memberdata_updatecode; ### 执行更新用户数据的代码 if($Mem{name} eq "" || $Mem{password} eq ""){ winlock($memberdatafile,0) if($use_winlock); xp_report("用户 $membername 的用户名或密码数据项丢失!") if($use_xp_report); }else{ open(FILE,">$memberdatafile"); flock(FILE,2) if($OS_USED eq "Unix"); print FILE "$Mem{name}\t$Mem{password}\t$Mem{class}\t$Mem{authcode}\t$Mem{title}\t$Mem{prestige}\t$Mem{jhmp}\t$Mem{medal}\t$Mem{postnum}\t$Mem{lastpost}\t$Mem{attr}\t$Mem{regtime}\t$Mem{regip}\t$Mem{lvisit}\t$Mem{numvisit}\t$Mem{onlinet}\t$Mem{nation}\t$Mem{comefrom}\t$Mem{pinfo}\t$Mem{email}\t$Mem{showemail}\t$Mem{homepage}\t$Mem{oicq}\t$Mem{icq}\t$Mem{avatar}\t$Mem{avatarw}\t$Mem{avatarh}\t$Mem{photostatus}\t$Mem{intro}\t$Mem{signature}\t$Mem{pwprotect}\t\t\n"; close(FILE); winlock($memberdatafile,0) if($use_winlock); $files_written++; } } } else{ xp_report("试图生成并写入不存在的用户文件 $membername.cgi") if(($use_xp_report)&&($thisprog ne "register.cgi")); } }[/code]
-- 作者: 红岭小石榴
-- 发布时间: 2003/05/30 06:16pm
在 post.cgi 中的应用 if($userregistered){ my$update_memberdata_code = sub { $Mem{postnum} =~ /p(.*?)\|/i; $num_of_posts = $1 + 1; $Mem{postnum} =~ s/p.*?\|(.*?)$/p$num_of_posts\|$1/i; }; putonemember($inmemberid,$update_memberdata_code); }
-- 作者: 红岭小石榴
-- 发布时间: 2003/05/30 06:20pm
我的子程序还是有点问题的, 最近没时间修改, 写到一半不动了
-- 作者: 一窍不通
-- 发布时间: 2003/05/30 08:37pm
看了你的程序,学了两招
|