ホームページ  >  記事  >  php教程  >  PHP アドバンスト: 無制限の分類を実現

PHP アドバンスト: 無制限の分類を実現

黄舟
黄舟オリジナル
2016-12-14 11:38:491265ブラウズ
  1. 分析

    PHP を使用して Web サイトを作成する場合、分類は非常に重要です。この 2 番目の分類は、現在、ほとんどの Web サイトが 3 番目のカテゴリにのみ分類されています。
    第一分類(親分類)→第二分類(子分類)→第三分類(孫分類)

    このような関連する分類が増えれば増えるほど、プログラムやデータベースの制御が複雑で困難になる 分類処理システム、ニュース、その他の分類など、このレベルでの分類を記録するのに必要なデータベースは 1 つだけであるため、同じレベルでの制御は非常に簡単です。ただし、Web サイトの場合は 1 つのレベルです。分類だけでは十分ではありません。次のように再度分類する必要があります:

    システム -> Linux、Windows
    ニュース -> Linux ニュース、Windows ニュース

    このようにすれば、少なくとも人々に分類が明確になります。システムには Linux と Windows が含まれ、ニュースには Linux ニュースと Windows ニュースが含まれることを理解してください。情報をより明確にするために、

    linux-->システム ツール、カーネル、プログラミング言語、開発ツール
    を分類し続けます。 ...

    分類が第3レベルになると、情報資料の処理がより明確になります。つまり、情報を明確に処理するには、分類が詳細であるほど便利になります。情報を処理し、明確な目的を持ってネチズンが見つけやすくする必要がありますが、分類が洗練され続けるにつれて、プログラムとデータベースを制御することがますます困難になります

    問題 1: 対処方法
    難しさ 2: PHP を使用してこの明確な関係を完成させるにはどうすればよいでしょうか?
    この種のマルチレベルで詳細な分類は、すべての PHP プログラマーが解決しなければならない問題です。良質で優れたウェブサイトは必然であり、この問題を解決するのは非常に複雑であり、最大の問題はデータベースの分類処理です。データベースを適切に処理しないと、膨大な作業負荷が発生し、再計画する必要さえあります。データベース...

    これは誇張ではなく、多くの人がそうであるため... データベース処理では、第 1 レベルの分類方法を使用してデータベースを構築します。私も当時、分類を処理するためにこの方法を採用しました。ほとんどの Web サイトは第 3 レベルに分類されるため、データベース内に処理用の分類データベースは 3 つだけあります。しかし、下位の分類を続ける必要がある場合、このアプローチの欠点が明らかになります。

    私が紹介したい方法は、分類データベースを使用する方法です。Windows を使用したことのある読者は、Windows フォルダーを使用して無限に階層化されたディレクトリを作成できることを知っています。 Linux のディレクトリ作成にもこのような機能があり、今回紹介した方法はこの形式と同じです。
    2. データベース計画
    ------------------------ ---------------------------- -------------
    分類の複雑さについては以前お話しましたが、無制限の分類を実現するにはデータベースをどのように計画するかが非常に重要になります

    のデータベース計画について紹介したことがあります。はい、フォーラムは無制限のフォローアップを実現できます。分類にはこの種の親子関係も含まれるため、この親子関係を確立するにはいくつかの困難があります。関係

    1) 各カテゴリの情報ストレージを処理する方法
    2) カテゴリの親関係を処理する方法

    データベース処理は次のようになります。ここでは、カテゴリを処理するために型データベースが構築されます:

    フィールドの作成:
    id(int): 各カテゴリの自然なシリアル番号を記録するために使用されます
    uid(int): を記録するために使用されます。カテゴリの親カテゴリの ID 番号
    type(char): カテゴリの名前
    roue_id(varchar): 0:2:10:20: の ID と接続するアフィニティ ツリー: 親子関係を示す
    roue_char(varchar): アフィニティ ツリー、次のようなもの: system: linux: 開発ツール: gcc: (このフィールドが存在するかどうかは関係ありません。関係をよりわかりやすく理解するために、もちろん文字表現はより直接的です数値表現よりも^o^ですが、このフィールドを追加するのが最善です)

    このような無制限のカテゴリテーブルを確立します。次に、テーブルを処理してクエリするのに最も便利なデータベースを構築する必要があります。これは情報を保存するテーブルです type_message:

    id(int): メッセージのシリアル番号;
    title(varchar): メッセージのタイトル;メッセージの内容;
    time: メッセージが作成された時刻;

    これら 2 つのデータ テーブルは無制限の分類タスクを完了できます (2 つのテーブルの補助フィールドは追加されていません。

    残りのすべてのタスク)。

    3. プログラム制御
    ---------------------------------- ---------- --

    これは、無制限の分類を実現する機能の中で最も複雑で困難なステップです。まず、ステップを見てみましょう。プログラム内で完了する必要があります:

    1) カテゴリのアップロードを作成します。
    3) 各カテゴリとそれらの関係を明確に表示します。
    4) クエリ関数を処理します。5) 編集と削除の関数を処理する方法

    カテゴリの編集と削除には 1 次元の問題が含まれるため、5 番目のステップが最も困難です

    以下で PHP プログラムを 1 つずつ説明します。 :

    1) カテゴリのアップロードを作成します

    この関数を紹介する前に、explode() 関数を紹介します。これは、文字列を分解するために使用される、具体的な使用法です。例:

    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 であり、すべての分類はその子孫であると仮定します。最初の分類「システム」を確立し、データベース内のその格納形式を確認します。 Linux':

    id | type | rout_char
    2 | Linux

    これで、データベース ストレージの形式を完成させましょう。フォーラムに関連する コードは非常に似ています。uid にカテゴリの ID を入力するだけで、親カテゴリの uid は 0 です。コードを見てみましょう:

    ....

    //デフォルトのページを設定します
    if (empty($func)) $func=='showtype';

    //親カテゴリの uid を設定します
    if (empty( $uid)) $uid=0;

    / /データベースストレージ********************************** ***************** *
    if ($func=='save'):

    $fields = "";

    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'"; Route_char=$type;
    $values.=",'$route_char'"
    }
    $fields = substr($fields,1,strlen($fields)-1);値,1,strlen($values)-1);

    $result = mysqlquery("タイプ ($fields) 値に挿入"); /* 保存を終了 * /


    //カテゴリーアップロード****************************************** *********
    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");
    $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 "< td>カテゴリの作成:< ;/tr>";

    echo ""; 

    echo "
    Category:$ type
    ";
    $cat=$cat+1;
    echo "" ; ";
    echo ""; 
    echo "
    "; 
    echo "
    "; 
    終わり; /* 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 "
    "; 
    終わり; /* ショータイプの終了 */
    ....
    ....

    ?> 

    以上の手順便は、無制限の分別クラスの基本的な構築、保存、および表示を完了し、次に完了です善分クラス構築機能の各部分を完了します。

    4. 経路追跡
    -------------- ----------------------------------------
    冒頭已经介绍分別の構築方法を経て、分別テーブルに rout_id と rout_char の両方が保存されている分別経路の情報が書き込まれており、何も処理しない限り、プログラムは次の順序で最下層の分別まで進むことができます (当然のことながら)ブラウザのバック アクセスを使用することもできますが、このプログラムは完全ではないため、経路指示を実現するには、rout_id と rout_char の情報分解を完了する必要があります。 

    特定の実行法、假如データ台库记ダウンロード了この么一条分类情報:

    id:4
    uid:2
    type:开公開ツール
    rout_id:0:1:2:4
    rout_char:系统:linux:开公開ツール

    プログラムが分別クラス「公開ツール」に到達したとき、経路情報の表示要求に加えて、経路上の任意の分クラスに移動できることも要求されますが、ここでは、explode() 関数を使用する必要があります。 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 "";
    //******** 終了 ***********************

    } 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 "
    "; 
    終わり; /* ショータイプの終了*/
    ....
    ....
    ?> この関数ブロックを完了すると、次のことができます。引き続き機密情報を表示します...関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) にご注意ください。

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