存档

文章标签 ‘php’

php静态属性和静态方法

2013年2月22日 3 条评论

静态属性

静态属性也就是说它的值保持其值,比如在类中实例化了N个对象,那么你可以在构造函数中定义一个静态属性来记住对象的个数。类中的静态属性和静态变量差不多,只不过在类中似乎又多了一个些使用上的限制罢了。让我们看看一般的变量吧:
[php]
<?php

function test() {

$n = 1;

echo "The number is:$n
";

$n++;

}

test();

test();

test();

test();

test();

test();

?&gt;
[/php]
[php]
<?php function test() { $n = 1; echo "The number is:$n<br ?–>"; $n++;}test();test();test();test();test();test();?&gt;
[/php]
很显然这个函数的结果如下:
[php]
The number is:1

The number is:1

The number is:1

The number is:1

The number is:1

The number is:1
[/php]
但是如果你的程序是这样:
[php]
<?php

function test() {

static $n = 1;

echo "The number is:$n
";

$n++;

}

test();

test();

test();

test();

test();

test();

?&gt;
<!php function <br ?–> test() { static $n = 1; echo "The number is:$n
"; $n++;}test();test();test();test();test();test();?&gt;
[/php]
我们只不过在变量名加了个static关键字而已,结果就大大的不同了:
[php]
The number is:1

The number is:2

The number is:3

The number is:4

The number is:5

The number is:6
[/php]
1.static关键字可以用来修饰变量、方法(静态方法)

2.不经过实例化,就可以直接访问类中static的属性和static的方法。

3.static 的属性和方法,只能访问static的属性和方法,不能访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用。

4.在当前类中如果要访问静态成员可以使用self::关键字进行访问。

5.在类中我们不能使用this关键来访问静态属性,因为静态属性在对象可能还没有实例化之前已经存在。

6.在类中静态方法访问静态属性,使用类名::静态属性名即可调用类中的静态属性。

静态方法

在这个示例里我们看到,使用了两种方法来访问静态属性$money的值:一种是前面都提到的类名::属性值的形式,另外一种则是使用了self关键字。当然推荐使用self关键字这种方式,因为如果那天不高兴了,我们修改的类名,那么如果你使用了第一种方式,你是不是还得修改下调用它的方法呢,当然你得在同一个类中,如果你是在子类中想调用父类的静态属性和方法,那就得使用parent::的方式了。

再说一下

1:如果你想在静态方法中调用其它静态方法时,请使用方法是:类名::方法名的形式进行调用,还是那句,如果你在同一个类进行这样的调用,就使用selft关键字进行调用吧。要不然你得的程序可就得报错了。

2:php中静态方法不能调用非静态的属性和非静态方法,也不能使用类名::或者self::调用非静态属性。更不能使用$this->属性名来调用,总之在静态方法中只能调用静态属性或方法,非静态的无法调用。

分类: PHP 标签: , ,

liunx安装Apache+php+Mysql+FTP

2012年10月12日 2 条评论

1 安装Apache+php+Mysql  (来自jonelaw)

a、安装Apahce, PHP, Mysql, 以及php连接mysql库组件 yum -y install httpd php mysql mysql-server php-mysql

b、安装mysql扩展    yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql
或一次性粘贴安装:yum -y install httpd php mysql mysql-server php-mysql httpd-manual mod_ssl mod_perl mod_auth_mysql php-mcrypt php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc mysql-connector-odbc mysql-devel libdbi-dbd-mysql然后启动 mysql 服务启动 service mysqld start
停止:  service mysqld stop重启:  service mysqld restart

c、设置mysql数据库root帐号密码。
mysqladmin -u root password ‘newpassword’ [引号内填密码]e.g mysqladmin -u root password 123456
d、 让mysql数据库更安全
mysql -u root -p [此时会要求你输入刚刚设置的密码,输入后回车即可mysql> DROP DATABASE test; [删除test数据库]
mysql> DELETE FROM mysql.user WHERE user = ”; [删除匿名帐户]
mysql> FLUSH PRIVILEGES; [重载权限]e、 按照以上的安装方式, 配置出来的默认站点目录为/var/www/html/新建一个php脚本:记得的设置文件写入权限

chmod命令

将档案 file1.txt 设为所有人皆可读取 :
chmod a+r file1.txt

参考地址 http://www.linuxso.com/command/chmod.html

<?php
phpinfo();
?>

2、//安装php的扩展

yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc3、//安装apache扩展yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql
4、 配置防火墙
添加允许访问HTTP、FTP端口

iptables -I RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

iptables -I RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

重启iptables: service iptables restart

5、 安装ftp

vsftpd作为FTP服务器,在Linux系统中是非常常用的。下面我们介绍如何在centos系统上安装vsftp。 (出自零度科技)

什么是vsftpd
vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。

vsftpd 的名字代表”very secure FTP daemon”, 安全是它的开发者 Chris Evans 考虑的首要问题之一。在这个 FTP 服务器设计开发的最开始的时候,高安全性就是一个目标。 内容来自零度科技

安装vsftpd
1、以管理员(root)身份执行以下命令

yum install vsftpd
2、设置开机启动vsftpd ftp服务 copyright www.00isp.com

chkconfig vsftpd on
3、启动vsftpd服务

service vsftpd start
管理vsftpd相关命令:

停止vsftpd:  service vsftpd stop

重启vsftpd:  service vsftpd restart

配置防火墙 (上面已经配置 如果没有请自行配置 )
打开/etc/sysconfig/iptables文件

vi /etc/sysconfig/iptables
在REJECT行之前添加如下代码

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT
保存和关闭文件,重启防火墙 内容来自www.00isp.com

service iptables start
配置vsftpd服务器
默认的配置文件是/etc/vsftpd/vsftpd.conf,你可以用文本编辑器打开。 copyright www.00isp.com

vi /etc/vsftpd/vsftpd.conf
添加ftp用户
下面是添加ftpuser用户,设置根目录为/home/wwwroot/ftpuser,禁止此用户登录SSH的权限,并限制其访问其它目录。

1、修改/etc/vsftpd/vsftpd.conf 内容来自www.00isp.com

将底下三行

#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list
改为
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
3、增加用户ftpuser,指向目录/home/wwwroot/ftpuser,禁止登录SSH权限。

useradd -d /home/wwwroot/ftpuser -g ftp -s /sbin/nologin ftpuser
4、设置用户口令 零度科技

passwd ftpuser
5、编辑文件chroot_list:

vi /etc/vsftpd/chroot_list
内容为ftp用户名,每个用户占一行,如: 内容来自www.00isp.com

peter
john 内容来自www.00isp.com

6、重新启动vsftpd

service vsftpd restart
另外,如果觉得以后管理ftp用户名嫌麻烦,可以使用centos官方发布的脚本管理。地址如下:http://wiki.centos.org/HowTos/Chroot_Vsftpd_with_non-system_users

出现的错误
1、500 OOPS: cannot change directory
解决方法:http://www.centos.bz/2011/10/ftp-500-oops-cannot-change-directory/

自此PHP的编程环境基本安装完成 本人是菜菜菜鸟一枚 基本上都是百度来的 这是我的安装步骤 ftp还是有点麻烦 配置文件给搞毁了 哎
太菜了 难搞的很啊

还是研究中
对了 免费的vps 传送门  http://www.vpsjy.com/268.html

分类: Linux 标签: , , ,

PHP常用代码

2012年5月1日 没有评论

Hash passwords with salts
[php]
// Déclaration des constantes
define(‘PREFIX_SALT’, ‘bonjour’);
define(‘SUFFIX_SALT’, ‘aurevoire’);
$hashSecure = md5(PREFIX_SALT.’m0tDePasse’.SUFFIX_SALT);
[/php]
HP Database Config

[php]

$dbhost = ‘127.0.0.1’;
$dbuser = ‘root’;
$dbpass = ”;
$dbname = ‘directory’;

[/php]

Simple PHP Math Image Captcha

[php]
// captcha width
$captcha_w = 150;
// captcha height
$captcha_h = 50;
// minimum font size; each operation element changes size
$min_font_size = 12;
// maximum font size
$max_font_size = 18;
// rotation angle
$angle = 20;
// background grid size
$bg_size = 13;
// path to font – needed to display the operation elements
$font_path = ‘fonts/courbd.ttf’;
// array of possible operators
$operators=array(‘+’,’-‘,’*’);
// first number random value; keep it lower than $second_num
$first_num = rand(1,5);
// second number random value
$second_num = rand(6,11);
[/php]

ZIP File PHP code script

[php]
require ("incl/zipfile.inc.php");
$zipfile = new zipfile();
$filedata = implode("", file("incl/zipfile.inc.php"));
$zipfile->add_dir("incl/");
$zipfile->add_file($filedata, "incl/zipfile.inc.php");
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=zipfile.zip");
echo $zipfile->file();
?>
[/php]

Extracting Image With PHP

[php]
$contenttograbimagefrom = $youroriginalhtmlwithimage;
$firstImage = "";
$output = preg_match_all(‘/<img.+src=[\’"]([^\’"]+)[\’"].*>/i’, $contenttograbimagefrom, $ContentImages);
$firstImage = $ContentImages[1] [0]; // To grab the first image
echo $firstImage;
[/php]

A simple PHP Mysql Class

[php]
//Simply include this file on your page
require_once("DbConnect.class.php");

//Set up all yor paramaters for connection
$db = new DbConnect("localhost","user","password","database",$error_reporting=false,$persistent=false);

//Open the connection to your database
$db->open() or die($db->error());

//Query the database now the connection has been made
$db->query("SELECT * FROM….") or die($db->error());

//You have several options on ways of fetching the data
//as an example I shall use
while($row=$db->fetcharray()) {

//do some stuff

}

//close your connection
$db->close();

#################################################################
Class DbConnect {

var $host = ”;
var $user = ”;
var $password = ”;
var $database = ”;
var $persistent = false;

var $conn = NULL;

var $result= false;
var $error_reporting = false;

/*constructor function this will run when we call the class */

function DbConnect ($host, $user, $password, $database, $error_reporting=true, $persistent=false) {

$this->host = $host;
$this->user = $user;
$this->password = $password;
$this->database = $database;
$this->persistent = $persistent;
$this->error_reporting = $error_reporting;
}

function open() {

if ($this->persistent) {

$func = ‘mysql_pconnect’;

} else {

$func = ‘mysql_connect’;

}

/* Connect to the MySQl Server */

$this->conn = $func($this->host, $this->user, $this->password);

if (!$this->conn) {

return false;

}

/* Select the requested DB */

if (@!mysql_select_db($this->database, $this->conn)) {

return false;
}
return true;
}

/*close the connection */

function close() {

return (@mysql_close($this->conn));
}

/* report error if error_reporting set to true */

function error() {

if ($this->error_reporting) {

return (mysql_error()) ;
}

}

function query($sql) {

$this->result = @mysql_query($sql, $this->conn);

return($this->result != false);

}
function affectedrows() {

return(@mysql_affected_rows($this->conn));
}

function numrows() {

return(@mysql_num_rows($this->result));

}
function fetchobject() {

return(@mysql_fetch_object($this->result, MYSQL_ASSOC));

}
function fetcharray() {

return(mysql_fetch_array($this->result));

}

function fetchassoc() {

return(@mysql_fetch_assoc($this->result));
}

function freeresult() {

return(@mysql_free_result($this->result));

}

}
[/php]

分类: PHP 标签: ,

PHP获取系统时间

2012年4月16日 没有评论

HP获取系统时间 CURRENT_TIMESTAMP

分类: PHP 标签: , ,

PHP时区设置

2012年3月6日 4 条评论

从php5.1.0开始,php.ini里加入了date.timezone 这个选项,默认情况下是关闭的

也就是显示的时间都是格林威治标准时间

有以下两种方法可以显示正常的时间。

1. 在关于时间的初始化的语句的上面加上

date_default_timezone_set (XXX);

2. 修改php.ini查找date.timezone 去掉前面的分号
= 后面加XXX,重启http服务(如apache2或iis等)即可

关于XXX,大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木齐)
港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北)
还有新加坡:Asia/Singapore

其他可用的值是:Etc/GMT-8 ,Singapore ,Hongkong ,PRC

在页头使用date_default_timezone_set()设置默认时区为北京时间

date_default_timezone_set(‘PRC’);
echo date(‘Y-m-d H:i:s’);

date_default_timezone_set用法如下

date_default_timezone_set
(PHP 5 >= 5.1.0RC1)

date_default_timezone_set — 设定用于一个脚本中所有日期时间函数的默认时区
说明

bool date_default_timezone_set ( string timezone_identifier )

date_default_timezone_set() 设定用于所有日期时间函数的默认时区。

注: 自 PHP 5.1.0 起(此版本日期时间函数被重写了),如果时区不合法则每个对日期时间函数的调用都会产生一条 E_NOTICE 级别的错误信息。

参数

timezone_identifier
时区标识符,例如 UTC 或 Europe/Lisbon

返回值

本函数永远返回 TRUE(即使 timezone_identifier 参数不合法)。

——————————————————————————————

再附上时区标识符:

CET
CST6CDT
Cuba
EET
Egypt
Eire
EST
EST5EDT
Etc/GMT
Etc/GMT+0
Etc/GMT+1
Etc/GMT+10
Etc/GMT+11
Etc/GMT+12
Etc/GMT+2
Etc/GMT+3
Etc/GMT+4
Etc/GMT+5
Etc/GMT+6
Etc/GMT+7
Etc/GMT+8
Etc/GMT+9
Etc/GMT-0
Etc/GMT-1
Etc/GMT-10
Etc/GMT-11
Etc/GMT-12
Etc/GMT-13
Etc/GMT-14
Etc/GMT-2
Etc/GMT-3
Etc/GMT-4
Etc/GMT-5
Etc/GMT-6
Etc/GMT-7
Etc/GMT-8
Etc/GMT-9
Etc/GMT0
Etc/Greenwich
Etc/UCT
Etc/Universal
Etc/UTC
Etc/Zulu
Factory
GB
GB-Eire
GMT
GMT+0
GMT-0
GMT0
Greenwich
Hongkong
HST
Iceland
Iran
Israel
Jamaica
Japan
Kwajalein
Libya
MET
MST
MST7MDT
Navajo
NZ
NZ-CHAT
Poland
Portugal
PRC
PST8PDT
ROC
ROK
Singapore
Turkey
UCT
Universal
UTC
W-SU
WET

分类: PHP 标签: , ,

PHP中调用mysqli方法出错解决方案

2012年3月2日 2 条评论

PHP中调用mysqli方法出错错误信息为:Fatal error: Trying to clone an uncloneable object of class mysqli

在DEDECMS里一般提示为:Fatal error: Trying to clone an uncloneable object of class mysqli in /home/httpd/html/ 我的域名/include/dedesqli.class.php on line 109

解决方法:打开php配置文件php.ini,找到zend.ze1_compatibility_mode,将该处值设置为off,重启服务器即可。

分类: PHP 标签: , , , , ,

php 实现无限分类

2009年12月6日 没有评论

php 实现无限分类

1.分析我们在用 php 制作网站时,分类是很重要的,在分类下面又再分类这第二个分类称为次分类,而现在大多数网站分类只分到第三类:

第一分类(父分类)–>第二分类(子分类)–>第三分类(孙分类)

这种亲缘分类越多,程序数据库的控制就越加的复杂困难.在同一级的分类处理和控制是非常的简单的,因为只需要一个数据库来记载这一级的分类就行了,如:系统,新闻等分类,在这一级上处理是很简单的,但对一个网站来说一级分类是不够的,还需要再分类,如:

系统–>linux,windows
新闻–>linux 新闻,windows 新闻

这样分类就清晰些了,至少让人明白了,系统包括 linux 和 windows,而新闻包括 linux 新闻和 windows 新闻,为了让信息资料更加清晰,于是再继续分类:

linux–>系统工具,内核,编程语言,开发工具

分类到了第三级,信息资料的处理就更清晰了,也就是说为了很清晰地处理资料,分类越详细就越方便,这样即方便处理信息又方便网友目的明确地查找到需要的资料,但随着不断的细化分类,在程序和数据库的控制上就会越来越困难.

困难一:如何在数据库里处理这些互有关联的亲缘分类?
困难二:如何用 php 完成这种一目了然的关系?

这种分级多而细的分类是每个 php 程序员都必须解决的问题,因为制作一个好而出色的网站分类问题是不可避免的,而解决这个问题又是相当复杂的,其中最大的问题就是数据库的分类处理,因为如果数据库处理不当将会带来巨大的工作量甚至是不得不重新规划数据库…

这并不是夸张,因为很多人在数据库处理上就会采用一级分类建立一个数据库的做法,我当时也是采取这种方法处理分类的,因大多网站都是分到第三级,所以数据库里只需三个分类数据库来进行处理.但是需要继续向下分类时,这种做法的弊端就显露出来了,因为越往下分,工作量,程序量将会巨增..

我要介绍的这种方法就是如何用一个分类数据库建立无限向下分级的分类方法,用过 windows 的读者都知道 windows 文件夹就可以建立无限分级的目录,可在目录下面继续建立目录,这样没完没了的分下去,Linux 的目录创建也有这种功能,我介绍的这个方法跟这种形式相同.
2.数据库的规划
————————————————————
前面谈到分类的复杂性,因此如何规划数据库便成为了实现无限分类非常重要的一步.

我曾介绍过论坛的数据库规划,不错论坛能够实现无限的跟接,无限分类便是这种形式的扩展,分类同样是这种子父的关联关系,所以分类的数据库就是如何确立明确这种子父关系,这里面有几个难点.

1)如何处理各分类的信息存储;
2)如何处理分类的亲缘关系;
3)如何处理对信息的查询;

