论坛新手测试第一题

第一题

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


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


:lol 先看看效果
:lol 希望更多的建议

作者: juck   发布时间: 2007-08-13

你要什么效果?

你是让大家答题呢?还是让大家出题呢?
答题的话,你要的列表是什么,没说清楚啊。
出题的话,你要哪一类的题目?

作者: faallan   发布时间: 2007-08-13

比如你记录的是新闻,用PHP查询出记录,存成数组,然后用SMARTY的FOREACH生成表格,字段有标题和添加日期。例子:
新闻1         2007-1-1
新闻2         2007-1-1
。。。。
这下理解了把

作者: leehui1983   发布时间: 2007-08-13

看一下

作者: wretch   发布时间: 2007-08-13

:$ :$ :$ 这题太有难度了 我等着看高手

作者: ruhong65   发布时间: 2007-08-13

引用:
原帖由 ruhong65 于 2007-8-13 12:04 发表
:$ :$ :$ 这题太有难度了 我等着看高手
:L 那到底从哪个问题开始呢

作者: juck   发布时间: 2007-08-13

是不是把数据库里的数据先调出来?存入数组?
再用foreach遍历数组的功能把数据输出?
表格按数组的标示符来定行数`例如array[1]则为第一行
这个是我的思路 不知道对不对

作者: xox9001   发布时间: 2007-08-13

这题是用section更简单些 :$ :$ :$ :$ 其实老大就是想考考我们换一种方法解决问题的能力:$ :$ :$ :$ :$ :$ :$

作者: ruhong65   发布时间: 2007-08-13

万恶的discuz每帖3个表情 :$ :$ :$ 我又看到7楼的美女头像了

作者: ruhong65   发布时间: 2007-08-13

section...

作者: 天之魔神   发布时间: 2007-08-13

引用:
原帖由 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

老大 别生气 来亲亲:$

作者: ruhong65   发布时间: 2007-08-13

亲爱的,生嘛气嘛

作者: zwws   发布时间: 2007-08-13

16楼是小老婆

作者: ruhong65   发布时间: 2007-08-13

引用:
原帖由 zwws 于 2007-8-13 17:03 发表
亲爱的,生嘛气嘛
:lol

作者: leehui1983   发布时间: 2007-08-13

我来解释下为什么用foreach,因为你们如果初学smarty,可能会觉得section好用,原因是你们数据查询记录很可能不是用数组返回的,在实际的框架开发中,基本上是查询记录用数组返回,结合smarty的foreach可以轻松实现列表,这里我都是用实际开发经验说话,如果那个家伙还认为我在扯淡,尽管来骂,我从来不再论坛误导别人,论坛熟悉我的朋友都清楚,某些没文化的不服气可以继续在夜色开一帖进行人身攻击,老子奉陪到底,但是不要在技术区影响论坛学习气氛和大家发帖积极性。

作者: leehui1983   发布时间: 2007-08-13

仿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>

输出效果:
1.png (6.44 KB)
2007-8-13 17:30


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

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

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

[ 本帖最后由 zwws 于 2007-8-13 17:40 编辑 ]

作者: zwws   发布时间: 2007-08-13

宣传不力,都不置顶

作者: zwws   发布时间: 2007-08-13

:lol

作者: lmhllr   发布时间: 2007-08-13

各位phper的香吻一个...it's free!

作者: zwws   发布时间: 2007-08-13

浪费我宝贵的上网时间,看大师兄的smarty教程中就有。

作者: jtql420   发布时间: 2007-08-13

你去死吧...记住你的id了...

作者: zwws   发布时间: 2007-08-13

引用:
原帖由 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

引用:
原帖由 jtql420 于 2007-8-13 19:28 发表
浪费我宝贵的上网时间,看大师兄的smarty教程中就有。
不爽你别参加,别以为你多强,垃圾!!!!!!自然有好学的新手参加,这里不需要你

作者: leehui1983   发布时间: 2007-08-13

引用:
原帖由 zwws 于 2007-8-13 17:30 发表
仿section效果...抛砖了,想看体现foreach的存在价值,辉老大不能闲啊,有空的话把你的经验用代码演示show出来(手动初始化一个示例数组即可)


article.php

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

[ 本帖最后由 leehui1983 于 2007-8-13 20:06 编辑 ]

作者: leehui1983   发布时间: 2007-08-13

大家看完就应该推出,如果查询出单条记录,将结果以数组形式调出的话,例如:刚才的新闻记录,某条信息返回结果数组,
我们定义成rs的话,就可以这样在smarty中调用:$tpl->assign('rs',$rs);
模板内容:<!--{$rs.date}-->:<!--{$rs.title}-->^_^

作者: leehui1983   发布时间: 2007-08-13

呵呵,我也尝试过这种方法,这样和section差不多了,偶只是用来njuptsoz 的帖嘛.
引用:
另外,左右边界符号建议用<!--{   }-->,这样模板上用dw编辑不会出现乱七八糟一大堆smarty标签,便于修改。小小的问题还是值得大家思考下,程序不是能运行就可以了,对自己要高要求,想想怎样才能是她更优,这样才有进步!希望各位新手已开始就能有这种观念,加油~
我加了个插件(自己改装过的),很符合自己的使用习惯

作者: zwws   发布时间: 2007-08-13

看来小Z进步很大,快教不了你了:)

作者: leehui1983   发布时间: 2007-08-13

大家有兴趣的关注下,明天我出第二题,就是在这个基础上进一步拓展开来,还没理解的朋友,快快跟帖,或者自己动手实践

作者: leehui1983   发布时间: 2007-08-13

其实我懒的很...宁愿发呆.

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

感谢辉老大抽空撒...撒花 :lol

作者: zwws   发布时间: 2007-08-13

有人参加的话我会继续的:lol

作者: leehui1983   发布时间: 2007-08-13

可惜了.不会smarty....不过还是要顶的:lol

作者: wukeyuan   发布时间: 2007-08-13

这次是个好机会.一起加油

作者: zwws   发布时间: 2007-08-13

引用:
原帖由 leehui1983 于 2007-8-13 20:18 发表
有人参加的话我会继续的:lol
"奸诈"

作者: zwws   发布时间: 2007-08-13

:) kaka

作者: qjy1984   发布时间: 2007-08-14

引用:
原帖由 leehui1983 于 2007-8-13 19:48 发表

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


:



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

看来 smarty 还真方便, 你什么时候写一个smarty的精华啊

作者: njuptsoz   发布时间: 2007-08-14

不会就学习下,其实现在的也不难,一起学习

作者: �����i�i   发布时间: 2007-08-14

引用:
原帖由 njuptsoz 于 2007-8-14 01:07 发表


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

看来 smarty 还真方便, 你什么时候写一个smarty的精华啊
呵呵,有学到东西还是不错吧:lol

作者: leehui1983   发布时间: 2007-08-14

上次有兴趣的朋友已经做了第一题(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

庆幸,昨儿占的位子还在!(错过了第一题,真是可惜!)

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

这个是新闻列表页,支持分类显示,添加新闻也在这里~
复制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

第二题已经出了,可能会难一些,但是新手做完会很有帮助的:)

作者: leehui1983   发布时间: 2007-08-14

看看

作者: 贪睡猪   发布时间: 2007-08-14

:L

作者: 贪睡猪   发布时间: 2007-08-14

?在自己板块设置为高亮然后移动过来?

=.=||

作者: Phzzy   发布时间: 2007-08-14

是啊,我来义务组织活动,用点特权不行吗?你们这些基础版的斑竹又不组织,帮你们组织还JJYY,靠,老子也不干了!吃力不讨好!!!!

作者: leehui1983   发布时间: 2007-08-14

??????

作者: sxm8271   发布时间: 2007-08-14

支持辉老大

作者: �����i�i   发布时间: 2007-08-14

辉老大是想把技术版块弄的更活跃些,很好的题目,希望大家都能有所收获

作者: PHPChina   发布时间: 2007-08-14

看来朋友门学习热情还是不够啊

作者: leehui1983   发布时间: 2007-08-14

:L :L 正在努力记忆指令和代码呢

老师写的板书,看葫芦画葫芦都够呛呢~~~~~:Q

作者: 虎皮鲨   发布时间: 2007-08-14

帮顶,我就不做了,懒惰是我最大的爱好!

作者: phpox   发布时间: 2007-08-14

为什么一定要采用smarty!

作者: njuptsoz   发布时间: 2007-08-14

不厚道!占了沙发,白天想,晚上做

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

pgList.gif (1.8 KB)
2007-8-16 11:42
复制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==0 || $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

:)  思路查不多,摸板引擎我采用的Template_ (韩国的摸板引擎技术)。

看完此贴,还是受益非浅啊。
继续学习。

作者: gently   发布时间: 2007-08-15

;P  这也可以?

作者: 特蓝克斯   发布时间: 2007-08-15

引用:
原帖由 特蓝克斯 于 2007-8-15 10:39 发表
为什么一定要采用smarty!
这是练习题~~~~~既然叫题目,还用说为什么吗

作者: 特蓝克斯   发布时间: 2007-08-15

:lol

作者: leehui1983   发布时间: 2007-08-15

:lol

作者: leehui1983   发布时间: 2007-08-15

:)  最近偶在给班级做点东西..只研读了一些程序. 没啥进步的啦 .....大家一起加油

辉,坚持哈!

[ 本帖最后由 zwws 于 2007-8-15 12:09 编辑 ]

作者: leehui1983   发布时间: 2007-08-15

占位留用
-----------------------

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

效果图::D
效果.gif (10.03 KB)
效果~
2007-8-16 01:34

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

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($queryid, 5, 10, $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">
  <a class="p_total">{#$pageinfo.rscount#}</a>
  <a class="p_pages">{#$pageinfo.current#}<span style="font-weight: normal">/</span>{#$pageinfo.pgcount#}</a>
{#if $pageinfo.first#}
  <a class="p_redirect" href="pagebar.php?p={#$pageinfo.first#}">|&#8249;</a>
{#/if#}
{#if $pageinfo.prev#}
  <a class="p_redirect" href="pagebar.php?p={#$pageinfo.prev#}">&#8249;&#8249;</a>
{#/if#}
{#foreach from=$pagelist item=page#}
  {#if $page == $pageinfo.current#}
  <a class="p_current">{#$page#}</a>
  {#else#}
  <a class="p_redirect" href="pagebar.php?p={#$page#}">{#$page#}</a>
  {#/if#}
{#/foreach#}
{#if $pageinfo.next#}
  <a class="p_redirect" href="pagebar.php?p={#$pageinfo.next#}">&#8250;&#8250;</a>
{#/if#}
{#if $pageinfo.last#}
  <a class="p_redirect" href="pagebar.php?p={#$pageinfo.last#}">&#8250;|</a>
{#/if#}
</div>

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

pagebar.rar (93.13 KB)
pagebar.rar (93.13 KB)
包包撒~
下载次数: 424
2007-8-16 01:34


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

pc.png (9.69 KB)
无聊而已~
2007-8-16 01:36


[ 本帖最后由 zwws 于 2007-8-16 01:39 编辑 ]

作者: zwws   发布时间: 2007-08-15

引用:
原帖由 leehui1983 于 2007-8-15 11:12 发表

这是练习题~~~~~既然叫题目,还用说为什么吗
恩,也是。
模板的介入,在程序页面主要就是构造数组,定义标签,以便在模板页面调用,输出。

作者: zwws   发布时间: 2007-08-15

可不可以把PHP程序测试题置顶啊,大家也好看到,不要就加精吧

作者: 特蓝克斯   发布时间: 2007-08-15

顶一下:)

作者: 贪睡猪   发布时间: 2007-08-15

引用:
原帖由 虎皮鲨 于 2007-8-14 21:14 发表
:L :L 正在努力记忆指令和代码呢

老师写的板书,看葫芦画葫芦都够呛呢~~~~~:Q
同感!!

作者: fly1983   发布时间: 2007-08-15

呵呵,这提对于新手比较难,希望明天可以看到大家的解答,希望斑竹把各题目的地址写在一个帖子社成置顶帖子就好,不然题目多了,总不能那么多置顶吧:)

作者: 贪睡猪   发布时间: 2007-08-15

想通了
原来就是要弄一个分页的类吧
呵呵,我也来偷懒
先把论坛里有人发的分页类发一下
复制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

关注中,虽然还不明白。。。真是烦恼

作者: njuptsoz   发布时间: 2007-08-15

还没有搞过,我想问大家,学习Smarty就是看手册,和它一步一步来是么??

给个提示!

[明|后]进行Smarty学习状态!

作者: ella_123   发布时间: 2007-08-15

欺负新人,不会SMARTY
.......

作者: zhaofei299   发布时间: 2007-08-15

引用:
原帖由 zhaofei299 于 2007-8-15 17:16 发表
还没有搞过,我想问大家,学习Smarty就是看手册,和它一步一步来是么??

给个提示!

[明|后]进行Smarty学习状态!
偶也想知道一下。。。

作者: sh_10   发布时间: 2007-08-15

我现在刚刚从面向过程的开始学,还不会SMARTY
:L

作者: mai21   发布时间: 2007-08-15

请问学习SMARTY该从何入手啊?
谢谢

作者: 宁静致远   发布时间: 2007-08-15

想要弄个明白~~~所以一直活动在phpchina....

作者: 宁静致远   发布时间: 2007-08-15

引用:
原帖由 sh_10 于 2007-8-15 19:29 发表
欺负新人,不会SMARTY
.......
支持一下。。。。。。。同感

作者: ella_123   发布时间: 2007-08-15

引用:
原帖由 宁静致远 于 2007-8-15 19:58 发表
我现在刚刚从面向过程的开始学,还不会SMARTY
:L
:L
为什么好象就是我是从面向对象入门的呢。。。。。。

作者: mai21   发布时间: 2007-08-15

引用:
原帖由 sh_10 于 2007-8-15 19:29 发表
欺负新人,不会SMARTY
.......
呵呵,这不是欺负新人,而是给你们锻炼的机会,这样你们可以知道以后努力的方向,不会做就查查资料试着写程序,当你做出来相信会很有成就感,同时也会获得进步!

作者: sh_10   发布时间: 2007-08-15

坐下看热闹

作者: leehui1983   发布时间: 2007-08-15

引用:
原帖由 dzjzmj 于 2007-8-15 22:06 发表
坐下看热闹
:lol 你可以指导下他们

作者: dzjzmj   发布时间: 2007-08-15

我现在要上大三了,大一的时候我们学习了C语言,所以当然也就从面向过程下手了,呵呵

作者: leehui1983   发布时间: 2007-08-15

做完了,睡觉.

作者: 宁静致远   发布时间: 2007-08-16

引用:
原帖由 zwws 于 2007-8-16 01:41 发表
做完了,睡觉.
代码贴出来啊

作者: zwws   发布时间: 2007-08-16

支持撒.

作者: leehui1983   发布时间: 2007-08-16

不好意思,上午没时间上来,交的迟了 :)

作者: mailangel123   发布时间: 2007-08-16

在第一页啊笨.

7楼.

作者: gently   发布时间: 2007-08-16

引用:
原帖由 gently 于 2007-8-15 10:44 发表
不厚道!占了沙发,白天想,晚上做

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

12800

[php][/php]
呵呵,没有按照要求把分页拦模板独立出来,作到重复利用,确实做的简单些,不过也很不错了,赞一个!

作者: zwws   发布时间: 2007-08-16

引用:
原帖由 zwws 于 2007-8-16 12:08 发表
在第一页啊笨.

7楼.
你的分页类还包含数据库操作,这样偶合性很高,改进下比较好,要想作到分页类能重复利用,最好就是里面不包含数据库操作,更不能有SQL语句。不过确实实现了题目要求,你从过去到现在真的进步太大了,小Z,我看好你哟!:P

作者: leehui1983   发布时间: 2007-08-16

把mysql_num_rows()放在类外面操作,然后替换下$queryid就对了撒...

你说的好肉麻 :$


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

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

[ 本帖最后由 zwws 于 2007-8-16 14:53 编辑 ]

作者: leehui1983   发布时间: 2007-08-16

小Z前途无量啊,比我过去学的快多了,加油,你毕业的时候就是出色的PHPER了。各位新手也都加油~~~

作者: zwws   发布时间: 2007-08-16

有点反胃了.

作者: leehui1983   发布时间: 2007-08-16

引用:
原帖由 zwws 于 2007-8-16 15:32 发表
有点反胃了.
哎,这年头,你们这帮不懂事的年轻人,好,下次狠很批评你!!!

作者: zwws   发布时间: 2007-08-16

您老安息吧. :lol

作者: leehui1983   发布时间: 2007-08-16

支持

作者: zwws   发布时间: 2007-08-16

不是有section吗?

作者: syxrrrr   发布时间: 2007-08-16

帖子看完.谢谢

作者: sunmonkeyking   发布时间: 2007-08-16

LS不想活了是吧:@

作者: zwws   发布时间: 2007-08-16

一直用foreach的!

作者: leehui1983   发布时间: 2007-08-17

这里不能成为聊天帖, 我发现置顶的效果不好....

推荐帖3帖的地址,然后置顶...

作者: qingis   发布时间: 2007-08-17

同意楼上意见

把题目地址放进一个帖子,然后��置一个帖子

作者: zwws   发布时间: 2007-08-17

刚开始学smary,回去也写一个放上来:lol

作者: njuptsoz   发布时间: 2007-08-17

smarty?还没开始看呢,呵呵,看来该看的了!!

作者: yuanjing_119   发布时间: 2007-08-17

偶刚接触smarty 只能看别人的解答了..   :lol

作者: philosophy   发布时间: 2007-08-18

嘎嘎,~~   学习学习~  :lol

作者: xlight   发布时间: 2007-08-20

支持,努力�W��

作者: xlight   发布时间: 2007-08-20

支持小辉

作者: hjx210   发布时间: 2007-08-24

新手,支持.向"辉"学习

作者: 胖头   发布时间: 2007-08-24

我就是一新手,刚开始的时候主管也是给我出了这个题目让我做,现在大概的了解了,呵呵,新手不容易,好多问题一点点的去查函数,哎
生活不好混啊,呵呵

作者: DODOphp   发布时间: 2007-08-24

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

作者: orange_win   发布时间: 2007-08-25

好东西要支持哦

作者: yiqieqie   发布时间: 2007-08-25

在努力研究。。

作者: jackywdx   发布时间: 2007-08-25

有深度,一边看PHP,一边研究Javascript,忙不过来了,还是得一步一步来啊!

作者: jackywdx   发布时间: 2007-08-25

看到题目的时候我就很郁闷了,不会smaty,这可怎么办:Q :Q

作者: zhuzhiwu   发布时间: 2007-08-26

buhui

作者: jiangwb1   发布时间: 2007-08-26

引用:
原帖由 wukeyuan 于 2007-8-13 20:21 发表
可惜了.不会smarty....不过还是要顶的:lol
同感!!悲哀一下!

作者: wanghaip1982   发布时间: 2007-08-29

smartysmartysmarty

本网站在哪儿去看呢??

作者: Fevan   发布时间: 2007-08-29

{loop $.. $..}

{/loop}

作者: Fevan   发布时间: 2007-08-29

好好�W��

作者: 折翼の天使♂   发布时间: 2007-09-05

:handshake

作者: hjx210   发布时间: 2007-09-06

:(
落后了  新手刚看过smarty  还不会用它鼓捣分页
先学习学习!

作者: hjx210   发布时间: 2007-09-06

昵称: xiaoxiao0503  时间: 2007-9-7 07:33
俺还没学到smarty

作者: xiaoxiao0503   发布时间: 2007-09-07

第一次听说 smarty

作者: wzw00001   发布时间: 2007-09-12

第二题呢
请看置顶帖

[ 本帖最后由 leehui1983 于 2007-9-14 16:50 编辑 ]

作者: yilong   发布时间: 2007-09-12

知道foreach,但不知道smarty……

还是个新手……;P

作者: china_wsq   发布时间: 2007-09-14

引用:
原帖由 sonyhhhhh 于 2007-9-14 16:37 发表
第二题呢
请看置顶帖

作者: sonyhhhhh   发布时间: 2007-09-14

我觉得出题者应该在最后把答案附上
顺便做详细解释,
因为大师兄的教程讲的是section很详细,新手可以说看了就会用

作者: konakona   发布时间: 2007-09-14

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';

$link= mysql_connect($host, $user, $pwd, $data);
mysql_select_db($data, $link);

$news_arr= array();
$sql= "SELECT * FROM news";
$result= mysql_query($sql, $link);

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

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

作者: leehui1983   发布时间: 2007-09-14

:)

作者: jingangel   发布时间: 2007-09-17

我也想搞,不过我就是没看懂题目是什么意思!:(

作者: zhaofei299   发布时间: 2007-09-20

学习中……

作者: cacao   发布时间: 2007-09-20

已完成,还有少一些注释什么的!

今天太晚了.明天分布!:lol

作者: zhaofei299   发布时间: 2007-09-22

本程序只要简单的实现了一些自定义缓存文件的页面,
本程序还可以扩展,什么安全性,人性化,代码重用,等...
因时间原因本人不再对其做进一步扩展,有时间的朋友
可以对其进行更完整的扩展!

最近不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_id= trim($_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_arr= get_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';

$operation= trim($_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_name= trim($_POST['cate_name']);  //分类名
    if (!empty($cate_name))     //不为空
   $sql= "INSERT INTO news_categorys VALUES(null, '$cate_name')";  //数据插入分类数据库
    break;
 
    case 'update':   //修改
 $cate_id= trim($_POST['category']);  //被重命名后分类id
    $cate_name= trim($_POST['rename']);  //重命名的分类的名字
 if (!empty($cate_name))
   $sql= "UPDATE news_categorys SET cate_name='$cate_name' WHERE cate_id='$cate_id'";  //修改数据值
    break;
 
    case 'delete':  //删除
   $cate_id= trim($_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 之一
{
  $link= link_data();  //连接数据库
  $result= mysql_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

前几天刚好用Smarty做了一个留言本!:lol
显示分页链接那做的并不是太好,有空改人性化!:)

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

<?php
//..............
$page_size=5;
$page= new Page($page_size, 5);      //实例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->amount= 0;
 $this->ampuntPage= 0;    
 $this->pageNum=$pageNum; //每页显示多少页数链接
 link_data(); //连接数据库
  }

  function getPage()  //得到当前页面数
  {
    if (isset($_GET['id']) && $_GET['id']>0)  //如果参数id存在 并且 参数id大于0
   $this->page= intval($_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();  //初始化数组
 $result= mysql_query($sql);   //执行sql语句
 while (@$reArray= mysql_fetch_array($result))  //从数据表中取出一行,作相关,索引数组操作
   {
   $array[]= $reArray;  //将包含数据信息的数组添加入新的数组中
 }
 return $array;  //返回一个二维数组 
  }

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

  function getAmountPage()  //得到总页数
  {
    $this->amountPage= $this->amount/$this->pageSize;  //总页数= 总数据数 / 每页显示数据数
 if (!is_int($this->amountPage))  //如果计算得到的总页数不是整形
   $this->amountPage= intval($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[]= '[<<]';
 }

 $p= intval($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

顶贴收藏。。。

有空了玩。

作者: zhaofei299   发布时间: 2007-09-27

顶贴收藏先,,有空再弄

作者: zhaofei299   发布时间: 2007-09-27

ding

作者: aboc   发布时间: 2007-09-27

:) 认真学习

作者: aboc   发布时间: 2007-09-27

好羡慕你们哦,我怎么感觉太难学了,函数那么多:')

作者: wanghaip1982   发布时间: 2007-09-28

zhaofei299 的真好,收藏了.

作者: wanghaip1982   发布时间: 2007-09-28

discuz+supe里面都有cookie
那么现在自己做个登陆窗口
怎么用cookie实现呢??
cookie有什么用法呢??不是不安全吗???

作者: weiqiyin   发布时间: 2007-09-30

都不错啊~我还要向你们多学习学习~~~~~~~`大家都努力哦~~~~

