如何从Smarty中访问Mysql结果集?

时间:2012-08-16 22:41:32

标签: php mysql smarty smarty3

我的网站显示一组div,每个div代表一个包含五种不同类型内容的集合。每个div显示该集合中每种类型内容的项目数。

我目前从数据库中获取每种类型的数字,如下所示:

{section name=res loop=$results}

{assign var='wn' value=$db->num_rows($db->query("select * from content where type='1' and collection_id='{$results[res].collection_id}'"))}
{assign var='nn' value=$db->num_rows($db->query("select * from content where type='2' and collection_id='{$results[res].collection_id}'"))}

问题是我们正在为每个div做五个数据库查询,我们想尝试将它们合并为一个。用php我们就可以了。

$w=$db->query("select type, count(*) as number from content where collection_id='".$val['collection_id']."' GROUP by type");

然后使用带有“mysql_fetch_array”的“while”循环将类型数量分配给变量。

是否可以在Smarty中做类似的事情?是否有一个mysql_fetch_array替代Smarty访问结果集?

提前致谢!

编辑:有人建议我应该从php执行此操作,但我不清楚它是如何工作的。在我的php文件中,我有以下内容:

<?php


$c=$db->query("select * from ".USERS_PIN."");

$cdata = array();

while ($row = mysql_fetch_array($c))
    {
        $cdata[] =  $row;
    }

$smarty->assign("results", $cdata); 

$smarty->display('stack.tpl');  

?>

然后在stack.tpl中我有以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body >

<div id="ColumnContainer">

{if count($results) > 0}

            {section name=res loop=$results}

            {assign var='wn' value=$db->num_rows($db->query("select * from pinrest_users_pin where type='4' and board_id='{$results[res].board_id}'"))}
            {assign var='nn' value=$db->num_rows($db->query("select * from pinrest_users_pin where type='5' and board_id='{$results[res].board_id}'"))}
            {assign var='in' value=$db->num_rows($db->query("select * from pinrest_users_pin where (type='1' or type='2') and board_id='{$results[res].board_id}'"))}
            {assign var='vn' value=$db->num_rows($db->query("select * from pinrest_users_pin where type='3' and board_id='{$results[res].board_id}'"))}


<div class='item' style="height:70px;width:350px;float:left;border:2px solid aqua" data-id="{$results[res].id}">

    <div class="datadiv" >

<div style="margin-top:3px;width:40%;float:left;margin-left:15px">{$nn} news {$vn} videos {$in} images {$wn} webpages</div>

          </div>

  </div>

 {/section}

{/if}     

</div>

</body>
</html>

我认为,由于我正在从Smarty循环中逐个构建一个div,我别无选择,只能在循环中一次获取每个div的mysql数据。有没有办法让我在php文件中获取每个div的数据,然后分配它并在循环期间在Smarty中使用它?

3 个答案:

答案 0 :(得分:4)

在Smarty模板中执行SQL会首先失败使用模板系统的目的。在控制器文件中处理它。

我对PHP的sql方法有点生疏,所以使用正确的实现方法进行调整。解决方案1:

$smarty->display('beginning_of_view.tpl');
$q = $db->query('your query for all the divs');

while($row = mysql_fetch_assoc($q))
{
  $smarty->assign('row', $row);
  $smarty->display('my_div.tpl');
}
$smarty->display('end_of_view.tpl');

解决方案2(可能是更好的方法):

$rows = array();
$q = $db->query('your query for all the divs');

while($row = mysql_fetch_assoc($q))
{
  $rows[] = $row;
}
$smarty->assign('rows', $rows);
$smarty->display('template.tpl');

//In your template
{foreach $rows as $row}
{$row}
{/foreach}

希望这可以解决这个问题。

答案 1 :(得分:2)

您将mysql_fetch_array返回的数组分配给smarty变量,然后使用smarty循环

以下是一个例子:

你的php文件:

<?php
$arr = array(1000, 1001, 1002);
$smarty->assign('myArray', $arr);
?>

你聪明的模板

 {foreach from=$myArray item=foo}
     {$foo}
 {/foreach}

修改

根据您的要求,您应该使用多元/嵌套数组,看看这个问题: php smarty loop multidimensional array

答案 2 :(得分:0)

在你的php中,在主查询循环中执行4个查询(来自你的tpl的查询),并将结果作为字段添加到$ row:

<?php

$c=$db->query("select * from ".USERS_PIN."");        
$cdata = array();

while ($row = mysql_fetch_array($c))
            {
            $d = $db->query("select * from pinrest_users_pin where type='4' and     board_id=".$row['board_id']);
            $row['wn'] = mysql_fetch_array($d); // repeat 4X
            $cdata[] =  $row;
            }

$smarty->assign("results", $cdata);        
$smarty->display('stack.tpl');        
?>

然后在tpl中使用$ results [res] .wn在你的div中。