首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

收藏此问题 发表新评论

论坛新手测试第一题

第一题

第一题是辉老大出的:
      用smarty的foreach将数据库中查询的出的记录做一个列表


帖子暂时就不封了,大家写出来就在下面跟帖吧


:lol 先看看效果
:lol 希望更多的建议
昵称: juck  时间: 2007-08-13 09:12:00
你要什么效果?

你是让大家答题呢?还是让大家出题呢?
答题的话,你要的列表是什么,没说清楚啊。
出题的话,你要哪一类的题目?
昵称: faallan  时间: 2007-08-13 10:54:00
比如你记录的是新闻,用PHP查询出记录,存成数组,然后用SMARTY的FOREACH生成表格,字段有标题和添加日期。例子:
新闻1         2007-1-1
新闻2         2007-1-1
。。。。
这下理解了把
昵称: leehui1983  时间: 2007-08-13 10:57:00
看一下
昵称: wretch  时间: 2007-08-13 10:58:00
:$ :$ :$ 这题太有难度了 我等着看高手
昵称: ruhong65  时间: 2007-08-13 12:04:00
引用:
原帖由 ruhong65 于 2007-8-13 12:04 发表
:$ :$ :$ 这题太有难度了 我等着看高手
:L 那到底从哪个问题开始呢
昵称: juck  时间: 2007-08-13 12:37:00
是不是把数据库里的数据先调出来?存入数组?
再用foreach遍历数组的功能把数据输出?
表格按数组的标示符来定行数`例如array[1]则为第一行
这个是我的思路 不知道对不对
昵称: xox9001  时间: 2007-08-13 14:22:00
这题是用section更简单些 :$ :$ :$ :$ 其实老大就是想考考我们换一种方法解决问题的能力:$ :$ :$ :$ :$ :$ :$
昵称: ruhong65  时间: 2007-08-13 14:58:00
万恶的discuz每帖3个表情 :$ :$ :$ 我又看到7楼的美女头像了
昵称: ruhong65  时间: 2007-08-13 14:59:00
section...
昵称: 天之魔神  时间: 2007-08-13 16:10:00
引用:
原帖由 juck 于 2007-8-13 09:12 发表
第一题

第一题是辉老大出的:
      用smarty的foreach将数据库中查询的出的记录做一个列表
呵呵,先来说一下 foreach  在 smarty 中的定义,下面是我引用手册里面的解释
引用:
foreach 是除 section 之外处理循环的另一种方案(根据不同需要选择不同的方案).
foreach 用于处理简单数组(数组中的元素的类型一致),它的格式比 section 简单许多,缺点是只能处理简单数组.
foreach 必须和 /foreach 成对使用,且必须指定 from 和 item 属性.
name 属性可以任意指定(字母、数字和下划线的组合).
foreach 可以嵌套,但必须保证嵌套中的 foreach 名称唯一.
from 属性(通常是数组)决定循环的次数.
foreachelse 语句在 from 变量没有值的时候被执行.
所以这里我就说一下我的对上面的理解了
上面说:根据不同需要选择不同的方案
所以,我有理由相信,foreach在Smarty中存在的道理,而且大家都知道存在即真理的道理吧,呵呵

其次, foreach用于处理简单数组(数组中的元素的类型一致),它的格式比 section 简单许多,缺点是只能处理简单数组.

既然是处理简单数组,那么我想: 他的解析负担可能就要小,因此解析速度可能就要相对section要快一点.
(只是想法,有兴趣的PHPER可以证明一下:)  )

虽然我接触 smarty 不多,但是我以前有做DEDE模板的经验
所以对于 smarty 的思路也比较好上手.

所以,我就先献丑一下了,把代码贴上

为了答题,我重新建立了一个数据表, 里面只有3个字段:(里面只有两行数据,就是为了答题而设立的)
复制PHP内容到剪贴板
PHP代码:
id
title
date

然后写一下页面
复制PHP内容到剪贴板
PHP代码:

<?php
include_once('libs/Smarty.class.php');  //包含 SMARTY 类
//全局变量
$DBHOST 'localhost';
$DBUSER ' ';
$DBPWD ' ';
$DBNAME 'phptest';

//建立Smarty函数

        
$smarty = new Smarty();
        
$smarty->template_dir ='templates';
        
$smarty->compile_dir ='templates_c';
        
$smarty->left_delimiter ='<{';
        
$smarty->right_delimiter ='}>';
///////////////////////////////////////////////////////////////
$con mysql_connect($DBHOST,$DBUSER,$DBPWD);
mysql_select_db($DBNAME,$con);
///////////////////////////////////////////////////////////////
$query 'select * from smarty order by id desc';
$result mysql_query($query);
while (
$row mysql_fetch_array($result))
{
        
$array[] = array('title'=> $row['title'],'date'=> $row['date']);
}

$smarty->assign('news',$array);

mysql_close($con);

$smarty->display('news.html');


?>

现在我再把 news.html 的核心部分贴出来
复制PHP内容到剪贴板
PHP代码:
<{foreach item=item1 from=$news}>
<{foreach 
key=key item=item from=$item1}>
<{
$key}>:<{$item}>
<{/foreach}>
<
br/>
<{/foreach}>


这样,就实现了 辉老大题目的要求了.(已经在我机子上测试了)

其实 foreach 就是一个数组的调用, 用一次 foreach,就是表示调用一维数组,用两个,就是表示调用二维

其中  item=var  这个 var 就是数组中的一个变量, 第二种循环是从第一个变量中再把他当作数组来对待
所以调用了两次FOREACH

可能说的不太清除,麻烦辉老大讲一下吧!


另: 请大家尊重版主的劳动,毕竟他也是在为社区做贡献

[ 本帖最后由 njuptsoz 于 2007-8-13 18:23 编辑 ]
昵称: njuptsoz  时间: 2007-08-13 17:00:00
老大 别生气 来亲亲:$
昵称: ruhong65  时间: 2007-08-13 17:00:00
亲爱的,生嘛气嘛
昵称: zwws  时间: 2007-08-13 17:03:00
16楼是小老婆
昵称: ruhong65  时间: 2007-08-13 17:04:00
引用:
原帖由 zwws 于 2007-8-13 17:03 发表
亲爱的,生嘛气嘛
:lol
昵称: leehui1983  时间: 2007-08-13 17:09:00
我来解释下为什么用foreach,因为你们如果初学smarty,可能会觉得section好用,原因是你们数据查询记录很可能不是用数组返回的,在实际的框架开发中,基本上是查询记录用数组返回,结合smarty的foreach可以轻松实现列表,这里我都是用实际开发经验说话,如果那个家伙还认为我在扯淡,尽管来骂,我从来不再论坛误导别人,论坛熟悉我的朋友都清楚,某些没文化的不服气可以继续在夜色开一帖进行人身攻击,老子奉陪到底,但是不要在技术区影响论坛学习气氛和大家发帖积极性。
昵称: leehui1983  时间: 2007-08-13 17:14:00
仿section效果...抛砖了,想看体现foreach的存在价值,辉老大不能闲啊,有空的话把你的经验用代码演示show出来(手动初始化一个示例数组即可)


article.php
复制PHP内容到剪贴板
PHP代码:

<?php

// 示例, 省略了实例化Smarty的过程 :) 

$articles = array(array('aa'=>11,'ab'=>12,'ac'=>13),array('ba'=>21,'bb'=>22,'bc'=>23),array('ca'=>31,'cb'=>32,'cc'=>33));

$tpl->assign('articles'$articles);

$tpl->display('article.tpl');

?>

article.tpl
复制PHP内容到剪贴板
PHP代码:
<table width="1001" border="1" cellpadding="3" bordercolor="#000000">
{
#foreach from=$articles item=article#}
    
<tr>
{
#foreach from=$article item=varvalue key=varname#}
        
<td>{#$varname#}:{#$varvalue#}</td>
{#/foreach#}
    
</tr>
{
#foreachelse#}
    
<tr>
        <
td>没有任何数据</td>
    </
tr>
{
#/foreach#}
</table>

输出效果:


感言:
输出文章的确没section好用... 不过foreach倒也灵活哈~


手册只给你知道,没动手是没深切体会的.

这个活动很有意义撒,希望坚持下去!


[ 本帖最后由 zwws 于 2007-8-13 17:40 编辑 ]
昵称: zwws  时间: 2007-08-13 17:30:00
宣传不力,都不置顶
昵称: zwws  时间: 2007-08-13 18:15:00
:lol
昵称: lmhllr  时间: 2007-08-13 18:17:00
各位phper的香吻一个...it's free!
昵称: zwws  时间: 2007-08-13 18:32:00
浪费我宝贵的上网时间,看大师兄的smarty教程中就有。
昵称: jtql420  时间: 2007-08-13 19:28:00
你去死吧...记住你的id了...
昵称: zwws  时间: 2007-08-13 19:37:00
引用:
原帖由 njuptsoz 于 2007-8-13 17:00 发表


呵呵,先来说一下 foreach  在 smarty 中的定义,下面是我引用手册里面的解释


所以这里我就说一下我的对上面的理解了
上面说:根据不同需要选择不同的方案
所以,我有理由相信,foreach在Smarty中存在的道 ...
njuptsoz 很用心啊,呵呵,不过我要指出你在smarty中使用foreach的不足,之所以鼓励大家用foreach生成列表,就在于他的简单,好理解,看你的代码:
<{foreach item=item1 from=$news}>
<{foreach
key=key item=item from=$item1}>
<{
$key}>:<{$item}>
<{/foreach}>
<
br/>
<{/foreach}>

用了两个foreach嵌套,你试试改成这样看看:
<{foreach item=item from=$item1}>
<{
$item.date}>:<{$item.title}>

<br>
<{/foreach}>

在smarty中,调用数组值可以用   数组名.key的形式调用,是不是很方便,另外,左右边界符号建议用<!--{   }-->,这样模板上用dw编辑不会出现乱七八糟一大堆smarty标签,便于修改。小小的问题还是值得大家思考下,程序不是能运行就可以了,对自己要高要求,想想怎样才能是她更优,这样才有进步!希望各位新手已开始就能有这种观念,加油~
昵称: leehui1983  时间: 2007-08-13 19:48:00
引用:
原帖由 jtql420 于 2007-8-13 19:28 发表
浪费我宝贵的上网时间,看大师兄的smarty教程中就有。
不爽你别参加,别以为你多强,垃圾!!!!!!自然有好学的新手参加,这里不需要你
昵称: leehui1983  时间: 2007-08-13 19:49:00
引用:
原帖由 zwws 于 2007-8-13 17:30 发表
仿section效果...抛砖了,想看体现foreach的存在价值,辉老大不能闲啊,有空的话把你的经验用代码演示show出来(手动初始化一个示例数组即可)


article.php

[php]
看下smarty,foreach调用数组的用法,你会发现它非常好理解,我已经给出答案了,大家动手试试

[ 本帖最后由 leehui1983 于 2007-8-13 20:06 编辑 ]
昵称: leehui1983  时间: 2007-08-13 19:51:00
大家看完就应该推出,如果查询出单条记录,将结果以数组形式调出的话,例如:刚才的新闻记录,某条信息返回结果数组,
我们定义成rs的话,就可以这样在smarty中调用:$tpl->assign('rs',$rs);
模板内容:<!--{$rs.date}-->:<!--{$rs.title}-->^_^
昵称: leehui1983  时间: 2007-08-13 19:56:00
呵呵,我也尝试过这种方法,这样和section差不多了,偶只是用来njuptsoz 的帖嘛.
引用:
另外,左右边界符号建议用<!--{   }-->,这样模板上用dw编辑不会出现乱七八糟一大堆smarty标签,便于修改。小小的问题还是值得大家思考下,程序不是能运行就可以了,对自己要高要求,想想怎样才能是她更优,这样才有进步!希望各位新手已开始就能有这种观念,加油~
我加了个插件(自己改装过的),很符合自己的使用习惯
昵称: zwws  时间: 2007-08-13 20:02:00
看来小Z进步很大,快教不了你了:)
昵称: leehui1983  时间: 2007-08-13 20:05:00
大家有兴趣的关注下,明天我出第二题,就是在这个基础上进一步拓展开来,还没理解的朋友,快快跟帖,或者自己动手实践
昵称: leehui1983  时间: 2007-08-13 20:10:00
其实我懒的很...宁愿发呆.

不过有这种活动就好了,也算是一种动力.

感谢辉老大抽空撒...撒花 :lol
昵称: zwws  时间: 2007-08-13 20:16:00
有人参加的话我会继续的:lol
昵称: leehui1983  时间: 2007-08-13 20:18:00
可惜了.不会smarty....不过还是要顶的:lol
昵称: wukeyuan  时间: 2007-08-13 20:21:00
这次是个好机会.一起加油
昵称: zwws  时间: 2007-08-13 20:24:00
引用:
原帖由 leehui1983 于 2007-8-13 20:18 发表
有人参加的话我会继续的:lol
"奸诈"
昵称: zwws  时间: 2007-08-13 20:25:00
:) kaka
昵称: qjy1984  时间: 2007-08-14 00:30:00
引用:
原帖由 leehui1983 于 2007-8-13 19:48 发表

njuptsoz 很用心啊,呵呵,不过我要指出你在smarty中使用foreach的不足,之所以鼓励大家用foreach生成列表,就在于他的简单,好理解,看你的代码:


:



用了两个foreach嵌套,你试试改成这样看看: ...
爽哦,还真的可以,我之前还认为只有 section 可以哦

看来 smarty 还真方便, 你什么时候写一个smarty的精华啊
昵称: njuptsoz  时间: 2007-08-14 01:07:00
不会就学习下,其实现在的也不难,一起学习
昵称: �����i�i  时间: 2007-08-14 02:53:00
引用:
原帖由 njuptsoz 于 2007-8-14 01:07 发表


爽哦,还真的可以,我之前还认为只有 section 可以哦

看来 smarty 还真方便, 你什么时候写一个smarty的精华啊
呵呵,有学到东西还是不错吧:lol
昵称: leehui1983  时间: 2007-08-14 08:17:00
上次有兴趣的朋友已经做了第一题(http://www.phpchina.com/bbs/thread-32975-1-2.html),今天我继续出第二题,文件缓存在实际开发中非常常用,今天我继续出个关于这方面的题目:
  接着上次的题目,假设上次做的新闻列表要添加到对应类别,那么好,做个程序,设计个数据库,支持1及分类即可,添加类别后,数据库中插入记录后,用PHP的文件读写函数生成一个数组文件,格式如下:
复制PHP内容到剪贴板
PHP代码:

<?php return array (
  
15 => '综合资讯',
  
16 => '学科资讯',
  
48 => '数学',
  
49 => '语文',
  
50 => '英语',
  
51 => '理综',
  
52 => '文综',
  
55 => '高考资讯',
  
56 => '中考资讯',
  
57 => '其它考试',
); 
?>

其中数组KEY是类别ID名,值是类别名称,然后做个添加新闻的页面,要求文本编辑用FCKEDITOR,同样用SMARTY的FOREACH在模板中生成类别下拉筐,添加新闻到对应类别,当类别添加,编辑,删除后,重新生成,缓存文件。这样,每次添加新闻就不用读取数据库,用昨天做的列表页显示添加的新闻,能支持分类浏览。分类支持添加,删除,编辑。提示:FCKEDITOR可以用JS在模版中生成,请查看示例。
昵称: leehui1983  时间: 2007-08-14 13:32:00
庆幸,昨儿占的位子还在!(错过了第一题,真是可惜!)

代码超级烂,高手略过不看!只能说实现了一些功能。。。。。。。。。

这个是新闻列表页,支持分类显示,添加新闻也在这里~
复制PHP内容到剪贴板
PHP代码:

<?php
/*test by gently(徐徐)
*日期:2007年8月14日
*文件:newslist.php
*本人癖好:喜欢用X这个字母。*^__^*
*因为第一个例子我错过了,补着看了一下,还是不太明白是什么意思,也许需求文档就是这样的吧!
*/
require_once("smarty/Smarty.class.php");
require_once(
"config.php");
        
$cachefile=dirname(__FILE__)."/cache/cache_categories.php";
        
$lnk=mysql_connect($dbhost,$dbuser,$dbpwd);
        
mysql_query("set names utf8");
        
mysql_select_db($dbname,$lnk);
        if(empty(
$_GET['p'])){
                
$mysqlstr="select * from {$dbprefix}news";
        }
        else{
                
$p=$_GET['p'];
                
$mysqlstr="select * from {$dbprefix}news where xcategories=$p";
        }
        
$newsres=mysql_query($mysqlstr);
        while(
$nlarray=mysql_fetch_array($newsres)){
                
$newslist[]=$nlarray;
        }
if (!
file_exists($cachefile)){
        
$res=mysql_query("select * from {$dbprefix}categories");
        while(
$arr=mysql_fetch_array($res)){
                
$smartyarr[]=array("xkey"=>$arr['xkey'],"xvalue"=>$arr['xvalue']);
        }
}
else{
        include(
$cachefile);
}
//print_r($newslist) && exit;
$smarty=new Smarty;
$smarty->template_dir="skins";
$smarty->compile_dir="cache/cache_c";
$smarty->left_delimiter ="<!--{";
$smarty->right_delimiter="}-->";
$smarty->assign("newslist",$newslist);
$smarty->assign("xarray",$smartyarr);

$smarty->display("newslist.tpl");
?>

新闻列表页的模板
复制内容到剪贴板
代码:
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head><title>新闻列表-SMARTY学习</title>
<script type="text/javascript" src="gentlyfck/fckeditor.js"></script>
<script type="text/JavaScript">
<!--
function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}
//-->
</script>
</head>
<body>
<table width="90%" border="0" cellspacing="0" cellpadding="0" summary="所有的新闻都在这里了!!" align="center">
  <caption>
    新闻列表
  </caption>
  <tr>
    <th width="5%" nowrap scope="col">ID</th>
    <th width="50%" nowrap scope="col">新闻标题</th>
    <th width="30%" nowrap scope="col">归属分类</th>
    <th width="25%" nowrap scope="col">添加时间</th>
  </tr>
  <!--{foreach from=$newslist item=newsitem}-->
  <tr align="center" valign="middle">
    <td nowrap><!--{$newsitem.xnid}--></td>
    <td nowrap><a href="newscontent.php?nid=<!--{$newsitem.xnid}-->"><!--{$newsitem.xnewstitle}--></a></td>
    <td nowrap>
          <!--{foreach from=$xarray item=ccitem}-->
    <!--{if $ccitem.xkey==$newsitem.xcategories}-->
    <!--{$ccitem.xvalue}-->
    <!--{/if}-->
    <!--{/foreach}-->
    </td>
    <td nowrap><!--{$newsitem.xnewstime}--></td>
  </tr>
<!--{/foreach}-->
</table>
<form name="form2">
  分类浏览:<select name="Xmenu" onChange="MM_jumpMenu('parent',this,0)">
  <!--{foreach from=$xarray item=xitem1}-->
    <option value='?p=<!--{$xitem1.xkey}-->'><!--{$xitem1.xvalue}--></option>
  <!--{/foreach}-->
  </select>真的快累趴下了,已经坐了5个多小时,从14号坐到了15号!!!
</form>
<h2>添加新闻(新闻仅有添加功能)</h2>
<form name="form1" method="post" action="newsadd.php">
  <p><label for="newsTitle">新闻标题:</label>
  <input name="newsTitle" type="text" id="newsTitle" size="50"></p>
  <p><label for="categories">归属分类</label>
  <select name="categories" id="categories">
  <!--{foreach from=$xarray item=xitem1}-->
    <option value='<!--{$xitem1.xkey}-->'><!--{$xitem1.xvalue}--></option>
  <!--{/foreach}-->
  </select>  <a href="perfect_cat.php">分类维护</a>   
   <label>加入时间:</label><!--{html_select_date}--></p>
   <label>新闻内容:</label><script type="text/javascript">
var xBasePath ="gentlyfck/";
//感谢辉老大的提示,不知道用SMARTY中插PHP代码再实例化一个FCK,会不会比这种方法慢??
var gentlyFck = new FCKeditor( 'newscontent' ) ;
gentlyFck.BasePath        = xBasePath ;
gentlyFck.Height        = 350 ;
gentlyFck.Value        = 'gently着实是个菜菜鸟,但是很用心,还是不遗余力,老当益壮的学习着PHP,我的BLOG:<a href="http://www.zendstudio.net/" target="_blank">www.ZendStudio.net</a>' ;
gentlyFck.Create();
</script>
<p align="center"><input name="submit" type="submit" value="提交"/>    <input type="reset"/>
</form>

</body>
</html>
分类维护页,支持修改、删除、插入:
复制PHP内容到剪贴板
PHP代码:

<?php
/*test by gently(徐徐)
*文件:perfact_cat.php
*日期:2007年8月14日
*
******************/
header('Content-Type: text/html; charset=utf-8');
require_once(
"smarty/Smarty.class.php");
require_once(
"config.php");
$xselect=$_POST['select'];
$xaction=$_POST['action'];
$xname=htmlspecialchars($_POST['category_name']);
$lnk=mysql_connect($dbhost,$dbuser,$dbpwd);
mysql_query("set names utf8");
mysql_select_db($dbname,$lnk);
$res=mysql_query("select * from {$dbprefix}categories");
while(
$arr=mysql_fetch_array($res)){
$smartyarr[]=array("xid"=>$arr['xid'],"xvalue"=>$arr['xvalue']);
}
switch(
$xaction){
case 
"add":
  if(empty(
$xname)){
    die(
"新增请先填写分类名后再提交!");
   }
  else{
   
$res=mysql_query("select max(xkey) from {$dbprefix}categories" );
   
$xarr=mysql_fetch_array($res);
   
$maxkey=$xarr[0]+1;
   
$sql="insert into {$dbprefix}categories values(null,$maxkey,'$xname')";
   
mysql_query($sql);
   
$myres=mysql_query("select * from {$dbprefix}categories");//非常遗憾的把这句放在这个位置,本来是放在docache()里面的,可是出错!
   
docache($myres);
   exit(
"新增的分类已经成功保存!");
  }
  break;
case 
"delete":
  if(empty(
$xselect)){
   die(
"请选择你要删除的分类先!");
  }
  else{
   
$sql="delete from {$dbprefix}categories where xid=$xselect limit 1";
   
mysql_query($sql);
   
$myres=mysql_query("select * from {$dbprefix}categories");//一样的非常遗憾
   
docache($myres);
   exit(
"选择的分类已经被删除了!");
  }
  break;
case 
"modify":
   if(empty(
$xselect)){
   die(
"请选择你要删除的分类先!");
  }
  else if(empty(
$xname)){
   die(
"新分类的名称需要填写在文本框中!");
  }
  else{
   
$sql="update {$dbprefix}categories set xvalue='$xname' where xid=$xselect limit 1";
   
mysql_query($sql);
   
$myres=mysql_query("select * from {$dbprefix}categories");//还是很遗憾,时间真的很紧,乱做了,有点!
   
docache($myres);
   die(
"修改成功!");
  }
  break;
}
  

$smarty=new Smarty;
$smarty->template_dir="skins";
$smarty->compile_dir="cache/cache_c";
$smarty->left_delimiter ="<!--{";
$smarty->right_delimiter="}-->";
$smarty->assign("xarray",$smartyarr);
$smarty->display("perfect_cat.tpl");
function 
docache($Xres){
$cachefile=dirname(__FILE__)."/cache/cache_categories.php";
$handle=fopen($cachefile,"w+");
fwrite($handle,"<?php\r\$smartyarr=array(");

while(
$myarr=mysql_fetch_array($Xres)){
  
$xxstr='array("xkey"=>'.$myarr['xkey'].',"xvalue"=>'.$myarr['xvalue']."),\r";
  
fwrite($handle,$xxstr);
}
fwrite($handle,");\r?>");
fclose($handle);
}
?>

分类维护页面的模板:
复制内容到剪贴板
代码:
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head><title>分类维护页面-SMARTY学习</title>
<script type="text/javascript" src="gentlyfck/fckeditor.js"></script>
</head>
<body>
<form name="form1" method="post" action="">
<p>分类列表:<br />
  <select name="select" size="10" id="select">
   <!--{foreach item=Xitem from=$xarray}-->
    <option value="<!--{$Xitem.xid}-->"><!--{$Xitem.xvalue}--></option>
    <!--{/foreach}-->
  </select></p>
  <p>对选定项进行:  <input name="action" type="radio" value="delete">删除   <input name="action" type="radio" value="modify">修改(填写到后面文本框)   
    <input name="action" type="radio" value="add">新增:  
    <input name="category_name" type="text" size="16">   
    <input type="submit" name="Submit" value="确定">
</form>
</body>
</html>
新闻内容的显示页面就没有做了~因为我第二天还要上班,当时已经12:00了!

不过的我的缓存的格式是这样的,也不晓得符不符合要求
复制PHP内容到剪贴板
PHP代码:

<?php
$smartyarr
=array(array("xkey"=>15,"xvalue"=>综合资讯),
array(
"xkey"=>16,"xvalue"=>学科资讯),
array(
"xkey"=>48,"xvalue"=>数学),
array(
"xkey"=>49,"xvalue"=>语文),
array(
"xkey"=>50,"xvalue"=>英语),
array(
"xkey"=>51,"xvalue"=>理综),
array(
"xkey"=>52,"xvalue"=>文综),
array(
"xkey"=>55,"xvalue"=>高考资讯),
array(
"xkey"=>56,"xvalue"=>中考资讯),
array(
"xkey"=>57,"xvalue"=>其他考试),
array(
"xkey"=>58,"xvalue"=>test),
);
?>

还是那句老话,不动手永远都学不会,爱因斯坦都动手做的小板凳,而且第一个还做的那么丑,我的智商没有他高,于是只好多动手!

[ 本帖最后由 gently 于 2007-8-15 08:12 编辑 ]
昵称: gently  时间: 2007-08-14 13:33:00
第二题已经出了,可能会难一些,但是新手做完会很有帮助的:)
昵称: leehui1983  时间: 2007-08-14 13:34:00
看看
昵称: 贪睡猪  时间: 2007-08-14 14:06:00
:L
昵称: 贪睡猪  时间: 2007-08-14 14:07:00
?在自己板块设置为高亮然后移动过来?

=.=||
昵称: Phzzy  时间: 2007-08-14 14:18:00
是啊,我来义务组织活动,用点特权不行吗?你们这些基础版的斑竹又不组织,帮你们组织还JJYY,靠,老子也不干了!吃力不讨好!!!!
昵称: leehui1983  时间: 2007-08-14 15:53:00
??????
昵称: sxm8271  时间: 2007-08-14 16:08:00
支持辉老大
昵称: �����i�i  时间: 2007-08-14 16:08:00
辉老大是想把技术版块弄的更活跃些,很好的题目,希望大家都能有所收获
昵称: PHPChina  时间: 2007-08-14 16:22:00
看来朋友门学习热情还是不够啊
昵称: leehui1983  时间: 2007-08-14 16:28:00
:L :L 正在努力记忆指令和代码呢

老师写的板书,看葫芦画葫芦都够呛呢~~~~~:Q
昵称: 虎皮鲨  时间: 2007-08-14 21:14:00
帮顶,我就不做了,懒惰是我最大的爱好!
昵称: phpox  时间: 2007-08-14 21:59:00
为什么一定要采用smarty!
昵称: njuptsoz  时间: 2007-08-14 22:19:00
不厚道!占了沙发,白天想,晚上做

昨晚做的,上午比较忙,没时间贴上来!――做的异常简单,不要拍死我!

复制PHP内容到剪贴板
PHP代码:

<?
class pageList {
var 
$countRec;//总记录数
var $per;//每页显示几条
var $currentPage;//当前页
var $maxPage;//共分几页,也就是最后一页

function __construct($countRec,$currentPage,$per){//参数:总记录条数,当前页,每页显示条数
        
$this->maxPage=ceil($countRec/$per);
        
$this->currentPage=$currentPage;
        
$this->countRec=$countRec;
        
$this->per=$per;
}

function 
gentlyPrint(){
        
$pageListBar="共有新闻".$this->countRec."条 页次: <span style='color:red'>".$this->currentPage"</span>/".$this->maxPage." ".$this->per."条/页 ";
        
$gotoPage=" 转到: <select onchange=\"javascript:window.location=this.options[this.selectedIndex].value;\" size=1 name=page>\r";//显示于右侧的跳转菜单
        
if($this->currentPage==|| $this->currentPage==1){
                
$pageListBar.="首页 上一页 ";
        }
        else{
                
$prvPage=$this->currentPage-1;
                
$pageListBar.="<a href='?p=1'>首页</a> <a href='?p=$prvPage'>上一页</a> ";
        }
        if(
$this->currentPage $this->maxPage){
                
$prvPage=$this->currentPage-1;
                
$nextPage=$this->currentPage+1;
                
$maxPage=$this->maxPage;
                
$pageListBar.="<a href='?p=$nextPage'>下一页</a> <a href='?p=$maxPage'>尾页</a> ";
        }
        else{
                
$prvPage=$this->currentPage-1;
                
$pageListBar.="下一页 尾页 ";
        }
        for(
$i=1;$i<=$this->maxPage;$i++){
                
$currentPage=$this->currentPage;
                if(
$currentPage==0){
                        
$currentPage=1;
                }
                if(
$currentPage==$i){
                        
$gotoPage.="<option value='?p=$i' selected>第{$i}页</option>\r";
                }
                else{
                        
$gotoPage.="<option value='?p=$i'>第{$i}页</option>\r";
                }
        }
        
$gotoPage.="</select>";
        return 
$pageListBar.$gotoPage;        
}
}


调用页面:
复制PHP内容到剪贴板
PHP代码:

<?php
//……省略代码垃圾堆(mysql操纵)……
$currentPage=$_GET['p']+0;
$currentPage >$maxPage && $currentPage=$maxPage;//$maxPage为从mysql获取总记录条数除以每页显示条数后用ceil取整。
require_once("pagelist.inc.php");
$XpageList=new pageList($maxPage,$currentPage,10);
//……省略代码垃圾堆(smarty初始化)……
$smarty->assign("pageList",$XpageList->gentlyPrint());
$smarty->display("newslist.tpl");
?>

[ 本帖最后由 gently 于 2007-8-16 11:57 编辑 ]
昵称: 特蓝克斯  时间: 2007-08-15 10:39:00
:)  思路查不多,摸板引擎我采用的Template_ (韩国的摸板引擎技术)。

看完此贴,还是受益非浅啊。
继续学习。
昵称: gently  时间: 2007-08-15 10:44:00
;P  这也可以?
昵称: 特蓝克斯  时间: 2007-08-15 10:50:00
引用:
原帖由 特蓝克斯 于 2007-8-15 10:39 发表
为什么一定要采用smarty!
这是练习题~~~~~既然叫题目,还用说为什么吗
昵称: 特蓝克斯  时间: 2007-08-15 10:50:00
:lol
昵称: leehui1983  时间: 2007-08-15 11:12:00
:lol
昵称: leehui1983  时间: 2007-08-15 11:13:00
:)  最近偶在给班级做点东西..只研读了一些程序. 没啥进步的啦 .....大家一起加油

辉,坚持哈!

[ 本帖最后由 zwws 于 2007-8-15 12:09 编辑 ]
昵称: leehui1983  时间: 2007-08-15 11:13:00
占位留用
-----------------------

偶又来偷懒哈:lol (分页没写,具体参考默默的一张帖子:) )

效果图::D

不说废话了,直接看代码:

pagebar.php
复制PHP内容到剪贴板
PHP代码:

<?php
/*
  模仿DZ分页栏
  练习及新手参考
  zwws@phpchina 
*/

// 引用smarty
require_once('smarty/Smarty.class.php');
// 初始化smarty
$tpl = new Smarty();
$tpl->template_dir './templates/';
$tpl->compile_dir './templates/_compile';
$tpl->left_delimiter '{#';
$tpl->right_delimiter '#}';

// 数据集(实际使用)
//$queryid = mysql_query("SELECT count(*) FROM {$db_prefix}articles");

// 当前页码
$p = @intval($_GET['p']);
if (!
$p || $p <= 0) {
    
$p 1;
}

// 模拟数据(测试使用)
$queryid null;

// 实例化一个分页条对象(测试使用)
$pagebar = new pagebar($queryid510$p);

// 获得分页页码
$pagelist $pagebar->itemlist();
// 获得分页信息
$pageinfo $pagebar->iteminfo();

// 替换模板变量
$tpl->assign('pagelist'$pagelist);
$tpl->assign('pageinfo'$pageinfo);

/*
  [分页栏输出]

  [说明]:
  此行用于测试分页栏单独输出,实际使用
  时可以用Smarty的fetch()方法,获得分页栏
  的输出(html),并赋于一变量,供文章列表使用.

  例如: 
  ------------------------------------------
  $pagebar_res = $tpl->fetch('pagebar.tpl');
  $tpl->display('article.tpl');
  ------------------------------------------

  [btw]:
  $tpl->display('pagebar.tpl');
  ↑的实际使用效果等价于↓
  echo $tpl->fetch('pagebar.tpl');
*/
$tpl->display('pagebar.tpl');


// 分页栏
class pagebar
{
    
// 数据总数
    
public $mRsCount;
    
// 分页总数
    
public $mPgCount;
    
// 页码显示数
    
public $mItemNum;
    
// 当前页
    
public $mCurrent;

    
// 构造函数(数据集, 每页显示记录数, 页码显示数, 当前页)
    
function __construct($queryid$unitnum$itemnum$current) {

        
// 数据总数(实际使用)
        // $this->mRsCount = mysql_num_rows($queryid);
        // 数据总数(测试使用)
        
$this->mRsCount 500;
        
$this->mPgCount ceil($this->mRsCount $unitnum);
        
$this->mItemNum $itemnum;
        
$this->mCurrent $current;

    }

    
// 分页页码
    
function itemlist() {

        
// 此变量只为以下流程方便调用而设,并无实际含义
        
$compare floor($this->mItemNum 2);

        
// 计算页码
        
if ($this->mPgCount <= $this->mItemNum) {
            
$start 1;
            
$end   $this->mPgCount;
        } else {
            if (
$this->mCurrent <= $compare) {
                
$start 1;
                
$end   $this->mItemNum;
            } elseif (
$this->mCurrent $compare $this->mPgCount) {
                
$start $this->mPgCount $this->mItemNum 1;
                
$end   $this->mPgCount;
            } else {
                
$start $this->mCurrent ceil($this->mItemNum 2) + 1;
                
$end   $this->mCurrent $compare;
            }
        }

        
// 生成页码
        
return range($start$end);

    }

    
// 分页信息
    
function iteminfo() {

        if (
$this->mCurrent == 1) {
            
$prev null;
        } else {
            
$prev $this->mCurrent 1;
        }
        if (
$this->mCurrent == $this->mPgCount) {
            
$next null;
        } else {
            
$next $this->mCurrent 1;
        }

        if (
$this->mCurrent ceil($this->mItemNum 2)) {
            
$first 1;
        } else {
            
$first null;
        }
        if (
$this->mPgCount $this->mCurrent floor($this->mItemNum 2)) {
            
$last $this->mPgCount;
        } else {
            
$last null;
        }

        
$iteminfo = array('first'   => $first
                           
'last'    => $last,
                           
'prev'    => $prev,
                           
'next'    => $next,
                           
'current' => $this->mCurrent,
                           
'rscount' => $this->mRsCount,
                           
'pgcount' => $this->mPgCount);

        return 
$iteminfo;
    }
}

?>

pagebar.tpl(css在包里,这里略了,直接看):
复制PHP内容到剪贴板
PHP代码:
<div id="pagebar">
  <
class="p_total">{#$pageinfo.rscount#}</a>
  
<class="p_pages">{#$pageinfo.current#}<span style="font-weight: normal">/</span>{#$pageinfo.pgcount#}</a>
{#if $pageinfo.first#}
  
<class="p_redirect" href="pagebar.php?p={#$pageinfo.first#}">|&#8249;</a>
{#/if#}
{#if $pageinfo.prev#}
  
<class="p_redirect" href="pagebar.php?p={#$pageinfo.prev#}">&#8249;&#8249;</a>
{#/if#}
{#foreach from=$pagelist item=page#}
  
{#if $page == $pageinfo.current#}
  
<class="p_current">{#$page#}</a>
  
{#else#}
  
<class="p_redirect" href="pagebar.php?p={#$page#}">{#$page#}</a>
  
{#/if#}
{#/foreach#}
{#if $pageinfo.next#}
  
<class="p_redirect" href="pagebar.php?p={#$pageinfo.next#}">&#8250;&#8250;</a>
{#/if#}
{#if $pageinfo.last#}
  
<class="p_redirect" href="pagebar.php?p={#$pageinfo.last#}">&#8250;|</a>
{#/if#}
</div>

所有代码打包了哈,直接解压可以查看、修改::$

pagebar.rar (93.13 KB)

哈哈,交作业的时候还意外发现PHPChina数据库连接失败的页面(大半夜呢,很诡异:lol ),也附上...:L



[ 本帖最后由 zwws 于 2007-8-16 01:39 编辑 ]
昵称: zwws  时间: 2007-08-15 12:07:00
引用:
原帖由 leehui1983 于 2007-8-15 11:12 发表

这是练习题~~~~~既然叫题目,还用说为什么吗
恩,也是。
模板的介入,在程序页面主要就是构造数组,定义标签,以便在模板页面调用,输出。
昵称: zwws  时间: 2007-08-15 12:10:00
可不可以把PHP程序测试题置顶啊,大家也好看到,不要就加精吧
昵称: 特蓝克斯  时间: 2007-08-15 12:23:00
顶一下:)
昵称: 贪睡猪  时间: 2007-08-15 15:18:00
引用:
原帖由 虎皮鲨 于 2007-8-14 21:14 发表
:L :L 正在努力记忆指令和代码呢

老师写的板书,看葫芦画葫芦都够呛呢~~~~~:Q
同感!!
昵称: fly1983  时间: 2007-08-15 15:27:00
呵呵,这提对于新手比较难,希望明天可以看到大家的解答,希望斑竹把各题目的地址写在一个帖子社成置顶帖子就好,不然题目多了,总不能那么多置顶吧:)
昵称: 贪睡猪  时间: 2007-08-15 15:32:00
想通了
原来就是要弄一个分页的类吧
呵呵,我也来偷懒
先把论坛里有人发的分页类发一下
复制PHP内容到剪贴板
PHP代码:

<?php //===================== 分页类=============================
class Pager
{
var 
$infoCount//总记录
var $pageCount//总页数
var $items//每页显示条数
var $pageNo//当前页码
var $startPos//查询的起始位置

function Pager($infoCount$items$pageNo)
{
$this->infoCount $infoCount;
$this->items $items;
$this->pageNo $pageNo;
$this->pageCount $this->GetPageCount();
$this->AdjustPageNo();
$this->startPos $this->GetStartPos();
}
//===============================当记录不合实际是作的调整
function AdjustPageNo()
{
if(
$this->pageNo == '' || $this->pageNo 1)//当前记录数为空或小于一时就把他设置为第一条记录
$this->pageNo 1;
if (
$this->pageNo $this->pageCount)//当前如果比最后一条记录大就把它设置为最后一条
$this->pageNo $this->pageCount;
}
//============================算出总页数
function GetPageCount()
{
return 
ceil($this->infoCount $this->items);
}
//========================算出是从那条记录开始
function GetStartPos()
{
return (
$this->pageNo 1) * $this->items;
}
}

include(
'./db/adodb/adodb.inc.php'); // 引入 ADODB
include("conn.php");
$DB = &ADONewConnection($dbms); // 建立联机对象
$DB->PConnect($mch$user$pwd$database);// 连接至数据库 test

$query=$DB->Execute("select * from user");
$num=$query->RecordCount();//算出总记录
$items=3//指定每页显示几条记录
$pageNo=1;
$ba= new pager($num,$items,$pageNo);
if (
$_GET['k']=="next" && $_GET["pagNo"]<$ba->pageCount )
{
$pageNo=$_GET["pagNo"]+1;
$ba=new pager($num,$items,$pageNo);
}
if (
$_GET['k']=="up" && $_GET["pagNo"]>1)
{
$pageNo=$_GET["pagNo"]-1;
$ba=new pager($num,$items,$pageNo);
}
if (
$_GET['k']=="top")
{
$pageNo=1;
$ba=new pager($num,$items,$pageNo);
}
if (
$_GET['k']=="end")
{
$pageNo=$ba->pageCount;
$ba=new pager($num,$items,$pageNo);
}
?>

然后,利用这个类把数据都存在变量里,就可以使用了

现在,对Smarty 的使用有点诀窍了 : 很多数据都是弄成数组,然后传给模板的

[ 本帖最后由 njuptsoz 于 2007-8-17 02:05 编辑 ]
昵称: leehui1983  时间: 2007-08-15 15:45:00
关注中,虽然还不明白。。。真是烦恼
昵称: njuptsoz  时间: 2007-08-15 16:17:00
还没有搞过,我想问大家,学习Smarty就是看手册,和它一步一步来是么??

给个提示!

[明|后]进行Smarty学习状态!
昵称: ella_123  时间: 2007-08-15 16:29:00
欺负新人,不会SMARTY
.......
昵称: zhaofei299  时间: 2007-08-15 17:16:00
引用:
原帖由 zhaofei299 于 2007-8-15 17:16 发表
还没有搞过,我想问大家,学习Smarty就是看手册,和它一步一步来是么??

给个提示!

[明|后]进行Smarty学习状态!
偶也想知道一下。。。
昵称: sh_10  时间: 2007-08-15 19:29:00
我现在刚刚从面向过程的开始学,还不会SMARTY
:L
昵称: mai21  时间: 2007-08-15 19:38:00
请问学习SMARTY该从何入手啊?
谢谢
昵称: 宁静致远  时间: 2007-08-15 19:58:00
想要弄个明白~~~所以一直活动在phpchina....
昵称: 宁静致远  时间: 2007-08-15 19:59:00
引用:
原帖由 sh_10 于 2007-8-15 19:29 发表
欺负新人,不会SMARTY
.......
支持一下。。。。。。。同感
昵称: ella_123  时间: 2007-08-15 20:04:00
引用:
原帖由 宁静致远 于 2007-8-15 19:58 发表
我现在刚刚从面向过程的开始学,还不会SMARTY
:L
:L
为什么好象就是我是从面向对象入门的呢。。。。。。
昵称: mai21  时间: 2007-08-15 20:08:00
引用:
原帖由 sh_10 于 2007-8-15 19:29 发表
欺负新人,不会SMARTY
.......
呵呵,这不是欺负新人,而是给你们锻炼的机会,这样你们可以知道以后努力的方向,不会做就查查资料试着写程序,当你做出来相信会很有成就感,同时也会获得进步!
昵称: sh_10  时间: 2007-08-15 21:11:00
坐下看热闹
昵称: leehui1983  时间: 2007-08-15 21:42:00
引用:
原帖由 dzjzmj 于 2007-8-15 22:06 发表
坐下看热闹
:lol 你可以指导下他们
昵称: dzjzmj  时间: 2007-08-15 22:06:00
我现在要上大三了,大一的时候我们学习了C语言,所以当然也就从面向过程下手了,呵呵
昵称: leehui1983  时间: 2007-08-15 22:10:00
做完了,睡觉.
昵称: 宁静致远  时间: 2007-08-16 01:05:00
引用:
原帖由 zwws 于 2007-8-16 01:41 发表
做完了,睡觉.
代码贴出来啊
昵称: zwws  时间: 2007-08-16 01:41:00
支持撒.
昵称: leehui1983  时间: 2007-08-16 08:07:00
不好意思,上午没时间上来,交的迟了 :)
昵称: mailangel123  时间: 2007-08-16 09:24:00
在第一页啊笨.

7楼.
昵称: gently  时间: 2007-08-16 11:50:00
引用:
原帖由 gently 于 2007-8-15 10:44 发表
不厚道!占了沙发,白天想,晚上做

昨晚做的,上午比较忙,没时间贴上来!――做的异常简单,不要拍死我!

12800

[php][/php]
呵呵,没有按照要求把分页拦模板独立出来,作到重复利用,确实做的简单些,不过也很不错了,赞一个!
昵称: zwws  时间: 2007-08-16 12:08:00
引用:
原帖由 zwws 于 2007-8-16 12:08 发表
在第一页啊笨.

7楼.
你的分页类还包含数据库操作,这样偶合性很高,改进下比较好,要想作到分页类能重复利用,最好就是里面不包含数据库操作,更不能有SQL语句。不过确实实现了题目要求,你从过去到现在真的进步太大了,小Z,我看好你哟!:P
昵称: leehui1983  时间: 2007-08-16 14:42:00
把mysql_num_rows()放在类外面操作,然后替换下$queryid就对了撒...

你说的好肉麻 :$


btw: 其实真的没进步, 这一段时间一直都在纸上谈兵,动看看西看看,有一些思路上的借鉴,自己也总结了一些
也许真的有用,上次恰好看到了fetch()这不,就用上了...:)

和你们差距真的好大...

[ 本帖最后由 zwws 于 2007-8-16 14:53 编辑 ]
昵称: leehui1983  时间: 2007-08-16 14:45:00
小Z前途无量啊,比我过去学的快多了,加油,你毕业的时候就是出色的PHPER了。各位新手也都加油~~~
昵称: zwws  时间: 2007-08-16 14:51:00
有点反胃了.
昵称: leehui1983  时间: 2007-08-16 15:22:00
引用:
原帖由 zwws 于 2007-8-16 15:32 发表
有点反胃了.
哎,这年头,你们这帮不懂事的年轻人,好,下次狠很批评你!!!
昵称: zwws  时间: 2007-08-16 15:32:00
您老安息吧. :lol
昵称: leehui1983  时间: 2007-08-16 16:58:00
支持
昵称: zwws  时间: 2007-08-16 17:53:00
不是有section吗?
昵称: syxrrrr  时间: 2007-08-16 17:57:00
帖子看完.谢谢
昵称: sunmonkeyking  时间: 2007-08-16 19:28:00
LS不想活了是吧:@
昵称: zwws  时间: 2007-08-16 20:14:00
一直用foreach的!
昵称: leehui1983  时间: 2007-08-17 09:12:00
这里不能成为聊天帖, 我发现置顶的效果不好....

推荐帖3帖的地址,然后置顶...
昵称: qingis  时间: 2007-08-17 10:05:00
同意楼上意见

把题目地址放进一个帖子,然后��置一个帖子
昵称: zwws  时间: 2007-08-17 12:32:00
刚开始学smary,回去也写一个放上来:lol
昵称: njuptsoz  时间: 2007-08-17 14:13:00
smarty?还没开始看呢,呵呵,看来该看的了!!
昵称: yuanjing_119  时间: 2007-08-17 15:17:00
偶刚接触smarty 只能看别人的解答了..   :lol
昵称: philosophy  时间: 2007-08-18 19:31:00
嘎嘎,~~   学习学习~  :lol
昵称: xlight  时间: 2007-08-20 23:00:00
支持,努力�W��
昵称: xlight  时间: 2007-08-20 23:02:00
支持小辉
昵称: hjx210  时间: 2007-08-24 10:54:00
新手,支持.向"辉"学习
昵称: 胖头  时间: 2007-08-24 11:54:00
我就是一新手,刚开始的时候主管也是给我出了这个题目让我做,现在大概的了解了,呵呵,新手不容易,好多问题一点点的去查函数,哎
生活不好混啊,呵呵
昵称: DODOphp  时间: 2007-08-24 17:56:00
引用:
现在,对Smarty 的使用有点诀窍了 : 很多数据都是弄成数组,然后传给模板的
同感
昵称: orange_win  时间: 2007-08-25 08:29:00
好东西要支持哦
昵称: yiqieqie  时间: 2007-08-25 10:36:00
在努力研究。。
昵称: jackywdx  时间: 2007-08-25 10:47:00
有深度,一边看PHP,一边研究Javascript,忙不过来了,还是得一步一步来啊!
昵称: jackywdx  时间: 2007-08-25 16:24:00
看到题目的时候我就很郁闷了,不会smaty,这可怎么办:Q :Q
昵称: zhuzhiwu  时间: 2007-08-26 14:22:00
buhui
昵称: jiangwb1  时间: 2007-08-26 17:04:00
引用:
原帖由 wukeyuan 于 2007-8-13 20:21 发表
可惜了.不会smarty....不过还是要顶的:lol
同感!!悲哀一下!
昵称: wanghaip1982  时间: 2007-08-29 16:33:00
smartysmartysmarty

本网站在哪儿去看呢??
昵称: Fevan  时间: 2007-08-29 23:11:00
{loop $.. $..}

{/loop}
昵称: Fevan  时间: 2007-08-29 23:12:00
好好�W��
昵称: 折翼の天使♂  时间: 2007-09-05 17:40:00
:handshake
昵称: hjx210  时间: 2007-09-06 11:45:00
:(
落后了  新手刚看过smarty  还不会用它鼓捣分页
先学习学习!
昵称: hjx210  时间: 2007-09-06 11:46:00
昵称: xiaoxiao0503  时间: 2007-9-7 07:33

俺还没学到smarty
昵称: xiaoxiao0503  时间: 2007-09-07 07:33:00
第一次听说 smarty
昵称: wzw00001  时间: 2007-09-12 13:47:00
第二题呢
请看置顶帖

[ 本帖最后由 leehui1983 于 2007-9-14 16:50 编辑 ]
昵称: yilong  时间: 2007-09-12 15:04:00
知道foreach,但不知道smarty……

还是个新手……;P
昵称: china_wsq  时间: 2007-09-14 15:54:00
引用:
原帖由 sonyhhhhh 于 2007-9-14 16:37 发表
第二题呢
请看置顶帖
昵称: sonyhhhhh  时间: 2007-09-14 16:37:00
我觉得出题者应该在最后把答案附上
顺便做详细解释,
因为大师兄的教程讲的是section很详细,新手可以说看了就会用
昵称: konakona  时间: 2007-09-14 16:40:00
sql.sql

CREATE DATABASE mydb;
USE mydb;
CREATE TABLE news
(
  news_id int not null auto_increment,
  news_title varchar(100) not null,
  news_contents text not null,
  news_date datetime not null,
  primary key(news_id)
);

INSERT INTO news VALUES(null, '新闻1', '111111', now());
INSERT INTO news VALUES(null, '新闻2', '222222', now());
INSERT INTO news VALUES(null, '新闻3', '333333', now());
INSERT INTO news VALUES(null, '新闻4', '444444', now());
INSERT INTO news VALUES(null, '新闻5', '555555', now());


news.tpl
<table width="300" border="1" cellspacing="0" cellpadding="0">
  {foreach from=$news_arr item=news}
  <tr>
    <td>{$news.news_id}</td>
    <td>{$news.news_title}</td>
    <td>{$news.news_date}</td>
  </tr>
  {/foreach}
</table>



news.php
复制PHP内容到剪贴板
PHP代码:

<?php
header
('content-type:text/html;charset=utf-8');
include_once(
'../libs/Smarty.class.php');   //Smarty文件

$smarty= new Smarty;
$smarty->template='./templates';
$smarty->compile='./templates_c';

$host'localhost';
$user'root';
$pwd '123456';
$data'mydb';

$linkmysql_connect($host$user$pwd$data);
mysql_select_db($data$link);

$news_arr= array();
$sql"SELECT * FROM news";
$resultmysql_query($sql$link);

while (
$re_arrmysql_fetch_array($result))
{
  
$news_arr[]= $re_arr;  
}

$smarty->assign('news_arr'$news_arr);
$smarty->display('news.tpl');
?>

昵称: leehui1983  时间: 2007-09-14 16:51:00
:)
昵称: jingangel  时间: 2007-09-17 10:23:00
我也想搞,不过我就是没看懂题目是什么意思!:(
昵称: zhaofei299  时间: 2007-09-20 19:58:00
学习中……
昵称: cacao  时间: 2007-09-20 20:01:00
已完成,还有少一些注释什么的!

今天太晚了.明天分布!:lol
昵称: zhaofei299  时间: 2007-09-22 17:23:00
本程序只要简单的实现了一些自定义缓存文件的页面,
本程序还可以扩展,什么安全性,人性化,代码重用,等...
因时间原因本人不再对其做进一步扩展,有时间的朋友
可以对其进行更完整的扩展!

最近不Smarty学习过后不知道要搞些什么来锻炼下自己,看到这人题目,想想了花了点时间做了一下
这次收获还不错,知道了还可以自定义缓存页面。因为是一个人学习,没听说过,现在自己做了一下
感觉还行!

因为本人从没用过文本编辑器所以这里也没有用,只有了大的表单域!

建议:也没什么,就是希望以后出题目的哥们,将题目叙述清楚,当时我看这题时一蒙,因为之前不知道有自
定义缓存页这回事,我都不知道将它当什么了!为此还专门请教了gently (徐徐),后来听了他的解释才有点
明白是怎么一回事!



index.php
复制PHP内容到剪贴板
PHP代码:

<?php
/****************************************************
*writer:zhaofei2999
*日期  :2007年9月26日
*Email:zhaofei299@163.com
*空间博客:[url]http://hi.baidu.com/zhaofei299[/url]
*个人站点:暂无
*****************************************************/
header('content-type:text/html;charset=utf-8');   //发送标题设定页面编码  
include_once '../libs/smarty.class.php';          //Smarty文件
include_once 'link_data.php';                     //连接数据库文件
include_once 'all_fun.php';                       //函数库 

$link =link_data();   //连接数据库

$cate_idtrim($_GET['category']);   //分类

$sql="
SELECT a.news_id, b.cate_name, a.news_title, a.news_contents, a.news_date 
FROM news AS a INNER JOIN news_categorys AS b 
ON 
a.cate_id=b.cate_id"
;  //使用INNER JOIN 内联接,显示出新的信息

if (!empty($cate_id))   //分类查询
  
$sql$sql." AND a.cate_id='$cate_id' ORDER BY news_id DESC";   //加条件
else  //总查询
  
$sql$sql." ORDER BY news_id DESC";

$news_arrget_news_info($sql);   //得到$sql语句执行后的数据数组   新闻数组

$file_path'./cache_news/news_cate_arr.php';  //文件路径  自定义缓存文件

if (!file_exists($file_path))     //缓存文件不存在
  
update_news_cache($file_path);  //新建缓存文件   all_fun.php

include $file_path;   //包含缓存文件 

$smarty= new Smarty;  //实例化Smarty类
$smarty->template_dir='./templates';    //设置模板路径
$smarty->compile_dir'./templates_c';  //设置编译路径
$smarty->cache_dir'./cache';          //设置缓存路径
$smarty->config_dir'./config';        //设置配置文件路径

$smarty->assign('submit'true);        //分类下拉列表修改会自动提交数据
$smarty->assign('news_arr'$news_arr); //新闻数组  
$smarty->assign('news_cate_arr'$news_cate_arr); //分类数组
$smarty->display('index.tpl');  //显示模板文件
?>

index.tpl
复制PHP内容到剪贴板
PHP代码:
<html>
<
head>
<
meta http-equiv="Content-Type" c>
<
title>新闻浏览</title>
{include 
file='js.tpl'}
</
head>
<
body>
  <
form name="form1" method="get" action="">
    <
table width="726" border="0" cellpadding="1" cellspacing="1" bgcolor="#CCCCCC" style="font-size:14px">
      <
tr bgcolor="#FFFFFF">
        <
td width="95">分类操作:</td>
        <
td width="336">{include file='category.tpl'}
            <
input name="add" type="button" id="add9" value="添加" >
            <
input name="update" type="button" id="update3" value="编辑" >
            <
input name="delete" type="button" id="delete3" value="删除" ></td>
        <
td colspan="2"><div align="center">
          <
input name="add_news" type="button" id="add_news" value="添加新闻" >
          </
div></td>
      </
tr>
      <
tr bgcolor="#B0B0FF">
        <
td>新闻 ID : </td>
        <
td>新闻标题</td>
        <
td width="141">新闻分类</td>
        <
td width="141">发布时间</td>
      </
tr>
   <!--
开始-->
   {foreach 
from=$news_arr item=news name=n
      <
tr bgcolor="#FFFFFF">
        <
td><div align="center">{$news.news_id}</div></td>
        <
td>{$news.news_title}</td>
        <
td>{$news.cate_name}</td>
        <
td>{$news.news_date}</td>
      </
tr>
   {
foreachelse}
    <
tr bgcolor="#FFFFFF">
     <
td></td>
        <
td colspan="3">对不起,暂无相应数据!</td>
       </
tr>
   {/foreach}
     <!--
结束-->
    </
table>
  </
form>
  <
p> </p>
  <
p> </p>

cate_operation.php
复制PHP内容到剪贴板
PHP代码:

<?php
/****************************************************
*writer:zhaofei2999
*日期  :2007年9月26日
*Email:zhaofei299@163.com
*空间博客:[url]http://hi.baidu.com/zhaofei299[/url]
*个人站点:暂无
*****************************************************/
header('content-type:text/html;charset=utf-8'); 
include_once 
'../libs/smarty.class.php';
include_once 
'link_data.php';
include_once 
'all_fun.php';

$operationtrim($_GET['operation']);  //页面操作 add || update || delete

switch ($operation)    //不同的操作设置不同的模板
{
  case 
'add':  //添加
  
$tpl_name'add_category.tpl';  //模板文件名
  
break;
  case 
'update':  //修改
  
$tpl_name'update_category.tpl';
  break;
  case 
'delete':  //删除
  
$tpl_name'delete_category.tpl';
  break;
  default : 
  echo 
'<script>window.location.href="index.php";</script>';
  exit;
}


if (!empty(
$_POST))  //有表单数据提交,本想用按钮,但我不想让按钮名称一样
{
  switch (
$operation)  //操作
  
{
    case 
'add':   //添加
    
$cate_nametrim($_POST['cate_name']);  //分类名
    
if (!empty($cate_name))     //不为空
   
$sql"INSERT INTO news_categorys VALUES(null, '$cate_name')";  //数据插入分类数据库
    
break;
 
    case 
'update':   //修改
 
$cate_idtrim($_POST['category']);  //被重命名后分类id
    
$cate_nametrim($_POST['rename']);  //重命名的分类的名字
 
if (!empty($cate_name))
   
$sql"UPDATE news_categorys SET cate_name='$cate_name' WHERE cate_id='$cate_id'";  //修改数据值
    
break;
 
    case 
'delete':  //删除
   
$cate_idtrim($_POST['category']);  //分类id
    
if ($cate_id
   
$sql"DELETE FROM news_categorys WHERE cate_id='$cate_id'";  //删除相应分类
    
break;
   
    default : 
 echo 
'<script>window.location.href="index.php";</script>';
    exit;
  }
}

if (!empty(
$sql))   //如果变量$sql不为空, 分类category(操作)的值是add || update || delete 之一
{
  
$linklink_data();  //连接数据库
  
$resultmysql_query($sql$link);
  if (
$result//执行成功
  
{
    
$file_path'./cache_news/news_cate_arr.php';
    
update_news_cache($file_path);   //更新缓存文件
  
}  
}

include 
'cache_news/news_cate_arr.php';  //包含缓存文件

$smarty= new Smarty;
$smarty->template_dir='./templates';
$smarty->compile_dir'./templates_c';
$smarty->cache_dir'./cache';
$smarty->config_dir'./config';

$smarty->assign('news_cate_arr'$news_cate_arr);  //缓存文件文件中的分类数组
$smarty->display($tpl_name);  //显示相应操作的模板
?>

生成的缓存文件
复制PHP内容到剪贴板
PHP代码:

<?php $news_cate_arr=array(
 
1=>'综合资讯',
 
2=>'学科资讯',
 
3=>'数学',
 
4=>'语文',
 
5=>'英语',
 
6=>'理综',
 
7=>'文综',
 
8=>'高考资讯',
 
9=>'中考资讯',
 
10=>'其它考试',
 
);
?>

昵称: xhq6880  时间: 2007-09-23 12:31:00
前几天刚好用Smarty做了一个留言本!:lol
显示分页链接那做的并不是太好,有空改人性化!:)

程序地址:http://www.phpchina.com/bbs/viewthread.php?tid=37230&amp;sid=c1mwRU
复制PHP内容到剪贴板
PHP代码:

<?php
//..............
$page_size=5;
$page= new Page($page_size5);      //实例Page类
$page->getPage();                   //得到当前页数          
$start$page->getStart();          //得到LIMIT 的 开始索引   
$sql"SELECT * FROM talk_info ORDER BY talk_id ASC LIMIT $start, $page_size"//查询
$talk_info_arr$page->getInfo($start$sql);  //得到包含数据信息的数组
$amount$page->getAmount();                 //得到总数据数 
$page->getAmountPage();             //得到总页面数
$page_url_arr=$page->getPageLinks();//得到包含当前页面所有链接的数组
//...........
?>

page.class.php
复制PHP内容到剪贴板
PHP代码:

<?php
/*******************************************
writer:zhaofei299
Emai:zhaofei299@163.com
百度空间:[url]http://hi.baidu.com/zhaofei299[/url]
*******************************************/
class Page   
{
  var 
$pageSize//每页显示的数据数
  
var $page;  //当前页面数
  
var $amount;      //总数据数
  
var $amountPage;  //总页数
  
var $pageNum;     //每页显示的链接数

  
function __construct($size$pageNum)   //构造函数,初始化成员属性
  
{
    
$this->pageSize$size;  //每页显示数据数
 
$this->amount0;
 
$this->ampuntPage0;    
 
$this->pageNum=$pageNum//每页显示多少页数链接
 
link_data(); //连接数据库
  
}

  function 
getPage()  //得到当前页面数
  
{
    if (isset(
$_GET['id']) && $_GET['id']>0)  //如果参数id存在 并且 参数id大于0
   
$this->pageintval($_GET['id']);       //取其整数部分
 
else
   
$this->page=1;   //将1赋给当前页面
 
if (isset($_GET['id']) && $_GET['id'] >$_SESSION['amountPage'])//如果参数id存在 并且 参数id大于总页数
   
$this->page$_SESSION['amountPage'];  //将总页数赋给当前页数
  
}
  
  function 
getStart()  //得到LIMIT数据 开始的索引
  
{
    
$start= ($this->page-1)*5;
 return 
$start;  //返回开始索引
  
}

  function 
getInfo($start$sql)  //得到数据表中的数据信息,并以数组的形式返回
  
{
 
$array=array();  //初始化数组
 
$resultmysql_query($sql);   //执行sql语句
 
while (@$reArraymysql_fetch_array($result))  //从数据表中取出一行,作相关,索引数组操作
   
{
   
$array[]= $reArray;  //将包含数据信息的数组添加入新的数组中
 
}
 return 
$array;  //返回一个二维数组 
  
}

  function 
getAmount()  //得到总数据数
  
{
 
$sql"SELECT count(*) as count FROM talk_info";   //查询
 
$resultmysql_query($sql);  
 
$reArraymysql_fetch_array($result);
  return  
$this->amount$reArray['count'];  //总数据数
  
}

  function 
getAmountPage()  //得到总页数
  
{
    
$this->amountPage$this->amount/$this->pageSize;  //总页数= 总数据数 / 每页显示数据数
 
if (!is_int($this->amountPage))  //如果计算得到的总页数不是整形
   
$this->amountPageintval($this->amountPage)+1//取其整数部分+1;
    
$_SESSION['amountPage']= $this->amountPage;   //将总页数赋给一个session变量
  
}

  function 
getPageLinks()  //得到当前页面显示的所有的链接,并以数组的形式返回
  
{
 
$amountPage$this->amountPage;  //总页面数
 
$pageNum$this->pageNum;        //每页显示的链接数
 
$page$this->page;              //当前页数
 
$urlArray= array();
 if (
$page>1)  //如果当前页面数大于1
 
{
   
$urlArray[]= "<a href='talk.php?id=1'> [|<<] </a>";
   
$urlArray[]= "<a href='talk.php?id=".($page-1)."'>  [<<]  </a>";
 }
 else
 {
   
$urlArray[]= '[|<<]';
   
$urlArray[]= '[<<]';
 }

 
$pintval($page/5)+1;  //区间,点5到6,链接显示状态,自定义,这个不是太完整!
 
$a= ($p-1)*5+1;         
 for (
$j=$a$j<$a+$pageNum$j++)  
 {
      if (
$j>$amountPage)  
  break;
   if (
$j==$page)  
     
$urlArray[]= '['.$j.']';
   else
         
$urlArray[]= "<a href='talk.php?id=".$j."'> [".$j."] </a>";   
 }
 
//}
 
if ($page<$amountPage)  //当前页面数小于总页面数
 
{
   
$urlArray[]= "<a href='talk.php?id=".($page+1)."'>  [>>]  </a>";
   
$urlArray[]= "<a href='talk.php?id=".$amountPage."'>  [>|]  </a>";
    }
 else
 {
   
$urlArray[]= '[>>]';
   
$urlArray[]= '[>|]';
 }
 return 
$urlArray;  //返回包含所有链接的数组
  
}
}
?>

昵称: zhaofei299  时间: 2007-09-26 22:11:00
顶贴收藏。。。

有空了玩。
昵称: zhaofei299  时间: 2007-09-27 09:24:00
顶贴收藏先,,有空再弄
昵称: zhaofei299  时间: 2007-09-27 11:36:00
ding
昵称: aboc  时间: 2007-09-27 12:39:00
:) 认真学习
昵称: aboc  时间: 2007-09-27 12:39:00
好羡慕你们哦,我怎么感觉太难学了,函数那么多:')
昵称: wanghaip1982  时间: 2007-09-28 22:09:00
zhaofei299 的真好,收藏了.
昵称: wanghaip1982  时间: 2007-09-28 22:28:00
discuz+supe里面都有cookie
那么现在自己做个登陆窗口
怎么用cookie实现呢??
cookie有什么用法呢??不是不安全吗???
昵称: weiqiyin  时间: 2007-09-30 10:53:00
都不错啊~我还要向你们多学习学习~~~~~~~`大家都努力哦~~~~
昵称: chyoqin  时间: 2007-09-30 14:24:00
正在仔细看代码呢.....
昵称: weiqiyin  时间: 2007-09-30 14:55:00
怎么这么难?
看来我要好好学习啦!
昵称: Huangping  时间: 2007-10-06 17:43:00
呵呵,随手写个,后面的就算了
复制PHP内容到剪贴板
PHP代码:

<?php
$conn 
mysql_connect('localhost''root''');
$rs mysql_query('SELECT category_id, category_name FROM category');
$category = array();
while(
$row mysql_fetch_assoc($rs)) {
    
$category[$row['category_id']] = $row['category_name'];
}
file_put_contents('./category.php''<?php return ' var_export($categorytrue) . '; ?>');
?>

昵称: hoday  时间: 2007-10-06 20:02:00
不错,支持下
昵称: 墨尘  时间: 2007-10-07 00:58:00
支持,
强顶!
俺菜
要加快学习进度,到这里来学习了!
昵称: 深空  时间: 2007-10-07 06:57:00
俺也是第一次听到smarty,刚才还傻傻的到PHP手册里面去查找 ,晕
昵称: 我爱YH  时间: 2007-10-17 11:05:00
xz想
昵称: lxylxy888666  时间: 2007-10-21 14:20:00
新手
昵称: pinghan  时间: 2007-10-25 10:58:00
好啊,学习中。。~~
昵称: hua4603213  时间: 2007-10-27 12:53:00
请问一个在你看来可能很幼稚的问题:使用smarty中的foreach的方法include_once('libs/Smarty.class.php');  ,在作用上是不是类似与C语言中包含库中函数啊,比如:#include<stdio.h>!希望解答!谢谢!!
昵称: pigso  时间: 2007-10-28 00:01:00
----db.inc文件----
<?php
   $hostname = "localhost";
   $databasename = "usermanage";
   $username = "root";
   $password = "2593163";
   function showerror()
   {
      die("Error " . mysql_errno() . " : " . mysql_error());
   }
