注    册
密 码 忘记密码
保存密码         取消

个人资料

昵称: 辉老大
姓名: 李辉
性别:
生日: 1983-8-2
星座:
学历:
院校:
行业: 计算机IT
头衔:
位置: 中国-福建-福州
家乡: 中国-福建-福州
个人标签:
个人简介:
用专业的心,做专业的事!
座右铭:

详细资料..

日志

简单封装了一些常用JS操作

分类:PHP基础应用

在web编程中大家应该会经常用到一些常用js操作,例如 alert(),通常是遇到了再写,受公司的启发,我自己简单写了个类来自动生成这些js,目的就是为了方便,一个小玩意,新手们也许会喜欢^_^
PHP代码如下:

<?php
/*
*页面:makeJs.class.php
*功能:封装常用的JS代码,直接调用,方便操作
*作者:辉老大
*创建时间:2007-01-27
*/
 
class makeJs
 
{
     private 
$jsStartChar '<script type="text/javascript">';//定义js起始标记 
     
private $jsEndChar   '</script>';//定义js结束标记

 /*
 *函数名称:jsAlert
 *函数功能:弹出JS提示框
 *参数:$message 要在弹出提示框中显示的文字 $url 点击后跳转的路径,为空则不跳转
 *使用方法:
 *$js = new makeJs();//以下介绍使用方法省略此句
 *$js->jsAlert(显示的文字,'跳转页面URL');//弹出对话框,点击确定后跳转到php.php页面
 *$js->jsAlert(显示的文字,'');//弹出对话框,点击确定后没有跳转
 */
     
public function jsAlert($message,$url){
        echo 
$this->jsStartChar;
        if(
$url==''){
            echo 
'alert' '("' $message '");';
            echo 
$this->jsEndChar;
        }
        else{
            echo 
'alert' '("' $message '");';
            echo 
$this->jsEndChar;
            echo 
'<meta http-equiv="refresh" c>';
        }
    }

 
/*
 *函数名称:jsConfirm
 *函数功能:弹出JS提示框,带确定/取消
 *参数:$message 要在弹出提示框中显示的文字
 *使用方法:$js->jsConfirm('显示的文字');
 */
     
public function jsConfirm($message){
        echo 
$this->jsStartChar;
        if(
$url==''){
            echo 
'confirm' '("' $message '");';
            echo 
$this->jsEndChar;
        }
     }

 
/*
 *函数名称:jsOpenWin
 *函数功能:弹出新窗口
 *参数:$url 路径 $name 窗口名 $height 窗口高度 $width 窗口宽度
 *使用方法:
 *$url = '页面的URL';
 *$js->jsOpenWin($url,窗口名,窗口高度,窗口宽度);
 */
     
public function jsOpenWin($url,$name,$height,$width){
        echo 
$this->jsStartChar;
        echo 
'window.open'.'("'.$url.'","'.$name.'","'.$height.'","'.$width.'");';
        echo 
$this->jsEndChar;
     }

 
/*
 *函数名称:jsAddScript
 *函数功能:自定义JS
 *参数:$script
 *使用方法:
 *$script = '定义的js语句';
 *例如:$script = 'window.location=('php.php')';
 *$js->jsAddScript($script);
 */
     
public function jsAddScript($script){
        echo 
$this->jsStartChar;
        echo 
$script;
        echo 
$this->jsEndChar;
     }
 }
?> 

Smarty+QUICKFORM小小演示

分类:Smarty应用

由于公司需要quickform结合SMARTY的开发模式,最近几天恶补了下,跟大家分享下心得吧,quickform是一个PEAR类库,可以快速生成表单控件及验证表单的JS代码,大家可能觉得这个用手写JS和HTML生成不是很快吗,用那个不是更麻烦,的确,少量的表单控件是显示不出 quickform的优势的,但是如果有大量的表单控件,例如OA的后台,quickform的优势就显示出来了,利用quickform有代码清晰,易于维护等特点,非常适合大中型项目的开发,更方便的是可以在smarty中轻松使用它,^_^废话少说,来看看代码,不过大家之前最好了解下PEAR的安装,参照:http://hi.baidu.com/wanghaozi/blog/item/81cfb7003f973687e850cd3e.html。
    由于公司用的quickform是自己改进过的,因此代码和大家网上看到的会有些差别,涉及版权在这里就不便说明,简要展示下核心代码,大家就当了解下吧,有兴趣的朋友可以看看这篇HAOHAPPY的文章:http://www.phpe.net/articles/418.shtml
PHP代码如下:

<?php

/*
*作者:辉老大
*页面:path.cfg.php
*功能:系统路径设置
*版权所有:随便copy^_^
*/

$global['path']['conf']     = $global['path']['root'] . 'conf/';//定义系统配置文件路径
$global['path']['lib']      = $global['path']['root'] . 'lib/';//定义系统库文件路径

?> 



PHP代码如下:

<?php

/*
*作者:辉老大
*页面:smarty.cfg.php
*功能:smarty基本配置
*版权所有:随便copy^_^
*/

//定义模板路径
$global['smarty']['template_dir']       = $global['path']['root'] . 'lib/smarty/templates';
//定义模板编译目录
$global['smarty']['compile_dir']        = $global['path']['root'] . 'lib/smarty/templates_c';
//定义smarty配置文件夹路径
$global['smarty']['config_dir']         = $global['path']['conf'] . 'lib/smarty/configs';
$global['smarty']['cache_dir']             = $global['path']['root'] . 'lib/smarty/cache';

//$global['smarty']['compile_check']         = true;
//设置smarty报错禁用
$global['smarty']['debugging']             = false;
//关闭缓存
$global['smarty']['caching']             = false;
//$global['smarty']['cache_lifetime']     = 6000;

//定义左右边界符
$global['smarty']['left_delimiter']     = '<{';
$global['smarty']['right_delimiter']     = '}>';

?> 



PHP代码如下:

<?php

/*
*作者:辉老大
*页面:common.cfg.php
*功能:全局配置
*版权所有:随便copy^_^
*/

$global['path']['root'] = dirname(__FILE__) . '/';//设置根目录
require($global['path']['conf'] . 'conf/path.cfg.php');

require(
$global['path']['conf'] . 'smarty.cfg.php');
//包含smarty类库
require($global['path']['lib']  . 'smarty/libs/Smarty.class.php');

//smarty配置
$tpl = new Smarty();
$tpl->template_dir         $global['smarty']['template_dir'];
$tpl->compile_dir          $global['smarty']['compile_dir'];
$tpl->config_dir           $global['smarty']['config_dir'];

