2015-12-18 103 views
2

我遇到問題。我寫這個函數從我的數據庫實體恢復一個前一個分支,我希望該函數返回一個字符串,我可以看到這些信息。這是代碼:PHP函數返回不起作用

function stampaOggettoCollezione($tipoOggetto, $id, $connection, $percorso="") 
{ 
    $i=0; 

    switch($tipoOggetto) 
    { 
     case 'casaeditrice': 
      return $percorso; 
      break; 

     case 'storia': 
      $dati = array("storia", "IDCasaEditrice", "casaeditrice"); 
      break; 

     case 'testata': 
      $dati = array("testata", "IDStoria", "storia"); 
      break; 

     case 'albo': 
      $dati = array("albo", "IDTestata", "testata"); 
      break; 
    } 

      $sql = "SELECT * FROM ".$dati[0]." WHERE ID=$id"; 
      $result=mysqli_query($connection,$sql); 
      $IDSuperiore=mysqli_fetch_array($result)[$dati[1]]; 

      $sql = "SELECT * FROM ".$dati[2]." WHERE ID=$IDSuperiore"; 
      $result = mysqli_query($connection, $sql); 
      $nomeSuperiore=mysqli_fetch_array($result)['nome']; 

      $percorso = $percorso . $nomeSuperiore; 

      stampaOggettoCollezione($dati[2], $IDSuperiore, $connection, $percorso); 
} 

我敢肯定,代碼的作品,我嘗試在代碼中檢查最終路徑的一些回聲。我的問題是,我不能在我的網頁中像字符串一樣寫回報。你有什麼想法?宣言有問題嗎?由於

+1

你是什麼意思「寫回報就像我的網頁中的字符串」?真的不清楚你在問什麼。 – David

+0

對不起,我的英語問題。我在網頁中使用該功能來編寫路徑。如果我嘗試使用 $ var = stampaOggettoCollezione(...); echo $ var; 我無法查看輸出。 – NicolaPez

+1

這應該工作,假設返回一個值。目前函數中只有一個'case'實際返回一個值。所以除非這個'case'被調用,否則什麼都不會被返回。 – David

回答

1

我不知道我的理解,因爲英語是很難理解,但似乎所有你需要做的是寫:

return $result; 

在函數的結束,或任何字符串變量你想回來。然後在函數後使用echo stampaOggettoCollezione(arguments...)使此值回顯。

+0

al函數,對於db結構,假設案例'casaeditrice'並出去。我不明白爲什麼我沒有輸出。對於遞歸函數,我只能在'final'情況下返回,而不是在函數結束時返回。 – NicolaPez

+0

然後使用返回後遞歸stampaOggettoCollezione(...)像返回false;這意味着如果沒有返回它將是錯誤的。否則,返回你想要的值。你想返回哪個變量作爲'最終'情況? –

1

更換

stampaOggettoCollezione($dati[2], $IDSuperiore, $connection, $percorso); 

return stampaOggettoCollezione($dati[2], $IDSuperiore, $connection, $percorso); 

你要通過$percorso全部回了所有的調用stampaOggettoCollezione,回到原來的呼叫方式。閱讀有關Internet上遞歸的更多信息。

另外,我相信你可以達到相同的效果,如果你改變你的函數來建立一個連接到表的查詢。它將消除遞歸的需要,減少數據庫調用的次數,並且應該在不更改除函數本身之外的任何其他工作的情況下工作。

 
// dynamically queries more tables based on what the inital table to query is 
function stampaOggettoCollezione($tipoOggetto, $id, $connection, $percorso="") 
{ 
    $selectQuery = "SELECT "; 
    $columnsToSelect = ""; 
    $fromQuery = ""; 
    $whereClause = " WHERE "; 

    switch($tipoOggetto) { 
     case 'albo': 
      $columnsToSelect .= ", a.nome AS aNome"; 
      $fromQuery = " LEFT JOIN albo a ON t.ID = a.IDTestata"; 
     case 'testata': 
      $columnsToSelect .= ", t.nome AS tNome"; 
      $fromQuery = " LEFT JOIN testata t ON s.ID = t.IDStoria" . $fromQuery; 
     case 'storia': 
      $columnsToSelect .= ", s.nome AS sNome"; 
      $fromQuery = " LEFT JOIN storia s ON ce.ID = s.IDCasaEditrice" . $fromQuery; 
     case 'casaeditrice': 
      $columnsToSelect .= ", ce.nome AS ceNome"; 
      $fromQuery = " FROM casaeditrice ce" . $fromQuery; 
      break; 
    } 
    // remove the first `, ` 
    $selectQuery .= substr($columnsToSelect, 2); 

    switch($tipoOggetto) 
    { 
     case 'casaeditrice': 
      $whereClause .= "c.ID = $id"; 
      break; 
     case 'storia': 
      $whereClause .= "s.ID = $id"; 
      break; 
     case 'testata': 
      $whereClause .= "t.ID = $id"; 
      break; 
     case 'albo': 
      $whereClause .= "a.ID = $id"; 
      break; 
    } 

    $qry = $selectQuery . $fromQuery . $whereClause; 

    $result=mysqli_query($connection,$sql); 
    $nomeSuperiore= ""; 
    $nomes = mysqli_fetch_array($result); 
    // might take some work to get the output in the right order 
    foreach($nomes as $nome) 
     $nomeSuperiore .= $nome; 

    return $nomeSuperiore; 
}