2014-01-29 56 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