$tpl->debugging         $global['smarty']['debugging'];
$tpl->caching             $global['smarty']['caching'];
$tpl->cache_lifetime     $global['smarty']['cache_lifetime'];

$tpl->left_delimiter     $global['smarty']['left_delimiter'];
$tpl->right_delimiter     $global['smarty']['right_delimiter'];
unset(
$global['smarty']);

ini_set('include_path'ini_get('include_path') .
    
PATH_SEPARATOR $global['path']['lib'] . 'pear/');//载入pear库文件
?> 



PHP代码如下:

<?php

/*
*作者:辉老大
*页面:index.php
*功能:UI
*版权所有:随便copy^_^
*/

require_once('common.inc.php');//载入全局配置

//包含quickform类库
require($global['path']['lib'] . 'pear/HTML/QuickForm.php');

$form = new HTML_QuickForm('changepwdform');//生成quickform实例,参数为表单名

/*
*开始添加表单元素
*参数依次为:表单元素类型,名称,(按钮标签文字),样式
*/
$form->addElement('password','adminPwd','','style="width:120px"');
$form->addElement('password','newPwd','','style="width:120px"');
$form->addElement('password','newPwd2','','style="width:120px"');
$form->addElement('submit','btnSubmit','修改密码','style="width:100px"');

//增加验证规则,自动生成JS
$form->addRule('adminPwd','密码不能为空!','required','','client');
$form->addRule('newPwd','新密码不能为空!','required','','client');
$form->addRule('newPwd2','请再次输入新密码!','required','client');
$form->addRule(array('newPwd','newPwd2'),"两次输入的密码不一致!",'compare','','client');
$form->;//禁止提交表单

//分配表单数据到数组中
$tpl->assign('form_data',$form->toArray());
    
//显示模板
$tpl->display('index.tpl');


?> 


模板代码:

<HTML>
<HEAD>
<TITLE>quickform+smarty</TITLE>
<{if $form_data.javascript}>
    <{$form_data.javascript}>
<{/if}>
</HEAD>

<BODY>
<p> </p>
<p> </p>
<p> </p>
<form <{$form_data.attributes}> >
<table width="300"  border="0" align="center" cellpadding="3" cellspacing="3"
bgcolor="#F6F6F6" style="font-size:9pt" class="AddTable">
<tr bgcolor="#FFFFFF">
  <td width="47%" colspan="2"><div align="center">修改管理员密码</div></tr>
  <tr>
  <tr>
    <td width="47%"><div align="center">现有管理员密码
    </div></td>
    <td width="53%"><{$form_data.adminPwd.html}></td>
  </tr>
  <tr>
    <td><div align="center">新密码
    </div></td>
    <td><{$form_data.newPwd.html}></td>
  </tr>
  <tr>
    <td><div align="center">再次输入新密码
    </div></td>
    <td><{$form_data.newPwd2.html}></td>
  </tr>
  <tr>
    <td colspan="2"><div align="center">
      <{$form_data.btnSubmit.html}>
    </div></td>
  </tr>
</table>
</form>
<script type="text/javascript" src="response.js"></script>
</BODY>
</HTML>

这里大家也许觉得奇怪,为什么路径要定义这么复杂,而且使用绝对路径呢?这个是最近适应公司项目的需要,呵呵!其实这样有利于部署大的项目。这个帖子相信没接触过quickform或smarty的新手一定看的一头雾水,当然,我在这也只是简单介绍下,希望大家有兴趣的可以继续深入研究,最后看看效果:

看判断两次输入密码是否一样就这一句:
PHP代码如下:

$form->addRule(array('newPwd','newPwd2'),"两次输入的密码不一致!",'compare','','client'); 


代码看起来是不是简洁清楚啊,呵呵,接下来还会应用到再结合XAJAX的应用,我会继续和大家分享学习心得,嘿嘿!

解决中英文字符串长度问题函数 作者:标哥

分类:PHP基础应用

function strSplit($s$len) {
    
$end '…'
;
    
$result ''
;
    
$strLen strlen($s
);
    if (
$strLen <= $len
) {
        return 
$s
;
    }
    
$len -= 2
;
    for (
$i=0$i<$len && $i<$strLen$i
++) {
        
$c $s[$i
];
        if (
ord($c) < 0x80
) {
            
$result .= $c
;
        } elseif (
$i+1<$len
) {
            
$result .= $s[$i++] . $s[$i
];
        }
    }
    return (
$i $strLen) ? ($result $end) : $result
;
}

echo 
strSplit('1234567'10), '<br />'
;
echo 
strSplit('1234567890'10), '<br />'
;
echo 
strSplit('1234中文567890abcdefghijkl'10), '<br />'
;
echo 
strSplit('全部都是中文'10), '<br />'
;
echo 
strSplit('全a部b都c是d中e文'10), '<br />'
;

输出:
1234567
1234567890
1234中文…
全部都是…
全a部b都…

一个更简单的无限级分类菜单代码

分类:PHP基础应用


首先要感谢terry39的指点,元旦闲来无事,我就把他所讲的原理简单实现一下,这个程序的关键就在于数据表的设计很有特色,不用递归,依靠个简单SQL语句就能列出菜单,看看这个数据表怎么设计的:
数据库字段大概如下:
-----------------------------------------------------------------------------------
id              编号
fid             父分类编号
name         分类名
path          分类路径,以 id 为节点,组成类似    ,1,2,3,4, 这样的字符串
----------------------------------------------------------------------------------

可以假设有如下的数据

id      fid          name             path
----------------------------------------------------
1       0           分类1             ,1,
2       0           分类2             ,2,
3       1           分类1-1          ,1,3,
4       1           分类1-2          ,1,4,
5       2           分类2-1          ,2,5,
6       4           分类1-2-1       ,1,4,6,
----------------------------------------------------
这次偷懒,我只用一个页面,好在代码不长,全部代码用类封装的(不是必要,而是自己也想熟悉一下OO,呵呵!),来看看页面代码:
PHP代码如下:

<?php

/**************************************
   
  页面:menu.php
  作者:辉老大
  功能:定义数据库操作及生成菜单列表类

**************************************/
class menu{

       
//创建构造函数,作用:数据库连接并选择相应数据库
       
public function __construct(){
           
$dbhost     "localhost";
           
$dbuser     "root";
           
$dbpassword "7529639";
           
$dbname     "menu";
           
mysql_connect($dbhost,$dbuser,$dbpassword) or die("error!");
           
mysql_query("SET NAMES 'GBK'");
           
mysql_select_db($dbname);
       }

       
//执行SQL语句函数
       
private function query($sql){
           return 
mysql_query($sql);
       }

       
//取得结果集数组函数
       
private function loop_query($result){
           return 
mysql_fetch_array($result);
       }
       
//列出菜单列表函数
       
public function menulist(){
           
$sql="select * from list order by path";
           
$result=$this->query($sql);
            while(
$rows=$this->loop_query($result)){
             if(
substr_count($rows['path'],',')>2){
               for(
$i=0;$i<(substr_count($rows['path'],',')-2);$i++)
               echo '&nbsp;
';
              }
             echo 
$rows['name'].'<br>';
            }
       }

       
//创建析构函数,作用:关闭数据库连接
       
public function __destruct(){
           return 
mysql_close();
       }
   }
  
