请,我需要一些帮助,我是新的Smarty用户,但我被困在这约5天,请一些有经验的用户帮助我。
以下是我尝试转换的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,我总是在第二个循环中得到错误的结果,所以我决定发布干净的循环示例,如果有人可以给我建议以正确的方式将其转换为smarty
编辑(已解决): 感谢dbone建议,关于具有唯一id的嵌套数组传递给第二个循环。 (查看dbone帖子)。 感谢
答案 0 :(得分:0)
您需要将查询值转换为嵌套数组。只使用PHP进行查询,将它们加载到一个变量中即可发送到SMARTY引擎。在开头添加设置以清除变量(错误检查):
$to_smarty = NULL;
然后执行你已经在做的相同的代码,但是将$ to_smarty变量设置为具有第一个查询中的唯一ID的数组(这里我假设$ n,但你可以使用“name”):
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}
关键是使用嵌套的关联数组。 (注意我的错别字,:-))