亲缘关系的数据库处理与论坛的数据库处理类似,这里建个 type 的数据库用来处理分类:

建立字段:
id(int):用来记录各分类的自然序号
uid(int):用来记录该分类的父分类的 id 号
type(char):类别的名称
roue_id(varchar):亲缘树,以 :0:2:10:20: 的 id 连接表明亲源关系
roue_char(varchar):亲缘树,类似 :系统:linux:开发工具:gcc: (这个字段有没有都没关系,为了更方便地了解各亲缘关系当然字符表述比数字表述更直接^o^,不过最好加上这个字段)

这样一个无限分类的类别表就建立了起来,接下来就需要建立存储信息的数据库,处理查询一个表最方便所以这里建立一个表存储信息 type_message:

id(int):信息的序号;
typeid(int):所属类别的 id 号;
title(varchar):信息标题;
message(text):信息内容;
time:信息建立的时间;

这两个数据表就能够完成无限分类的这个任务了(两个表的辅助字段就没加了,读者可自行加入).

剩下的任务就全部交由 php 来处理完成.
3.程序控制
————————————————————

实现无限分类这个功能中就属这一步最为复杂辛苦,首先看看程序需要完成的步骤:

1)创建分类上传;
2)创建信息上传;
3)明确显示各分类及其之间的关系;
4)处理查询功能;
5)如何处理编辑和删除的功能;

