2016-01-22 129 views
2

嘗試通過同一用戶捕獲多個帳戶的部分原因是,當用戶登錄時,我們會放置一個cookie。在登錄期間,首先我們嘗試讀取以前的cookie並將其替換爲新的cookie。讀取和寫入的cookie存儲在數據庫中。當cookies不被刪除時,該系統可以成爲識別多賬戶的一部分。允許的內存大小用遞歸函數耗盡

當使用遞歸函數搜索多帳戶時,我們耗盡內存。當不用作遞歸時,它可以工作,但有時用戶擁有這麼多賬戶,我們只能通過對所有找到的賬戶重複此功能來找到它們。 這個函數最多重複3次這個函數就可以工作,但可以肯定的是,這個函數必須運行,直到找到多個賬戶。

function xtest_getOtherNicks($dbh,$nick){ 
    /** 
     Find all duplicate accounts, based on cookie 
    */ 
    $aOtherNicks = array(); 
    $aCookies = db\ct_getCookies($dbh,$nick); 

    foreach($aCookies as $k => $aCookie){ 

     $aFoundNicks = db\ct_getNick($dbh,$aCookies[$k]['cookiewaarde']); 

     if(count($aFoundNicks) > 0){ 

      foreach($aFoundNicks as $key => $aFoundNick){ 

       if(!in_array($aFoundNick['nick'],$aOtherNicks)){ 
        $aOtherNicks[] = $aFoundNick['nick']; 

        //Recursive part 
        //$aMoreFoundNicks = xtest_getOtherNicks($dbh,$aFoundNick['nick']); 
        /** 
        if(count($aMoreFoundNicks)>0){ 
         foreach($aMoreFoundNicks as $key => $aMoreFoundNick){ 
          if(!in_array($aMoreFoundNick['nick'],$aOtherNicks)){ 
           $aOtherNicks[] = $aMoreFoundNick['nick']; 
          }  
         } 
        } */ 

       } 
      } 
     } 
    } 

    return $aOtherNicks; 
} 

我已經搜索了其他遞歸問題,但他們不同於我的。也許可以改變SQL並讓數據庫完成這項工作,但我對這部分無能爲力。

表:

CREATE TABLE IF NOT EXISTS `cookietest` (
    `cookiewaarde` varchar(100) NOT NULL, 
    `nick` varchar(100) NOT NULL, 
    `datum` datetime NOT NULL, 
    `rw` enum('r','w') NOT NULL, 
    KEY `cookiewaarde` (`cookiewaarde`), 
    KEY `nick` (`nick`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

查詢餅乾:

$q = "SELECT 
      cookiewaarde 
     FROM 
      cookietest 
     WHERE 
      nick = '".sanitize($nick)."'";// will be converted to PDO 

回答

1

你需要傳遞$aOtherNicks到遞歸範圍。否則,你不會中斷遞歸循環,因爲它將與空數組進行比較(找到的值始終是唯一的)。這Shuold工作:

function xtest_getOtherNicks($dbh, $nick, $aOtherNicks = array()) 
{ 
    $aCookies = db\ct_getCookies($dbh, $nick); 
    foreach ($aCookies as $aCookie) { 

     $aFoundNicks = db\ct_getNick($dbh, $aCookie['cookiewaarde']); 
     foreach ($aFoundNicks as $aFoundNick) { 
      if (in_array($aFoundNick['nick'], $aOtherNicks)) { continue; } 
      $aOtherNicks[] = $aFoundNick['nick']; 
      $aOtherNicks = xtest_getOtherNicks($dbh, $aFoundNick['nick'], $aOtherNicks); 
     } 
    } 

    return $aOtherNicks; 
} 
+0

很多,非常感謝!特別是爲了解釋爲什麼你的代碼工作,而我的代碼沒有。 – Terradon

+0

@ Terradon遞歸函數(特別是遞歸調用條件取決於當前狀態的地方)在對象上下文(類語法)中更方便。對象屬性(包括dbh)不需要傳遞,因爲它具有與方法(類函數)相同的(對象)範圍。 – shudder

相關問題