小弟刚学php。因为书上没有讲模板,所以对模板还是比较头疼。
这里有个问题不太明白希望大家帮下忙。就是,我从数据库里查询出来结果了,但是怎么在模板里应用呢?
$db=new mysql(DB_HOST,DB_USER,DB_PW,DB_NAME,"conn","gbk");
$SQL="select catName,url from gen_category";
$rs=$db->query($SQL); 
while($row = $db->fetch_array($rs))  
{
echo  $row['url']." ".$row['catName'];
}
这样是可以正确输出查询结果的。不过我想应用在模板里,模板就随便自己定义一个吧:
<ul>
<!--{loop 这里还要变量?如何使用?}-->
<li><a href="{CatUrl}">{catTitle}</a>
<!--{/loop}-->
</ul>
小弟主要是不明白怎么将查询结果用这个模板输出。那个loop是如何循环的。当然这个模板也许写得不正确。麻烦给纠正一下。非常感谢。

解决方案 »

  1.   

    模板说白了就是个html文件,做好标记的html文件
    php中读入模板,把模板中的标记替换成输出内容,输出就可以了。
    这样做的目的是代码与显示分离,便于管理。模板有很多,smarty.....
    还有一些轻良级的,仅一个类。很好用。
      

  2.   

    谢谢楼上。
    因为我是初学,想先熟悉一下使用模板。smarty一定是要用的。不过我现在用它还有点难度。
    楼上朋友说的替换变量,我也是这么做的,单个替换还会,循环那个就不知道要如何替换了。
    麻烦指教。谢谢。
      

  3.   

    如果我用
    while($row = $db->fetch_array($rs))  
    {
    $tpl -> repl("CatUrl",$row['url']);
    $tpl -> repl("catTitle",$row['catName']);
    }
    $tpl这个变量就是引用html文件创建的模板对象。
    这个可以替换并正确输出一个结果,呵呵,但是循环该怎么用呢。
    模板如果不正确可以给小弟修改一下。因为那个loop的用法我还不太会。
      

  4.   

    简单的页面模板out.html<html>
    <head>
    <title>标题</title><body>
    <h2>{title}</h2>
    </body>
    </html>
    </head>
    php引用模板输出require_once("template_class.php");
    $out="显示输出的标题";$p = new template( "./template" );//模板是放在template目录下的
    $p->set_file( "handle", "out.html" );
    $p->set_var( "title", $out );
    $p->parse( "output", "handle" );
    $p->p( "output" );
    用了一个模板的类 “template_class.php”
    付上:<?php
    class template
    { var $classname = "Template";
    var $debug = false;
    var $file = array( );
    var $root = "";
    var $varkeys = array( );
    var $varvals = array( );
    var $unknowns = "remove";
    var $halt_on_error = "yes";
    var $last_error = ""; function template( $root = ".", $unknowns = "remove" )
    {
    $this->set_root( $root );
    $this->set_unknowns( $unknowns );
    } function set_root( $root )
    {
    if ( !is_dir( $root ) )
    {
    $this->halt( "设置目录: {$root} 不是一个目录文件." );
    return false;
    }
    $this->root = $root;
    return true;
    } function set_unknowns( $unknowns = "keep" )
    {
    $this->unknowns = $unknowns;
    } function set_file( $handle, $filename )
    {
    if ( !is_array( $handle ) )
    {
    if ( $filename == "" )
    {
    $this->halt( "设置文件句柄: 句柄->{$_obfuscate_aGFuZGxlzsS8sP7zqq1Q}." );
    return false;
    }
    $this->file[$handle] = $this->filename( $filename );
    }
    else
    {
    reset( $handle );
    while ( list( $h, $f ) = each( $handle ) )
    {
    $this->file[$h] = $this->filename( $f );
    }
    }
    } function set_block( $parent, $handle, $name = "" )
    {
    if ( !$this->loadfile( $parent ) )
    {
    $this->halt( "设置文本体: 没有加载成功{$parent}." );
    return false;
    }
    if ( $name == "" )
    {
    $name = $handle;
    }
    $str = $this->get_var( $parent );
    $reg = "/<!--\\s+BEGIN {$handle}\\s+-->(.*)\n\\s*<!--\\s+END {$handle}\\s+-->/";
    preg_match_all( $reg, $str, $m );
    $str = preg_replace( $reg, "{".$name."}", $str );
    $this->set_var( $handle, $m[1][0] );
    $this->set_var( $parent, $str );
    } function set_var( $varname, $value = "" )
    {
    if ( !is_array( $varname ) )
    {
    if ( !empty( $varname ) && $this->debug )
    {
    print "变量: 设置 *{$varname}* -> *{$value}*<br>\n";
    }
    $this->varkeys[$varname] = "/".$this->varname( $varname )."/";
    $this->varvals[$varname] = $value;
    }
    else
    {
    reset( $varname );
    while ( list( $k, $v ) = each( $varname ) )
    {
    if ( !empty( $k ) && $this->debug )
    {
    print "变量数组: 设置 *{$k}* -> *{$v}*<br>\n";
    }
    $this->varkeys[$k] = "/".$this->varname( $k )."/";
    $this->varvals[$k] = $v;
    }
    }
    } function subst( $handle )
    {
    if ( !$this->loadfile( $handle ) )
    {
    $this->halt( "获取文件: 不能载入文件 {$handle}." );
    return false;
    }
    $str = $this->get_var( $handle );
    $str = @preg_replace( $this->varkeys, $this->varvals, $str );
    return $str;
    } function psubst( $handle )
    {
    print $this->subst( $handle );
    return false;
    } function parse( $target, $handle, $append = false )
    {
    if ( !is_array( $handle ) )
    {
    $str = $this->subst( $handle );
    if ( $append )
    {
    $this->set_var( $target, $this->get_var( $target ).$str );
    }
    else
    {
    $this->set_var( $target, $str );
    }
    }
    else
    {
    reset( $handle );
    while ( list( $i, $h ) = each( $handle ) )
    {
    $str = $this->subst( $h );
    $this->set_var( $target, $str );
    }
    }
    return $str;
    } function pparse( $target, $handle, $append = false )
    {
    print $this->parse( $target, $handle, $append );
    return false;
    } function get_vars( )
    {
    reset( $this->varkeys );
    while ( list( $k, $v ) = each( $this->varkeys ) )
    {
    $result[$k] = $this->varvals[$k];
    }
    return $result;
    } function get_var( $varname )
    {
    if ( !is_array( $varname ) )
    {
    return $this->varvals[$varname];
    }
    else
    {
    reset( $varname );
    while ( list( $k, $v ) = each( $varname ) )
    {
    $result[$k] = $this->varvals[$k];
    }
    return $result;
    }
    } function get_undefined( $handle )
    {
    if ( !$this->loadfile( $handle ) )
    {
    $this->halt( "获得未定义句柄: 不能加载模板{$handle}." );
    return false;
    }
    preg_match_all( "/\\{([^}]+)\\}/", $this->get_var( $handle ), $m );
    $m = $m[1];
    if ( !is_array( $m ) )
    {
    return false;
    }
    reset( $m );
    while ( list( $k, $v ) = each( $m ) )
    {
    if ( !isset( $this->varkeys[$v] ) )
    {
    $result[$v] = $v;
    }
    }
    if ( count( $result ) )
    {
    return $result;
    }
    else
    {
    return false;
    }
    } function finish( $str )
    {
    switch ( $this->unknowns )
    {
    case "keep" :
    break;
    case "remove" :
    $str = preg_replace( "/{[^ \\t\\r\\n}]+}/", "", $str );
    break;
    case "comment" :
    $str = preg_replace( "/{([^ \\t\\r\\n}]+)}/", "<!-- Template {$handle}: Variable \\1 undefined -->", $str );
    break;
    }
    return $str;
    } function p( $varname )
    {
    print $this->finish( $this->get_var( $varname ) );
    } function get( $varname )
    {
    return $this->finish( $this->get_var( $varname ) );
    } function filename( $filename )
    {
    if ( substr( $filename, 0, 1 ) != "/" )
    {
    $filename = $this->root."/".$filename;
    }
    if ( !file_exists( $filename ) )
    {
    $this->halt( "模板: {$filename} 不存在." );
    }
    return $filename;
    } function varname( $varname )
    {
    return preg_quote( "{".$varname."}" );
    } function loadfile( $handle )
    {
    if ( isset( $this->varkeys[$handle] ) && !empty( $this->varvals[$handle] ) )
    {
    return true;
    }
    if ( !isset( $this->file[$handle] ) )
    {
    $this->halt( "载入模板: {$_obfuscate_aGFuZGxlsrvKx9K7uPbVci3tcS_5LH6}." );
    return false;
    }
    $filename = $this->file[$handle];
    $str = implode( "", @file( $filename ) );
    if ( empty( $str ) )
    {
    $this->halt( "载入模板: 句柄{$handle}, {$_obfuscate_ZmlsZW5hbWWyu7Tm1Nq78tXfyse1c7EvP4}." );
    return false;
    }
    $this->set_var( $handle, $str );
    return true;
    } function halt( $msg )
    {
    $this->last_error = $msg;
    if ( $this->halt_on_error != "no" )
    {
    $this->haltmsg( $msg );
    }
    if ( $this->halt_on_error == "yes" )
    {
    exit( "<b>程序终止.</b>" );
    }
    return false;
    } function haltmsg( $msg )
    {
    printf( "<b>模板调用错误:</b> %s<br>\n", $msg );
    }}?>
      

  5.   

    看看 smarty 的手册吧,简单的赋个值,做个循环还是很简单的。
      

  6.   


    嗯。这个是单个输出。如果是数据库查询然后用循环输出呢,那个loop是如何用的?
      

  7.   

    对于循环简单的做法就是
    while($row = $db->fetch_array($rs))   
    {
      $out =$out . $row['url']."&nbsp;".$row['catName'];
    }
    把所有要输出的赋值个一个字符串,然后一次性输出这个字符串就可以了。
    当然这个输出也可以做的规范一点
    $out = $out."<li>".$row['url']."&nbsp;".$row['catName']."</li>\n";
    或 $out = $out."<tr><td>".$row['url']."&nbsp;".$row['catName']."</td></tr>\n";
    等等
      

  8.   

    谢谢建议。能不能说下那个循环中的赋值是怎么用的?是不是loop里变量的值就是查询数据库后赋值的那个变量?
      

  9.   

    也可以多个模板一起用
    一个大模板和一个用与循环显示的模板例如: <tr bgcolor="#ffffff">
        <td height="20" colspan="3" align="center" class="k_all"><input name="nid[]" type="checkbox" value="{nid}"></td>
        <td align="center" class="k_all"><span class="font2">{nid}</span></td>
        <td align="left" class="k_all">&nbsp;{title}&nbsp;&nbsp;{fix}</td>
        <td align="center" class="k_all">&nbsp;<span class="font2">{contcount}</span></td>
        <td align="center" class="k_all">&nbsp;<span class="font2">{addtime}</span></td>
     </tr>这个就上用与循环显示的模板用这个模板就可以直接用你自己第的代码了,直接显示不必在给字符串变量赋值了。
      

  10.   

    5楼的是phplib的模板<?php
    function sql_var()
    {
         $db=new mysql(DB_HOST,DB_USER,DB_PW,DB_NAME,"conn","gbk");
         $SQL="select catName,url from gen_category";
         $rs=$db->query($SQL);  
         while($row = $db->fetch_array($rs))   
         {
              $arr[]=$row;//数据集赋值到数组
         }
         return $arr;//返回数组
    } require('Smarty.class.php');//包含smarty模板类 $tpl = new Smarty();//初始化
          
            $tpl->template_dir = "template/index/";//模板文件,    .tpl  .html
    $tpl->compile_dir = "libs/templates_c/";//页面缓冲文件夹,LINUX需要读写权限, chmod 777
    $tpl->left_delimiter = "<{"; //文件里的模板变量就是  <{$var}> 而不是 {$var},也可以不设置我设置主要是对JS处理
           $tpl->right_delimiter = "}>";//文件里的模板变量就是  <{$var}> 而不是 {$var},也可以不设置我设置主要是对JS处
            $tpl->assign('Variable',sql_var());//数组传入到模板变量进行处理,Variable在index.html文件里
            $tpl->display(index.html); //输出
    ?>
    //index.html文件里
    <ul>
     <{section name=lp loop=$Variable }>
    <li><a href="<{$Variable[lp].CatUrl}>"><{$Variable[lp].catTitle}></a>
     <{/section}>
    </ul>
    //呃 还不明白  搜搜资料
      

  11.   

    要别人说,还不如自己好好看手册。
    手册上都有例子的。貌似smarty里没有loop吧。记不清楚了,好象是哈。
    DZ里我知道有loop
      

  12.   

    嗯。谢谢各位的热心帮助。
    我先结贴,如果用我自己的模板搞不定的话,我就直接去学习smarty或phplib去。
      

  13.   

    奇怪,
         while($row = $db->fetch_array($rs))   
         {          $arr[]=$row;//数据集赋值到数组
         }
         echo $arr[0][0];
    这样能输出内容,但是在模板里却没有内容输出?
    大侠再给解释一下吧。谢谢。
      

  14.   

    晕,原来是变量名写错了。OK。多谢ihefe
    给分少了点。