而这五步中最为困难的就是第五个步骤,因为对分类的编辑和删除涉及到一至性的问题.

下面我就逐一描述 php 的程序控制:

1)创建分类上传

在介绍这个功能前,先介绍一下 explode( ) 这个函数,这是个字串处理函数,用来分解字串的,具体的用法,例:

分解”0:1:2:3:4″里的数字

$val=”0:1:2:3:4″;
$rid=explode(“:”,$val);

经过 explode( ) 函数处理,$val 内的所有数字都分解到 $rid 数组中了,要引用时只需打印:echo “$rid[0],$rid[1],$rid[2]…”; 就行了.explode( ) 函数在整个分类处理中起着非常重要的作用,好现在开始介绍无现分类的程序控制.

可以假设个总分类 0 ,所有的分类都是它的子孙分类,现在来建立第一个分类”系统”,来看看它在数据库的存储形式:

id | uid | type | rout_id | rout_char
1 | 0 | 系统 | 0:1 | 系统

接着又在下面分”Linux”:

id | uid | type | rout_id | rout_char
2 | 1 | Linux| 0:1:2 | 系统:Linux

以上就是数据库存储的形式,现在就来完成 php 的代码,这与论坛的代码很相似,我们所要做的就是将分类的 id 放入 uid,而父分类的 uid 就放 0,下面来看看代码:

<?
…..
…..

//设置默认页
if (empty($func)) $func==”showtype”;

//设置父分类的 uid
if (empty($uid)) $uid=0;

//数据库存储************************************************
if ($func==”save”):

$fields = “”;
$values = “”;

if ($id!=””) {
$fields .= “,id”;
$values.=”,$id”;
}

if ($uid!=””) {
$fields .= “,uid”;
$values.=”,$uid”;
}

if ($type!=””) {
$fields .= “,type”;
$values.=”,”$type””;
}

if ($route_id==””) {

//取得父分类的 route_id
if ($uid!=0) {
$result = mysqlquery(“select * from type where id=$uid”);
$route_id=mysql_result($result,0,”route_id”);
} else {
$routr_id=”0″;
}
$fields .= “,route_id”;
//形成自己的 route_id
$route_id=”$route_id:$id”;
$values.=”,”$route_id””;
}

//形成自己的 route_char
if ($route_char!=””) {
$fields .= “,route_char”;
$route_char=”$route_char:$type”;
$values.=”,”$route_char””;
} else {
$fields .= “,route_char”;
$route_char=$type;
$values.=”,”$route_char””;
}

$fields = substr($fields,1,strlen($fields)-1);
$values = substr($values,1,strlen($values)-1);

$result = mysqlquery(“insert into type ($fields) values ($values)”);

