如何从 Smarty 中访问 Mysql 结果集


How does one access a Mysql result set from within Smarty?

我的网站显示一组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 中做类似的事情?Smarty 是否有mysql_fetch_array替代方法来访问结果集?

提前感谢!

编辑:有人建议我应该从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 中使用它?

在 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}

希望这能传达出这个想法。

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

下面是一个示例:

你的 PHP 文件:

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

您的智能模板

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

编辑:

对于您的要求,您应该使用多提及/嵌套数组,请查看以下问题:PHP智能循环多维数组

在你的 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 中。