?>

-----smarty.inc.php-----
<?php
// load Smarty library
require('Smarty.class.php');

class Smarty_base extends Smarty {

function Smarty_base() {

         // Class Constructor. These automatically get set with each new instance.
//类构造函数.创建实例的时候自动配置

        $this->Smarty();

        $this->template_dir = 'smarty/templates/';
        $this->compile_dir = 'smarty/templates_c/';
        $this->config_dir = 'smarty/configs/';
        $this->cache_dir = 'smarty/cache/';
        
        $this->caching = false;
        $this->left_delimiter = "<{";
        $this->right_delimiter = "}>";        
}
}
?>

------question.php--------
<?php

include "db.inc";

require "smarty.inc.php";

$smarty = new Smarty_base;


// Connect to the MySQL server
if (!($connection = @ mysql_connect($hostname, $username, $password)))
die("Cannot connect");

if (!(mysql_select_db($databasename, $connection)))
showerror();

//mysql_query("SET NAMES 'UTF8'");
mysql_query("SET NAMES 'GBK'");

$query = "SELECT * FROM users";
// Run the query on the connection
if (!($result = @ mysql_query ($query, $connection)))
showerror();


while(($row = mysql_fetch_array($result)))
{
    $array[] = array("userid"=>$row["userid"], "username"=>$row["username"],            "question"=>$row["question"], "answer"=>$row["answer"], "email"=>$row["email"]);
}