作者: chyoqin   发布时间: 2007-09-30

正在仔细看代码呢.....

作者: weiqiyin   发布时间: 2007-09-30

怎么这么难?
看来我要好好学习啦!

作者: Huangping   发布时间: 2007-10-06

呵呵,随手写个,后面的就算了
复制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($category, true) . '; ?>');
?>

作者: hoday   发布时间: 2007-10-06

不错,支持下

作者: 墨尘   发布时间: 2007-10-07

支持,
强顶!
俺菜
要加快学习进度,到这里来学习了!

作者: 深空   发布时间: 2007-10-07

俺也是第一次听到smarty,刚才还傻傻的到PHP手册里面去查找 ,晕

作者: 我爱YH   发布时间: 2007-10-17

xz想

作者: lxylxy888666   发布时间: 2007-10-21

新手

作者: pinghan   发布时间: 2007-10-25

好啊,学习中。。~~

作者: hua4603213   发布时间: 2007-10-27

请问一个在你看来可能很幼稚的问题:使用smarty中的foreach的方法include_once('libs/Smarty.class.php');  ,在作用上是不是类似与C语言中包含库中函数啊,比如:#include<stdio.h>!希望解答!谢谢!!

作者: pigso   发布时间: 2007-10-28

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

好像答过了吧!!

作者: liushenheti   发布时间: 2007-11-04

左右边界符号建议用<!--{   }-->,这样模板上用dw编辑不会出现乱七八糟一大堆smarty标签
GOOD!

作者: tingyu_521   发布时间: 2007-11-18

怎么一直没有看,辉老大继续支持你

作者: qingis   发布时间: 2007-11-19

<?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

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

mysql_date_seek改为mysql_data_seek

作者: tianshibao   发布时间: 2008-01-03