use vars qw/$reg_u_tbl $dbh $sth $rows $_autoField $_referField /; $reg_u_tbl = "registered_users"; $_referField = "referrer_id"; $_autoField = "MemberId"; $_rankField = "ranked1"; $sth = $dbh->prepare("select * from `$reg_u_tbl` where ##RequirementsHere##"); $sth->execute; while($rows = $sth->fetchrow_hashref()) { my $thisMembersid = $rows->{$_autoField}; my $referrersid = $rows->{$_referField}; my $rankName = $rows->{$_rankField}; my $startinglevel = 0; &buildTradRank ($thisMembersid,$referrersid,$rankName,$startinglevel); } $sth->finish(); sub buildTradRank { ($_rankedid,$_startingid,$_rank,$_level) = @_; my $_fieldName = $_rank . '_traditional'; $_level++; $_countLevels++; $_highLevel = $_level if $_level > $_highLevel; if($_level == 1) { my $_addToSearch = ""; } else { my $_addToSearch = qq~ and `$_rank` = "0"~; } $sth2 = $dbh->prepare(qq{select * from `$reg_u_tbl` where `$_referField` = ?$_addToSearch}); $sth2->execute($_startingid); while(my $_nregu = $sth2->fetchrow_hashref()) { if(!$_nregu->{$_fieldName} || ($_nregu->{$_fieldName} && $_nregu->{$_fieldName} != $_rankedid)) { my $_updated = $dbh->do(qq{update `$reg_u_tbl` set `$_fieldName` = ? where `$_autoField` = ?}, undef, $_rankedid, $_nregu->{$_autoField}); if($_updated) { $_countAllNewlyAdded++; } else { $_countAllNewlyAddedFailures++; $_dbi_errors .= $DBI::errstr . "\n" if $DBI::errstr; } } if(!$_nregu->{$_rank}) { my $_countReferred = $dbh->selectrow_array(qq{select count(*) from `$reg_u_tbl` where `$_referField` = ? and `$_rank` = "0"}, undef, $_nregu->{MemberId}); if(!$_countReferred) { next; } # Send back to this routine when it returns it should continue with the current data, starting it over SHOULD fork a new routine... &buildTradRank($_rankedid,$_nregu->{$_autoField},$_rank,$_level); } next; } return 1;#Return when finished... }