$db=new menu();//生成实例
  
$db->menulist();//调用方法生成菜单
?> 

永恒的话题:PHP JS无限级可伸缩菜单详解(简单易懂)

分类:默认栏目

发了几天基础的东西,今天来点稍微难的,一般在CMS系统后台中都要用到的类别管理部分的精华--无限级分类菜单,对于新手来说,这个可能有一定难度,但是今天听完我细细道来,相信以后大家就都会弄这东东了。怎么实现呢?大家先做个数据库出来先:

--
-- 表的结构 `cr_columninfo`
--

CREATE TABLE `cr_columninfo` (
  `columnid` int(4) NOT NULL auto_increment,
  `columnfatherid` int(4) NOT NULL default '0',
  `columnname` varchar(100) NOT NULL default '',
  `columnadder` varchar(50) NOT NULL default '',
  `columninputdate` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`columnid`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

--
-- 导出表中的数据 `cr_columninfo`
--

INSERT INTO `cr_columninfo` (`columnid`, `columnfatherid`, `columnname`, `columnadder`, `columninputdate`) VALUES (1, 0, '影音明星', 'leehui', '2006-09-28'),
(2, 0, '校园风情', 'leehui1983', '2006-09-28'),
(3, 1, '港台明星', 'leehui', '2006-09-28'),
(4, 0, '风景图片', 'leehui1983', '2006-09-29'),
(5, 4, '浩瀚大海', 'leehui1983', '2006-09-29'),
(6, 5, '福州的海', 'leehui1983', '2006-09-29'),
(7, 2, '毕业图片', 'leehui', '2006-09-29'),
(9, 0, '体育明星', 'leehui1983', '2006-10-02'),
(10, 0, '精美壁纸', 'leehui1983', '2006-10-02'),
(11, 0, '城市风光', 'leehui1983', '2006-10-02'),
(12, 0, '卡通动漫', 'leehui1983', '2006-10-02'),
(13, 0, '游戏截图', 'leehui1983', '2006-10-02'),
(14, 0, '作者相册', 'leehui1983', '2006-10-02');

这些是测试数据,基本原理就是按照树型结构建立数据字段,核心就是栏目都有本身的ID号和父栏目的ID号,依靠这两个关系,建立树型结构,顶级栏目父ID= 0,这个都好理解,现在来叙述下程序执行原理,本程序采用最为普遍的递归算法来遍历子菜单,首先,先查询出所有顶级菜单,显示在一个大表格里,没一行显示一个顶级菜单,再通过递归列出所有子菜单,子菜单处在上级菜单的所在行的下一行,且行的显示属性为不显示,通过程序动态生成的行ID号,结合JS控制行的显示与隐藏,也就是类似于微软菜单的可伸缩效果,文章最后有张图有助于大家理解,这是把生成页面的HTML复制进DW来只管演示程序的最终结果。
来看代码部分,并没有难懂的语法,请大家借助注释自己阅读,有兴趣可扩展此代码。
PHP代码如下:

<html>
<
head>
<
meta http-equiv="Content-Type" />
<
title>类别目录树</title>
<
script type="text/javascript">
function 
ShowMenu(MenuID)

 if(
MenuID.style.display=="none"){ 
    
MenuID.style.display=""
 } 
 else{ 
 
MenuID.style.display="none"
 } 

</script>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body topmargin="0" bgcolor="#EFEFE7">
<table width="100%" height="25" border="0" cellpadding="0" cellspacing="0" bgcolor="#739E18">
  <tr>
    <td align="left"> <strong>栏目树形结构列表</strong></td>
  </tr>
</table>
<?php
     
//基本变量设置 
     
$GLOBALS["ID"] =1//用来跟踪下拉菜单的ID号 
     
$layer=1//用来跟踪当前菜单的级数 
     //连接数据库 
     
$Con=mysql_connect("localhost","root","7529639"); 
     
mysql_select_db("cr_download"); 
     
mysql_query("SET NAMES 'GBK'");
     
//提取一级菜单 
     
$sql="select * from cr_columninfo where columnfatherid=0"
     
$result=mysql_query($sql,$Con); 

     
//如果一级菜单存在则开始菜单的显示 
     
if(mysql_num_rows($result)>0ShowTreeMenu($Con,$result,$ID); 


     
//============================================= 
     //显示树型菜单函数 ShowTreeMenu($con,$result,$layer) 
     //$con:数据库连接 
     //$result:需要显示的菜单记录集 
     //$layer:需要显示的菜单的级数 
     //============================================= 
     
function ShowTreeMenu($Con,$result,$layer
     { 
       
//取得需要显示的菜单的项目数 
       
$numrows=mysql_num_rows($result); 

       
//开始显示菜单,每个子菜单都用一个表格来表示 
       
echo "<table cellpadding='0' cellspacing='0' border='0' width='100%'>"

      for(
$rows=0;$rows<$numrows;$rows++) 
      { 
        
//将当前菜单项目的内容导入数组 
        
$menu=mysql_fetch_array($result); 

        
//提取菜单项目的子菜单记录集 
        
$sql="select * from cr_columninfo where columnfatherid=$menu[columnid]"
        
$result_sub=mysql_query($sql,$Con); 

        echo 
"<tr>"
        
//如果该菜单项目有子菜单,则添加JavaScript onClick语句 
        
if(mysql_num_rows($result_sub)>0
        { 
          echo 
"<td width='20'><img src='./images/plus.png' border='0' > </td>"
          echo 
"<td class='Menu' >"
        } 
        else{ 
          echo 
"<td width='20'><img src='./images/page.png' border='0'> </td>"
          echo 
"<td class='Menu'>"
        } 
     
//如果该菜单项目没有子菜单,只显示菜单名称 
     
echo $menu[columnname];
     echo 
"</td></tr>"

     
//如果该菜单项目有子菜单,则显示子菜单 
     
if(mysql_num_rows($result_sub)>0
     { 
      
//指定该子菜单的ID和style,以便和onClick语句相对应 
      
echo "<tr id=Menu".$GLOBALS["ID"]++." style='display:none'>"
      echo 
"<td width='20'> </td>"
      echo 
"<td>"
     
//将级数加1 
     
$layer++; 
     
//递归调用ShowTreeMenu()函数,生成子菜单 
     
ShowTreeMenu($Con,$result_sub,$layer); 
     
//子菜单处理完成,返回到递归的上一层
     
echo "</td></tr>"
     } 
     
//子菜单处理完成,返回到递归的上一层,将级数减1 
     
$layer--; 
   } 
     echo 
"</table>"
  } 
?>
</body>
</html> 


最后贴上效果图和源代码打包,希望本文对大家有所帮助^_^

PHP文件上传实例详解续!!!

分类:PHP基础应用

昨天已经已经讲了基本的文件上传方法,那么这是不够的,我们还需要对它们进行管理,今天接着贴出上次的后续部分,这里采用数据库记录上传文件的信息方便操作,先看看数据表结构:
数据库名:upload

-- 表的结构 `cr_uploadfile`
--

CREATE TABLE `cr_uploadfile` (
  `f_id` bigint(8) NOT NULL auto_increment,
  `f_name` varchar(50) NOT NULL default '',
  `f_save` varchar(200) NOT NULL default '',
  `f_url` varchar(200) NOT NULL default '',
  `f_date` date NOT NULL default '0000-00-00',
  `f_status` int(2) NOT NULL default '0',
  PRIMARY KEY  (`f_id`)
) ENGINE=MyISAM AUTO_INCREMENT=49 DEFAULT CHARSET=utf8 AUTO_INCREMENT=49 ;

这里贴出主要代码,大家不懂的可以查阅手册,例子并不难懂^_^,有兴趣的可以下载源代码研究
处理上传数据代码:
PHP代码如下:

<?php
  
include('global.php');
  include(
'../inc/config.inc.php');
  include(
'../inc/dbclass.php');
  
  
$a=strtolower(fileext($_FILES['file']['name']));
  
//判断文件类型
  
if(!in_array(strtolower(fileext($_FILES['file']['name'])),$type))
    {
        
$text=implode(",",$type);
        echo 
"您只能上传以下类型文件: ",$text,"<br>";
    }
  
//生成目标文件的文件名    
    
else{
    
$filename=explode(".",$_FILES['file']['name']);
        do
        {
            
$filename[0]=random(10); //设置随机数长度
            
$name=implode(".",$filename);
            
//$name1=$name.".Mcncc";
            
$uploadfile=$uploaddir.$name;
        }
        while(
file_exists($uploadfile));

        if (
move_uploaded_file($_FILES['file']['tmp_name'],$uploadfile)){
             
$db=new db;//创建数据库连接对象
             
$db->mysql($dbhost,$dbuser,$dbpassword,$dbname);//调用连接参数函数
             
$db->createcon();//调用创建连接函数
             
$time=date("Y-m-d");
             
$url=$patch.$name;
             
$upsql="insert into cr_uploadfile values (0,'$name','$url','$uploadfile','$time',0)";

              if(
$db->query($upsql)){
                
//输出图片预览
                
echo "<center>您的文件已经上传完毕 上传图片预览: </center><br><center><img src='$uploadfile'></center>";
                echo
"< br><center><a href='history.go(-1)'>继续上传< /a> <a href=../admin/upfileman.php>管理</a></center>";
              }
              else{
                echo 
"上传失败!";
                }
        }
    }
    
    
$db->close();//关闭数据库连接
?> 


管理页面:
PHP代码如下:

<?php
  
include('../inc/config.inc.php');
  include(
'../inc/dbclass.php');
  include(
'../inc/pageft.php');
  
$db=new db;//从数据库操作类生成实例
  
$db->mysql($dbhost,$dbuser,$dbpassword,$dbname);//调用连接参数函数
  
$db->createcon();//调用创建连接函数
?>
<script type="text/javascript">
function ConfirmDel()
{
   if(confirm("确认删除?并且不能恢复!确定要删除该文件吗?"))
     return true;
   else
     return false;     
}
</script>
<html>
<head>
<meta http-equiv="Content-Type" c />
<title>上传文件管理</title>
<style type="text/css">
<!--
body,td,th {
    font-size: 9pt;
}
body {
    background-color: #EFEFE7;
}
.s1 {
    font-weight: bold;
    color: #FFFFFF;
}
a:link {
    color: #0000FF;
    text-decoration: none;
}
a:visited {
    color: #0000FF;
    text-decoration: none;
}
a:hover {
    text-decoration: underline;
}
a:active {
    text-decoration: underline;
}
-->
</style></head>

<body topmargin="0">
<table width="900" height="25" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#739E18">
  <tr>
    <td align="center" class="s1">上传文件管理 <a href=../upload/index.html>继续上传</a></td>
  </tr>
</table>
<table width="900" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#333333">
  <tr>
    <td><table width="100%" border="0" cellpadding="1" cellspacing="1">
  <tr>
    <td height="30" colspan="6" bgcolor="#EFEFE7"> <span class="s2">上传文件列表</span></td>
  </tr>
<?php
  $querysql
="select * from cr_uploadfile";
  
$result=$db->query($querysql);
  
$total=mysql_num_rows($result);//取得信息总数
  
  /*调用pageft(),每页显示10条信息(使用默认的20时,可以省略此参数),
  使用本页URL(默认,所以省略掉)。*/
  
pageft($total,10);
  
//使用全局变量
  
$result=$db->query("select * from cr_uploadfile order by f_id desc limit $firstcount,$displaypg ");
  while(
$rows=$db->loop_query($result)){
?>  
  <tr>
    <td height="25" align="left" bgcolor="#EFEFE7"> ID:<?php echo $rows[f_id];?></td>
    <td height="25" align="left" bgcolor="#EFEFE7"> 文件名称:<a title="点击查看该图片" href=<?php echo $rows[f_save];?> target="_blank"><?php echo $rows[f_name];?></a> </td>
    <td align="left" bgcolor="#EFEFE7"> 状态:
    <?php 
      
if($rows[f_status]==0
      echo
"<font color=red>未通过</font>";
      else
      echo
"<font color=red>已通过</font>";
     
?></td>
    <td height="25" align="left" bgcolor="#EFEFE7"> 上传时间:<?php echo $rows[f_date];?></td>
    <td height="25" align="center" bgcolor="#EFEFE7"> <a  href="../upload/delfile.php?id=<?php echo $rows[f_id];?>">删除该文件</a><?php 
    
if($rows[f_status]==0)
     echo
"/<a href=filepass.php?id=$rows[f_id]>通过审核</a>";
     
?></td>
    </tr>
<?
}
?>
</table></td>
  </tr>
</table>

<table width="900" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td height="50" align="center">
<?php 
//输出分页导航条代码:
  
echo $pagenav;
?></td>
  </tr>
</table>
</body>
</html> 


分页函数(这个稍微复杂些):
PHP代码如下:

<?php
//为了避免重复包含文件而造成错误,加了判断函数是否存在的条件:
if(!function_exists(pageft)){ 
//定义函数pageft(),三个参数的含义为:
//$totle:信息总数;
//$displaypg:每页显示信息数,这里设置为默认是20;
//$url:分页导航中的链接,除了加入不同的查询信息“page”外的部分都与这个URL相同。
//   默认值本该设为本页URL(即$_SERVER["REQUEST_URI"]),但设置默认值的右边只能为常量,所以该默认值设为空字符串,在函数内部再设置为本页URL。
function pageft($totle,$displaypg=20,$url=''){

//定义几个全局变量: 
//$page:当前页码;
//$firstcount:(数据库)查询的起始项;
//$pagenav:页面导航条代码,函数内部并没有将它输出;
//$_SERVER:读取本页URL“$_SERVER["REQUEST_URI"]”所必须。
global $page,$firstcount,$pagenav,$_SERVER;

//为使函数外部可以访问这里的“$displaypg”,将它也设为全局变量。注意一个变量重新定义为全局变量后,原值被覆盖,所以这里给它重新赋值。
$GLOBALS["displaypg"]=$displaypg;

if(!
$page$page=1;

//如果$url使用默认,即空值,则赋值为本页URL:
if(!$url){ $url=$_SERVER["REQUEST_URI"];}

//URL分析:
$parse_url=parse_url($url);
$url_query=$parse_url["query"]; //单独取出URL的查询字串
if($url_query){
//因为URL中可能包含了页码信息,我们要把它去掉,以便加入新的页码信息。
//这里用到了正则表达式
$url_query=ereg_replace("(^|&)page=$page","",$url_query);

//将处理后的URL的查询字串替换原来的URL的查询字串:
$url=str_replace($parse_url["query"],$url_query,$url);

//在URL后加page查询信息,但待赋值: 
if($url_query$url.="&page"; else $url.="page";
}else {
$url.="?page";
}

//页码计算:
$lastpg=ceil($totle/$displaypg); //最后页,也是总页数
$page=min($lastpg,$page);
$prepg=$page-1//上一页
$nextpg=($page==$lastpg $page+1); //下一页
$firstcount=($page-1)*$displaypg;

//开始分页导航条代码:
$pagenav="显示第 <B>".($totle?($firstcount+1):0)."</B>-<B>".min($firstcount+$displaypg,$totle)."</B> 条记录,共 $totle 条记录<BR>";

//如果只有一页则跳出函数:
if($lastpg<=1) return false;

$pagenav.=" <a href='$url=1'>首页</a> ";
if(
$prepg$pagenav.=" <a href='$url=$prepg'>前页</a> "; else $pagenav.=" 前页 ";
if(
$nextpg$pagenav.=" <a href='$url=$nextpg'>后页</a> "; else $pagenav.=" 后页 ";
$pagenav.=" <a href='$url=$lastpg'>尾页</a> ";

//下拉跳转列表,循环列出所有页码:
$pagenav.=" 到第 <select name='topage' size='1' >n";
for(
$i=1;$i<=$lastpg;$i++){
if(
$i==$page$pagenav.="<option value='$i' selected>$i</option>n";
else 
$pagenav.="<option value='$i'>$i</option>n";
}
$pagenav.="</select> 页,共 $lastpg 页";
}
}
?> 

PHP文件上传实例详解!!!

分类:PHP基础应用

最近为了象牙,有点不务正业的嫌疑,经过最近一段时间的疯狂灌水终于拿到了象牙,嘿嘿,今天重出江湖,想到论坛似乎没什么为新手讲的上传实例,而这部分是很常用的,故今天献丑为各位新鸟详细讲解下怎样实现文件上传。用过ASP的都知道,ASP的上传要么购买官方的组件实现,要么就编写复杂的上传类,是相当麻烦的,这里不免要宣传下PHP,PHP使上传变的非常容易且这一切都是免费的,怎么样,你心动了没有?心动不如行动(好土的台词- _ -!),赶紧跟我来吧~~~,另外说一句,斑竹如果觉得我写的好,可要给我加精哦!!^_^
     首先来看下上传部分的表单代码:

     <form method="post" action="upload.php" enctype="multipart/form-data">
     <table border=0 cellspacing=0 cellpadding=0 align=center width="100%">
      <tr>
        <td width=55 height=20 align="center"><input type="hidden" name="MAX_FILE_SIZE" value="2000000">文件: </TD>
        <td height="16">
        <input name="file" type="file"  value="浏览" >
         
        < input type="submit" value="上传" name="B1">
        </td>
      </tr>
     </table>
     </form>
     

这里有几个要注意的地方,首先看这句<form method="post" action="upload.php" enctype="multipart/form-data">这里我们采用POST方法,个别浏览器还支持PUT方法,当然这需要对脚本进行修改,我并不建议这么做。表单中必须设置enctype="multipart/form-data,这样,服务器就知道上传文件带有常规表单信息,记住,这个是必须设置的。此外还需要一个隐藏域来限制上传文件的最大长度:<input type="hidden" name="MAX_FILE_SIZE" value="2000000">,这里name必须设置成MAX_FILE_SIZE,其值就是上传文件的最大长度,单位是B,这里我限制成2M。再看这句:<input name="file" type="file"  value="浏览" >,type="file" 说明了文件类型,这样一个基本的上传文件接口就完成了,接下来讲讲如何用PHP来处理上传的文件,此外你的php.ini中设置的上传文件最大长度可能会影响到你的实际上传,请根据实际情况修改,另PHP的上传是先传到临时目录,在移至指定目录的,了;临时目录的可根据需要修改,也可使用默认值。
   好的,表单提交upload.php,来看看这个页面都有什么:
PHP代码如下:

<?php

 
/*****************************************

   Title :文件上传详解
   Author:leehui1983(辉老大)
   Finish Date  :2006-12-28

  *****************************************/

   
$uploaddir "./files/";//设置文件保存目录 注意包含/    
   
$type=array("jpg","gif","bmp","jpeg","png");//设置允许上传文件的类型 
   
$patch="http://127.0.0.1/cr_downloadphp/upload/files/";//程序所在路径
   
   //获取文件后缀名函数
      
function fileext($filename)
    {
        return 
substr(strrchr($filename'.'), 1);
    }
   
//生成随机文件名函数    
    
function random($length)
    {
        
$hash 'CR-';
        
$chars 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
        
$max strlen($chars) - 1;
        
mt_srand((double)microtime() * 1000000);
            for(
$i 0$i $length$i++)
            {
                
$hash .= $chars[mt_rand(0$max)];
            }
        return 
$hash;
    }

   
$a=strtolower(fileext($_FILES['file']['name']));
   
//判断文件类型
   
if(!in_array(strtolower(fileext($_FILES['file']['name'])),$type))
     {
        
$text=implode(",",$type);
        echo 
"您只能上传以下类型文件: ",$text,"<br>";
     }
   
//生成目标文件的文件名    
   
else{
    
$filename=explode(".",$_FILES['file']['name']);
        do
        {
            
$filename[0]=random(10); //设置随机数长度
            
$name=implode(".",$filename);
            
//$name1=$name.".Mcncc";
            
$uploadfile=$uploaddir.$name;
        }

   while(
file_exists($uploadfile));

        if (
move_uploaded_file($_FILES['file']['tmp_name'],$uploadfile)){
            
            if(
is_uploaded_file($_FILES['file']['tmp_name']){
                
//输出图片预览
                
echo "<center>您的文件已经上传完毕 上传图片预览: </center><br><center><img src='$uploadfile'></center>";
                echo
"<br><center><a href='history.go(-1)'>继续上传</a></center>";
              }
              else{
                echo 
"上传失败!";
              }
        }
   } 

?> 


刚看这些你可能有点晕~~,不过不要紧,听我讲完,你就会发现其实这玩意SO EASY!!首先我讲下原理,该程序以上传图片为例,先判断文件类型是否为图片格式,若是则上传文件,以随机数和时间的组合重新命名文件(避免上传文件重名,这样做很有必要!),接着上传文件到指定目录,成功上传则输出上传的图片预览。这里要对程序中一些函数作些解释。先看return substr(strrchr($filename, '.'), 1), strrchar()函数有什么作用呢,我举个例子大家就知道,比如一个图片文件 pic.jpg,我们用 strrchr处理,strrchr(pic.jpg,'.'),它将返回.jpg,明白了吗?该函数返回指定字符在该字符串最后出现的位置后的字符。配合 substr() 我们就可以取到jpg,这样我们就得到了文件的后缀名,来判断上传文件是否符合指定格式。本程序把指定的格式放在一个数组中,实际使用时可根据需要添加。
    接下来看产生随机数文件名部分, 我们看到mt_srand()这个函数,手册上叫他“播下一个更好的随机数发生器种子”,其实就是初始化一个随机数的函数,参数是(double)microtime() * 1000000,这里如果不这是参数就会自动设置个随机数,当然这不符合我们的需要,如此一来,随机数就具备一定的长度,保证了上传文件不重名。接着,我们调用判断文件类型的函数,并将其转化为小写strtolower(fileext($_FILES['file']['name'])),这里有个很关键的东东$_FILES ,这是个超级全局数组,保存了需要处理的表单数据,如果开启了register_globals,也可以直接访问,但这是不安全的。看刚才那个上传接口<input name="file" type="file"  value="浏览" >,根据这个表单名称,我们可以得到很多信息:
    $_FILES['file']['name']--  得到文件名称
    $_FILES['file']['tmp_name']--得到临时存储位置
    $_FILES['file']['size']--得到文件大小
    $_FILES['file']['type']--得到文件MIME类型
得到这些信息,我们就可以轻松判断文件的信息了,是不是很方便?^_^,接下来还有一些函数需要了解,file_exists()--判断指定目录是否存在,不存在我们当然不能上传(好像是废话!),move_uploaded_file--将上传文件移至指定目录,is_uploaded_file--判断文件是否已经通过HTTP POST上传。成功上传,我们就输出预览,否则输出上传失败!大功告成

Smarty结合Ajax实现无刷新留言本实例

分类:PHP+Ajax技术

看了标题你也许要说,留言本,很基本的东东啊!谁不会啊,还要用Smarty,这不找累吗?别急,我要表达的是一种编程的思想和结构,而不是证明我做的东西多有意义,通过它相信对初学者学习Smarty和ajax有些启发。原本用ajax做的,可惜始终调试不成功,只好用手写JS来弄了,不过不要紧,还是有一定价值的。站点结构大家下了源代码自己看,代码不长,应该不会看烦^_^,听我慢慢道来。
     现在都PHP5了OO(面向对象)很流行了都,这里也不错过,首先来看下我们用OO来实现数据库操作和连接:
[php]
<?php
/**************************
   
  页面:dbclass.php
  作者:辉老大
  功能:定义数据库操作类
**************************/
<?php
/**************************
   
  页面:dbclass.php
  作者:辉老大
  功能:定义数据库操作类
**************************/
class db
{
       
//创建构造函数,作用:数据库连接并选择相应数据库
       
public function __construct
(){
     require(
'config.inc.php'
);
           
mysql_connect($dbhost,$dbuser,$dbpassword) or die("error!"
);
     
mysql_query("SET NAMES 'GBK'"
);
           
mysql_select_db($dbname
);
       }
    
//执行SQL语句函数
    
public function query($sql
){
        return 
mysql_query($sql
);
    }
    
//取得结果集数组函数
    
public function loop_query($result
){
        return 
mysql_fetch_array($result
);
    }
    
//创建析构函数,作用:关闭数据库连接
    
public function __destruct
(){
     return 
mysql_close
();
    }
   }
?> 

这个类有什么特点呢?首先介绍下__construct()是构造函数,啥是构造函数?通俗点讲就是类被实例化后就自动执行的函数,__destruct()是啥?是析构函数,它的作用就是在没有任何方法指向这个对象时,便自动销毁对象,里面一般包含一些收尾的操作,比如关闭文件,关闭数据库连接之类的方法,看到这你是不是明白一些了?没错!在类实例化的时候自动执行带有数据库连接方法的构造函数,在实例销毁的时候执行关闭数据库连接的析构函数,对于一些基本数据操作我们只要new一个$db对象,然后$db->query()...是不是很方便,当然,这只是一个简单的例子,你还可以继续扩展。来看看 config.inc.php里面是什么:
很容易对不对,感兴趣就接着看吧^_^,来看下模板文件:

<?php
/*************************
  
   页面:config.inc.php
   作者:辉老大
   功能:数据库参数变量设定
   $dbhost:主机名
   $dbuser:连接帐户
   $dbpassword:连接密码
   $dbname:数据库名
*************************/
   
$dbhost     "localhost"
;
   
$dbuser     "root"
;
   
$dbpassword "7529639"
;
   
$dbname     "testdb"
;
?> 


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title><{$title}></title>
<style type="text/css">
<!--
.username {
height: 20px;
width: 250px;
}
.comment {
height: 100px;
width: 660px;
}
body,td,tr {
font-size: 9pt;
}
-->
</style>
<script language="javascript" src="./inc/ajax.js"></script>
</head>
<body>
<div align="right" id="check"></div>
<div id="result"><{*这里显示留言内容*}>
<{section name=loop loop=$bookinfo}><{*循环显示留言*}>
用户名:<{$bookinfo[loop].username}> 内容:<{$bookinfo[loop].comment}><p>
<{/section}>
</div>
<form method="post" name="book" id="book">
  <table width="760" border="1" cellpadding="0" cellspacing="0">
    <tr>
      <td width="80" height="30" align="center">用户名:</td>
      <td height="30"> <input name="username" type="text" class="username" id="username"></td>
    </tr>
    <tr>
      <td width="80" height="120" align="center">留言内容:</td>
      <td height="120"> <textarea name="comment" class="comment" id="comment"></textarea></td>
    </tr>
  </table>
  <input type="button" name="button" value="发布" onClick="send('result');">
  </form>
</body>
</html>

模板中的内容在<{}>中的一会会被PHP替换掉,这就实现了美工和程序员的分工,不错吧有关Smarty的内容还请参考手册,这里就不便多说。来看下页面是怎么输出模板的吧:

<?php
  
/*****************************************
   Title :Smarty结合Ajax留言板实例
   Author:leehui1983(辉老大)
   Page Name:index.php
   Finish Date  :2006-12-17
  *****************************************/
  
  
require('./libs/Smarty.class.php');
//包含smarty类库
  
require('./inc/dbclass.php');
//包含数据库操作类
  
  
$db = new db();
//生成数据库操作实例
  
$smarty = new Smarty();
//实例化smarty对象
  
$smarty->template_dir "./templates";
//设置模板目录
  
$smarty->compile_dir  "./templates_c"
//设置编译目录
  
$smarty->caching      false
//设置缓存方式
  /*****************************************************
  左右边界符,默认为{},但实际应用当中容易与JavaScript
  相冲突,所以建议设成<{}>或其它。
  *****************************************************/
  
$smarty->left_delimiter  "<{"

  
$smarty->right_delimiter "}>"
;
  
$smarty->assign('title','smarty结合ajax制作简单留言板');
//替换模板内容
  //设置初始页面由Smarty显示的留言内容
  
$rt=$db->query("select * from bookinfo order by id desc"
);
  while(
$rs=$db->loop_query($rt
)){
   
$array[]=array("username"=>$rs['username'],"comment"=>$rs['comment'
]);
  }
  
$smarty->assign("bookinfo",$array
);
  unset (
$array);
//销毁数组变量
  
$smarty->display("index.tpl");
//编译并显示位于./templates下的index.tpl模板
?> 

页面实例的注释还是比较多的,大家参考下Smarty手册这个是So easy的!!呵呵~~~~
接下来到了介绍ajax的时候,这里我们用一个基本的开发框架来实现,关于ajax的知识建议大家看看网上非常流行的电子教程ajax开发简略
var http_request=false;
  function send_request(url){//初始化,指定处理函数,发送请求的函数
    http_request=false;
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest){//Mozilla浏览器
  http_request=new XMLHttpRequest();
  if(http_request.overrideMimeType){//设置MIME类别
    http_request.overrideMimeType("text/xml");
  }
}
else if(window.ActiveXObject){//IE浏览器
  try{
   http_request=new ActiveXObject("Msxml2.XMLHttp");
  }catch(e){
   try{
   http_request=new ActiveXobject("Microsoft.XMLHttp");
   }catch(e){}
  }
    }
if(!http_request){//异常,创建对象实例失败
  window.alert("创建XMLHttp对象失败!");
  return false;
}
http_request.onreadystatechange=processrequest;
//确定发送请求方式,URL,及是否同步执行下段代码
    http_request.open("GET",url,true);
http_request.send(null);
  }
  //处理返回信息的函数
  function processrequest(){
   if(http_request.readyState==4){//判断对象状态
     if(http_request.status==200){//信息已成功返回,开始处理信息
   document.getElementById(reobj).innerHTML=http_request.responseText;
  }
  else{//页面不正常
   alert("您所请求的页面不正常!");
  }
   }
  }
  function send(obj){
   var f=document.book;
   var username=f.username.value;
   var comment=f.comment.value;
   if(username==""||comment==""){
   document.getElementById(obj).innerHTML="<font color=red>请填写完整!</font>";
   return false;
   }
   else{
   send_request('checkbookinfo.php?username='+username+'&comment='+comment);
   reobj=obj;
   }
  }

这样我们点“发布”按钮,数据就会交由服务器异步处理,通过JS来组织异步更新,在发过留言后你马上就能看见你的留言而不是传统的等待页面跳转,那么数据传到哪里处理呢?看这里:
<?php
  
  
/*****************************************
   Title :Smarty结合Ajax留言板实例
   Author:leehui1983(辉老大)
   Page Name:checkbookinfo.php
   Finish Date  :2006-12-17
  *****************************************/
  
header("Content-type: text/html;charset=GBK");
//输出编码,避免中文乱码
  
include('./inc/dbclass.php');
//包含数据库操作类
  
$db=new db();
//生成数据库操作实例
  
$sql="insert into bookinfo values(0,'".$comment."','".$username."')"
;
  
$db->query($sql
);
  
$querysql="select * from bookinfo order by id desc"
;
  
$result=$db->query($querysql
);
  while(
$rows=$db->loop_query($result)){
//打印留言列表,用于实时更新
  //$arr.="用户名:{$rows['username']} 内容:{$rows['comment']}<p>";
  
echo '用户名:'.$rows['username'].' 内容:'.$rows['comment'].'<p>'
;
  }
  
//echo $arr;
  
?> 


嗯,先插入数据,在将更新后的数据通过JS组织显示,AJAX看来真的不错哦!大体就介绍完了,不知道大家想过没有,加个 iframe可以改成什么?对!无刷新聊天室,发挥你的能力,实现一个看看。这个例子用到了OO,AJAX,SMARTY,东西还是蛮多滴,希望大家喜欢,我已经决定将此文向PHP杂志投稿,大家若是转载,还希望注明版权,谢谢!最后来个效果图~~~~

smarty结合xajax检测用户名简单实例

分类:PHP基础应用

在原创那边写了几个php+ajax的应用例子,今天和新手谈谈smarty+xjax,希望对新手有帮助,xajax是用PHP写的ajax开发框架,可以生成JS代码,这样使用起ajax就比较简单了,今天结合模板引擎smarty,来实现一个检测用户名合法性的小程序,大家有兴趣的话还可以扩展这个程序到自己的应用中,嗯,这里写出核心代码,里面注释很详细,不过建议大家看之前还是看看这个http://blog.csdn.net/fhiesc/archive/2006/07/04/873441.aspx,相信你会很快明白xajax是什么东东,及如何使用,最后依然是效果图。好的,看代码吧:

<?php

  
/*****************************************

   Title :smarty结合xajax检测用户名简单实例
   Author:leehui1983(辉老大)
   Finish Date  :2006-12-09

  *****************************************/

  //为避免中文乱码,需要在 xajax.inc.php 需要改一下默认的encoding:define ('XAJAX_DEFAULT_CHAR_ENCODING', 'gbk' )UTF8编码格式文件不需要更改

  
require_once('./libs/Smarty.class.php');
//包含smarty类库
  
require('./xajax/xajax.inc.php');
//包含xajax类库

  
function checkusername($textvalue){
//编写需要的PHP函数
       
$checkresult=($textvalue=='test' '<font color=red>该用户名已经注册</font>' :'<font color=red>可以注册</font>'
);
       
$objresponse=new xajaxResponse();
//实例化xajaxresponse对象
       
$objresponse->addassign("result","innerHTML",$checkresult);
//指定ID为result的元素中添加内容$checkresult
       
return $objresponse;
//返回结果文本
  
}

  
$xajax=new xajax();
//实例化xajax对象
  
$smarty=new Smarty();
//实例化smarty对象
  
$smarty->template_dir "./templates";
//设置模板目录
  
$smarty->compile_dir "./templates_c"
//设置编译目录
  
$smarty->caching false
//设置缓存方式
  /*****************************************************
  左右边界符,默认为{},但实际应用当中容易与JavaScript
  相冲突,所以建议设成<{}>或其它。
  *****************************************************/
  
$smarty->left_delimiter "<{"

  
$smarty->right_delimiter "}>"
;


  
$xajax->registerFunction("checkusername");
//注册checkusername函数
  
$xajax->processRequests();
//调用xajax用于接管请求
  
  
$smarty->assign('xajax_javascript'$xajax->getJavascript('./xajax/'));
//输出JS代码,注意('./xajax/')中参数为xajax.inc.php父目录,在同意目录下可不同填写,否则必须填写
  
$smarty->assign('title','smarty结合xajax检测用户名简单实例');
//替换模板内容
  
$smarty->display('index.tpl');
//显示模板内容
?> 

模板代码:

<html>
<
head
>
<
meta http-equiv="Content-Type" 
/>
<
title><{$title}></title
>
<{
$xajax_javascript}><{*使smarty支持xajax
*}>
</
head
>

<
body
>
<
form  name="check" 
>
请输入用户名:
  
<input type="text" name="username" 
/>
  <
input type="button" name="button" value="检查用户名"  
/>
  <
div id="result"></div
>
</
form
>
</
body
>
</
html

是不是不错?喜欢就顶吧~~~~~~~
效果图:

 

PHP AJAX2级联动下拉列表(简单好用)

分类:PHP+Ajax技术

由于大4了,接下来要忙找工作和学校一些繁琐的事情,接下来的1,2个月可能没有时间写原创作品,今晚再弄一个,希望大家喜欢,别忘了支持我哦!^_^。这次给大家展示的是非常常用的一个ajax功能--联动下拉列表,本程序采用2级联动,根据数据库的内容用ajax处理下拉列表内容,实现根据用户需求取得下拉选项,交互性强,更新容易。废话少说,不如正题,这次依然象往常一样提供截图和源码下载,首先还是AJAX框架:

var http_request=false;
  function send_request(url){//初始化,指定处理函数,发送请求的函数
    http_request=false;
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest){//Mozilla浏览器
  http_request=new XMLHttpRequest();
  if(http_request.overrideMimeType){//设置MIME类别
    http_request.overrideMimeType("text/xml");
  }
}
else if(window.ActiveXObject){//IE浏览器
  try{
   http_request=new ActiveXObject("Msxml2.XMLHttp");
  }catch(e){
   try{
   http_request=new ActiveXobject("Microsoft.XMLHttp");
   }catch(e){}
  }
    }
if(!http_request){//异常,创建对象实例失败
  window.alert("创建XMLHttp对象失败!");
  return false;
}
http_request.onreadystatechange=processrequest;
//确定发送请求方式,URL,及是否同步执行下段代码
    http_request.open("GET",url,true);
http_request.send(null);
  }
  //处理返回信息的函数
  function processrequest(){
   if(http_request.readyState==4){//判断对象状态
     if(http_request.status==200){//信息已成功返回,开始处理信息
   document.getElementById(reobj).innerHTML=http_request.responseText;
  }
  else{//页面不正常
   alert("您所请求的页面不正常!");
  }
   }
  }
  function getclass(obj){
   var pid=document.form1.select1.value;
   document.getElementById(obj).innerHTML="<option>loading...</option>";
   send_request('doclass.php?pid='+pid);
   reobj=obj;
  }

这个程序的核心就是动态添加
<option>......</option>

服务器端是进行数据的检索,很简单:

<?php
  header("Content-type: text/html;charset=GBK");//输出编码,避免中文乱码
  $pid=$_GET['pid'];
  $db=mysql_connect("localhost","root","7529639"); //创建数据库连接
  mysql_query("set names 'GBK'");
  mysql_select_db("menuclass");
  $sql="select classname from menu where parentid=".$pid."";
  $result=mysql_query($sql);
  
  //循环列出选项
  while($rows=mysql_fetch_array($result)){
   echo '<option>';
      echo $rows['classname'];
   echo "</option>n";
  }
?>
再看看列表页面的html:
<script language="javascript" src="ajaxmenu.js"></script>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>ajax2级联动菜单演示</title>
</head>
<body>
<form name="form1">
<select name="select1" id="class1" style="width:100;" onChange="getclass('class2');">
  <option selected="selected"></option>
  <option value="1">大类1</option>
  <option value="2">大类2</option>
</select>
<select name="select2"id="class2" style="width:100;">
</select>
</form>
</body>
</html>
今晚好像精神不好,代码调试了很久,晕死,最后老规矩,截图,源码下载,喜欢就顶吧~~~
 

更多日志..

我的聊天室

暂无聊天室

进入聊天室

最新评论