2014-01-29 54 views
0

請,我需要一些幫助,我是新的Smarty用戶,但我堅持了約5天,請一些有經驗的用戶幫助我。循環內(另一個)循環(不通過ID)Smarty

這裏是PHP代碼我試圖轉換的例子: 代碼:

$numone = "1"; 
$contest = $mysqli->prepare("SELECT `active`, `id`, `start`, `end`, `slots`, `description`, `name`, `type`, `minimum` FROM `contests` WHERE `active` = ?"); 
$contest->bind_param('i', $numone); 
$contest->execute(); 
$contest->bind_result($firstloop['active'], $firstloop['id'], $firstloop['start'], $firstloop['end'], $firstloop['slots'], $firstloop['description'], $firstloop['name'], $firstloop['type'], $firstloop['minimum']); 
$contest->store_result(); 


if ($contest->num_rows() >0){ 
$n=0; 
while($contest->fetch()){ 
$n++; 
    if ($firstloop['active'] == "1") { 
     if ($firstloop['type'] == "0"){ 

    echo " 
    <table> 
    <tr><th colspan='2'>Contest name: ".$firstloop['name']." </th></tr> 
    <tr><th>Contest Start: ".$firstloop['start']."</th><th> Contest End: ".$firstloop['end']." </th></tr> 
    <tr><td>Description :<br> ".$firstloop['description']." </td></tr> 
      "; 

    $participants = $mysqli->prepare("SELECT COUNT(*), `uid` FROM `completed` WHERE `status` = ? AND `time` > ? AND `time` < ? AND `payment` >= ? GROUP BY `uid` ORDER BY count(*) DESC LIMIT ?");  
     $participants->bind_param('issii', $numone, $firstloop['start'], $firstloop['end'], $firstloop['minimum'], $firstloop['slots']); 
     $participants->execute(); 
     $participants->bind_result($counted, $secondloop['uid']); 
     $participants->store_result(); 

    echo " 
    <tr><th>Place</th><th>ID</th><th>Completed</th></tr> 
      "; 
     while ($participants->fetch()){ 

    echo " 
     <tr><td>".$n."</td><td>".$secondloop['uid']." </td><td> ".$counted."</td></tr> 
      ";   

     } 
    echo " 
    </table>  
      "; 
     } 
     } 
    } 
} 

而且不管我嘗試,我總是落在結束。悲傷 正如你所看到的,兩個循環都沒有通過ID連接。

如果有人可以幫助我,我會再睡一夜而不睡覺。謝謝

編輯:我在任何嘗試轉換成Smarty失敗,我總是得到錯誤的結果與第二個循環,所以我決定發佈循環的乾淨的例子,如果有人可以給我建議轉換成聰明的正確的方法。

編輯(已解決): 感謝dbone的建議,關於具有唯一ID的嵌套數組傳遞給第二個循環。 (檢查dbone的帖子)。 謝謝

+0

我是唯一一個如何在這裏看不到任何聰明的代碼? – hek2mgl

+0

@ hek2mgl - 正如我所說我沒有任何嘗試轉換成Smarty,我總是得到錯誤的結果與第二個循環,所以我決定發佈循環的乾淨的例子,如果有人可以給我建議轉換這smarty in正確的方法。 – user3246886

回答

0

您需要將查詢值轉換爲嵌套數組。在PHP中執行查詢,將它們加載到單個變量中以發送到SMARTY引擎。在開始添加一個設置,以清除變量(錯誤檢查):

$to_smarty = NULL; 

那麼你已經在做相同的代碼,但設置$ to_smarty變量了與唯一ID的數組第一個查詢(在這裏我假設$ N,但你可以使用「名稱」):

if ($contest->num_rows() >0){ 
    $n=0; 
    while($contest->fetch()){ 
    $n++; 
    if ($firstloop['active'] == "1") { 
     if ($firstloop['type'] == "0"){ 
      $to_smarty[$n] = firstloop 

這將所有這些數據存儲到可傳遞給Smarty的數組。當你做了第二次查詢,在$ to_smarty變量創建新的索引並填充用新值原始陣列中的每個條目:

$participants = $mysqli->prepare("SELECT COUNT(*), `uid` FROM `completed` WHERE `status` = ? AND `time` > ? AND `time` < ? AND `payment` >= ? GROUP BY `uid` ORDER BY count(*) DESC LIMIT ?");  
$participants->bind_param('issii', $numone, $firstloop['start'], $firstloop['end'], $firstloop['minimum'], $firstloop['slots']); 
$participants->execute(); 
$participants->bind_result($counted, $secondloop['uid']); 
$participants->store_result(); 
$i = 0; 
while ($participants->fetch()){ 
     $to_smarty[$n]['participants'][$i]['n'] = $secondloop['uid']; 
     $to_smarty[$n]['participants'][$i]['uid'] = $secondloop['uid']; 
     $to_smarty[$n]['participants'][$i]['counted'] = $counted; 
     $i++; 

您可以在$ to_smarty變量現在傳遞給Smarty的引擎用模板打印的信息:

$smarty->assign('stuff', $to_smarty); 
$smarty->display('template.tpl'); 

模板看起來是這樣的:

{if $stuff} 
<table> 
{foreach $stuff as $first} 
<tr><th colspan='2'>Contest name: {$first.name} </th></tr> 
<tr><th>Contest Start: {$first.start}</th><th> Contest End: {$first.end}</th></tr> 
<tr><td>Description :<br>{$first.description}</td></tr> 
<tr><th>Place</th><th>ID</th><th>Completed</th></tr> 
{foreach $first.participants as $participant} 
     <tr><td>{$participant.n}</td><td>{$participant.uid}</td><td>{$participant.counted}</td></tr> 
{/foreach} 
{/foreach} 
</table> 
{/if} 

的關鍵是使用嵌套,關聯數組。 (注意我的錯別字:-))

+0

感謝dbone,你讓我免於心臟病發作。我現在設法像魅力一樣工作。我會編輯我的第一篇文章,並給你一分。 – user3246886