endif; /* end save */

//分类上传************************************************
if ($func==”createtype”):

//取得自己的 id
$result = mysqlquery(“select * from type order by
id desc”);
$num=mysql_numrows($result);
if (!empty($num)) {
$cat = mysql_result($result,0,”id”);
} else {
$cat=0;
}

//判断分类的状态
if ($uid != 0) {
$result=mysql_query(“select * from type where id=$uid”);
$type=mysql_result($result,0,”type”);
$route_char=mysql_result($result,0,”route_char”);
} else {
$type=”父分类”;
}
echo “<FORM ACTION=”$PHP_SELF?func=save” METHOD=POST>”;

echo “<table>”;
echo “<tr><td>所属类别:$type</td></tr>”;
echo “<tr><td>创建分类:<input type=text name=”type” SIZE=10 MAXLENGTH=100></td></tr>”;

echo “<tr><td>”;
$cat=$cat+1;
echo “<input type=hidden name=id value=”$cat”>”;
echo “<input type=hidden name=uid value=”$uid”>”;
echo “<input type=hidden name=route_char value=”$route_char”>”;
echo “<INPUT TYPE=submit NAME=”Save” VALUE=”保存”></td></tr>”;

echo “</table>”;
echo “</form>”;
endif; /* end createtype */

//显示分类************************************************
if ($func==”showtype”):

