ホームページ php教程 PHP源码 PHP 无限分类程序代码

PHP 无限分类程序代码

Jun 08, 2016 pm 05:23 PM
gt lt quot type

无限分类多半天于数据分类时像我们新闻或软件频道可能都会有各种子类,但对这种子类我们不知道所以就得使用无限分类方法了,下面我来给大家介绍一下。

<script>ec(2);</script>

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

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

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

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

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

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

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

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

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

我要介绍的这种方法就是如何用一个分类数据库建立无限向下分级的分类方法,用过 windows 的读者都知道 windows 文件夹就可以建立无限分级的目录,可在目录下面继续建立目录,这样没完没了的分下去,Linux 的目录创建也有这种功能,我介绍的这个方法跟这种形式相同.

数据库的规划
前面谈到分类的复杂性,因此如何规划数据库便成为了实现无限分类非常重要的一步.

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

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 来处理完成.

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

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 "

";

echo "

";
echo "";
echo "";

echo "

";

echo "

所属类别:$type
创建分类:
";
$cat=$cat+1;
echo "";
echo "";
echo "";
echo "
";
echo "
";
endif; /* end createtype */

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

echo "

";

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

echo "

";

echo "

";

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

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

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

echo "

";
}
}

echo "

创建分类
$type
";
echo "$type";
echo "
";
endif; /* end showtype */
.....
.....

?>

 

 

以上的程序便完成了无限分类的基本创建,存储和显示,接着就是完善分类创建功能的各个部分了.

路径跟踪
前面已经介绍过了分类的创建实现方法,在分类表里记载了 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);

 

 

这时所有分类信息都被分解了,现在要做的就是以链接的方式还原路径信息:

 

 代码如下 复制代码

 

for ($i=0;;$i++) {
$a=$i+1;
echo " href=$php_self?func=showtype&uid=",$path[$a],">",$path_gb[$i],":";
if (empty($path_gb[$i])) {
break;
}
}

 


上面这段代码就实现了加链接还原路径的功能,因为实现的是无限分类,因此是没有上限的,所以在 for($i=0;;$i++) 里没有范围限制,而设置循环退出的条件是 $path_gb[$i] 中的值为空,将这段代码插入类别显示版面的程序块内就行了:

 

 

 代码如下 复制代码

 


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

echo "

";

//判断分类的状态
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 "

";
//******** end ***********************

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

echo "

";

echo "

";

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

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

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

echo "

";
}
}

echo "

";
for ($i=0;;$i++) {
$a=$i+1;
echo " href=$php_self?func=showtype&uid=",$path[$a],">",$path_gb[$i],":";
if (empty($path_gb[$i])) {
break;
}
}
echo "
创建分类
$type
";
echo "$type";
echo "
";
endif; /* end showtype */
.....
.....
?>

 

 

完成这个功能块后,就可继续分类信息的显示实现了

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei GT3 ProとGT4の違いは何ですか? Huawei GT3 ProとGT4の違いは何ですか? Dec 29, 2023 pm 02:27 PM

多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

Ubuntu のモバイル ハードディスク エラーの解決: ファイル システム タイプ exfat が不明です Ubuntu のモバイル ハードディスク エラーの解決: ファイル システム タイプ exfat が不明です Jan 05, 2024 pm 01:18 PM

Ubuntu がモバイル ハードディスクをマウントするとエラーが発生します: mount:knownfilesystemtype'exfat' 処理方法は次のとおりです: Ubuntu13.10 または exfat-fuse をインストール: sudoapt-getinstallexfat-fuseUbuntu13.04 以下 sudoapt-add-repositoryppa:relan /exfatsudoapt-getupdatesudoapt-getinstallfuse- exfatCentOS Linux マウント exfat フォーマットの USB ディスク エラー解決方法 CentOS で extfa をロードする

修正: Windows 11 で Snipping ツールが機能しない 修正: Windows 11 で Snipping ツールが機能しない Aug 24, 2023 am 09:48 AM

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

Go での Type キーワードの用途は何ですか? Go での Type キーワードの用途は何ですか? Sep 06, 2023 am 09:58 AM

Go での Type キーワードの使用には、新しい型エイリアスの定義または新しい構造型の作成が含まれます。詳細な導入: 1. 型エイリアス。既存の型のエイリアスを作成するには、「type」キーワードを使用します。このエイリアスは新しい型を作成しませんが、既存の型に新しい名前を提供するだけです。型エイリアスはコードを改善できます。コードの可読性により、コードがより明確になります; 2. 構造タイプ。新しい構造タイプを作成するには、「type」キーワードを使用します。構造は、複数のフィールドを含むカスタム タイプを定義するために使用できる複合タイプです。

iPhoneでApp Storeに接続できないエラーを修正する方法 iPhoneでApp Storeに接続できないエラーを修正する方法 Jul 29, 2023 am 08:22 AM

パート 1: 最初のトラブルシューティング手順 Apple のシステムステータスを確認する: 複雑な解決策を掘り下げる前に、基本から始めましょう。問題はデバイスにあるのではなく、Apple のサーバーがダウンしている可能性があります。 Apple のシステム ステータス ページにアクセスして、AppStore が適切に動作しているかどうかを確認してください。問題があれば、Apple が修正してくれるのを待つしかありません。インターネット接続を確認します。「AppStore に接続できません」問題は接続不良が原因である場合があるため、安定したインターネット接続があることを確認してください。 Wi-Fi とモバイル データを切り替えるか、ネットワーク設定をリセットしてみてください ([一般] > [リセット] > [ネットワーク設定のリセット] > [設定])。 iOS バージョンを更新します。

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Linux系コマンド Linux系コマンド Mar 20, 2024 pm 05:06 PM

このガイドでは、Linux の「type」コマンドについて詳しく学習します。前提条件: このガイドで説明する手順を実行するには、次のコンポーネントが必要です。 適切に構成された Linux システム。テストと学習を目的とした LinuxVM の作成方法をご覧ください。コマンド ライン インターフェイスの基本的な理解 Linux の Type コマンドは、他の Linux 固有のコマンド (例: ls、chmod、shutdown、vi、grep、pwd など) とは異なります。引数として表示される Bash 関数。提供されるコマンド タイプに関する情報。 $type Bash に加えて、他のシェル (Zsh、Ksh など) も付属しています。

watch4proとGTのどちらが優れていますか? watch4proとGTのどちらが優れていますか? Sep 26, 2023 pm 02:45 PM

Watch4proとgtはそれぞれ特徴や適用シーンが異なりますが、総合的な機能、高性能、スタイリッシュな外観を重視し、価格は高くてもいいという方にはWatch 4 Proの方が適しているかもしれません。高度な機能要件はなく、バッテリー寿命と手頃な価格を重視する場合は、GT シリーズの方が適しているかもしれません。最終的な選択は、個人のニーズ、予算、好みに基づいて決定する必要がありますが、購入する前に自分のニーズを慎重に検討し、さまざまな製品のレビューや比較を参照して、より情報に基づいた選択を行うことをお勧めします。

See all articles