$smarty->assign("contacts", $array);
$smarty->display("test.tpl");


?>


---------test.tpl---------
//section 实现
<{section name=customer loop=$contacts}>
<TR>
    <TD><{$contacts[customer].userid}></TD>
    <TD><{$contacts[customer].username}></TD>
    <TD><{$contacts[customer].question}></TD>
    <TD><{$contacts[customer].answer}></TD>
    <TD><{$contacts[customer].email}></TD>
</TR>
<{/section}>

//foreach实现
<{foreach name=outer item=contact from=$contacts}>
<TR>
    <TD><{$contact.userid}></TD>
    <TD><{$contact.username}></TD>
    <TD><{$contact.question}></TD>
    <TD><{$contact.answer}></TD>
    <TD><{$contact.email}></TD>
</TR>
<{/foreach}>
昵称: netuse  时间: 2007-11-02 11:44:00
好像答过了吧!!
昵称: liushenheti  时间: 2007-11-04 23:28:00
左右边界符号建议用<!--{   }-->,这样模板上用dw编辑不会出现乱七八糟一大堆smarty标签
GOOD!
昵称: tingyu_521  时间: 2007-11-18 10:24:00
怎么一直没有看,辉老大继续支持你
昵称: qingis  时间: 2007-11-19 11:39:00
<?php
        $PAGE_SIZE //每页显示记录条数
        $page //当前页
        $rowCount //总记录条数       

        function get_page_count($rowCount,$PAGE_SIZE)//获得总页数
        {
                return intval(($rowCount+$PAGE_SIZE-1)/$PAGE_SIZE);
        }       
               
        function display_current_page($rowNum,$result)//显示N条查询结果
        {
                for($i = 0;$i < $rowNum;$i++)
                {
                        ...//显示
                }
        }
       
        $pageCount = get_page_count($rowCount,$PAGE_SIZE);
        if($page > $pageCount)
                $page = $pageCount;
       
        if($page > 1)
                mysql_date_seek($result,($page-1) * $PAGE_SIZE);//跳转到查询结果中相应的行
       
        if($page == $pageCount)
                $rowNum = $rowCount - ($page-1) * $PAGE_SIZE;
        else
                $rowNum = $PAGE_SIZE;
               
        display_current_page($rowNum,$result);
        //至于页码的链接,我做不到上面几位大哥那么漂亮就不做了
?>
昵称: liuxingyuyuni  时间: 2007-11-28 12:13:00
for($i = 1;$i <= $pageCount;$i++)
        {
                if($page != $i)
                        echo "<a href='...?page=$i'>$i</a>";
                else
                        echo "<strong>$i</strong>";
        }
昵称: liuxingyuyuni  时间: 2007-11-28 13:43:00
mysql_date_seek改为mysql_data_seek
昵称: tianshibao  时间: 2008-01-03 12:55:00