echo “<table>”;

//判断分类的状态
if ($uid!=0) {
$result=mysql_query(“select * from type where id=$uid”);
$type=mysql_result($result,0,”type”);
} else {
$type=”父分类”;
}

echo “<tr><td><a href=”$php_self?func=createtype&uid=$uid”>创建分类</a></td></tr>”;

echo “<tr><td>$type</td></tr>”;

$result=mysql_query(“select * from type where uid=$uid”);
$num=mysql_numrows($result);

if (!empty($num)) {
for ($i=0;$i<$num;$i++) {

$id=mysql_result($result,$i,”id”);
$type=mysql_result($result,$i,”type”);

echo “<tr><td>”;
echo “<a href=”$php_self?func=showtype&uid=$id”>$type</a>”;
echo “</td></tr>”;
}
}

echo “</table>”;
endif; /* end showtype */
…..
…..

?>

以上的程序便完成了无限分类的基本创建,存储和显示,接着就是完善分类创建功能的各个部分了.
4.路径跟踪
————————————————————
前面已经介绍过了分类的创建实现方法,在分类表里记载了 rout_id 和 rout_char 这两个存储分类路径的信息,在不做任何处理的情况下,程序只能够顺序下到最底层的分类而无法倒退(当然可利用浏览器的 back 键倒退,但这对程序来说是不完整的),因此必须将 rout_id 和 rout_char 的信息分解出来完成实在的路径指示.

具体的做法,假如数据库记载了这么一条分类信息:

id:4
uid:2
type:开发工具
rout_id:0:1:2:4
rout_char:系统:linux:开发工具

当程序走到分类’开发工具’上时,除了要求显示路径信息外还要求能够去到路径上的任一分类中,该怎么做能?这里就需要用到 explode() 函数了.因为 rout_id 和 rout_char 是对应关系的,所以可将它们分解:

$path=explode(“:”,$rout_id);
$path_gb=explode(“:”,$rout_char);

这时所有分类信息都被分解了,现在要做的就是以链接的方式还原路径信息:
[php]
for ($i=0;;$i++) {
$a=$i+1;
echo “<a
href=$php_self?func=showtype&uid=”,$path[$a],”>”,$path_gb[$i],”</a>:”;
if (empty($path_gb[$i])) {
break;
}
}
[/php]
上面这段代码就实现了加链接还原路径的功能,因为实现的是无限分类,因此是没有上限的,所以在 for($i=0;;$i++) 里没有范围限制,而设置循环退出的条件是 $path_gb[$i] 中的值为空,将这段代码插入类别显示版面的程序块内就行了:
[php]
<?
…..
…..
//显示分类************************************************
if ($func==’showtype’):

echo “<table>”;

//判断分类的状态
if ($uid!=0) {
$result=mysql_query(“select * from type where id=$uid”);
$type=mysql_result($result,0,”type”);

//******** 新加入的代码 ***************
$rout_id=mysql_result($result,0,”rout_id”);
$rout_char=mysql_result($result,0,”rout_char”);
$path=explode(“:”,$rout_id);
$path_gb=explode(“:”,$rout_char);
echo “<tr><td>”;
for ($i=0;;$i++) {
$a=$i+1;
echo “<a
href=$php_self?func=showtype&uid=”,$path[$a],”>”,$path_gb[$i],”</a>:”;
if (empty($path_gb[$i])) {
break;
}
}
echo “</td></tr>”;
//******** end ***********************

} else {
$type=’父分类’;
}

echo “<tr><td><a href=’$php_self?func=createtype&uid=$uid’>创建分类</a></td></tr>”;

echo “<tr><td>$type</td></tr>”;

$result=mysql_query(“select * from type where uid=$uid”);
$num=mysql_numrows($result);

if (!empty($num)) {
for ($i=0;$i<$num;$i++) {

$id=mysql_result($result,$i,”id”);
$type=mysql_result($result,$i,”type”);

echo “<tr><td>”;
echo “<a href=’$php_self?func=showtype&uid=$id’>$type</a>”;
echo “</td></tr>”;
}
}

echo “</table>”;
endif; /* end showtype */
…..
…..
?>
[/php]
完成这个功能块后,就可继续分类信息的显示实现了…

来自:http://www.phpchina.com/bbs/viewthread.php?tid=7937&extra=page%3D1%26amp%3Bfilter%3Ddigest

分类: Website 标签: , ,