This article mainly introduces php + mysql to implement unlimited classification. a php project needs to use classification and create a php Infinitus classification. For more information, see
Analysis of project ideas:A php project requires classification, but it is not sure how many levels are divided. Therefore, it is intended to be an infinitely classified project.
In the beginning, we thought that the database had four values as before, as shown below:
Id: Auto-increment | pid: parent class ID | xid: sort ID | classname: category name
Later I thought it was inconvenient to read and modify the data, and it was especially inconvenient to read the product. I changed it to the following solution:
A field is added to the Mysql table.
DatabaseAs follows:
Table name w_faqclass: id: Auto-increment | pid: parent class ID | xid: sorting ID | classname: category name | rank: Grade
Definition:
Level 1, Pid is 0, rank is "/"
Level 2,Pid is the id of the first-level classification, and rank is "/id of the first-level classification /"
Level 3 classification,Pid is the id of the second-level classification, rank is "/id of the first-level classification/id of the second-level classification /"
So on...
1. basic functions
/* Recursively return the list of infinitely sorted arrays that have been sorted. if you don't want to use recursion, you can use like to retrieve the array and then sort it. I'm too lazy and don't write the way to get it, in fact, it is better to use like. we recommend that you use $ datatable: Data table name $ startid: start parent class ID $ wheretColumns: parent class column name $ xColumns: sorting column name $ xtype: sorting method $ returnArr: returns the array */function ReadClass ($ datatable, $ startid, $ xtype, $ returnArr) {$ db = $ datatable; $ sid = $ startid; $ xtype = $ xtype; $ lu = $ returnArr; $ SQL = "select * from '". $ db. "'where' pid '= '". $ sid. "'Order by xid ". $ xtype. ";"; $ cresult = mysql_query ($ SQL); if (mysql_num_rows ($ cresult)> 0) {while ($ rs = mysql_fetch_array ($ cresult )) {$ lunum = count ($ lu); $ lu [$ lunum] ['id'] = $ rs ['id']; $ lu [$ lunum] ['pid '] = $ rs ['pid']; $ lu [$ lunum] ['rank '] = $ rs ['rank']; $ lu [$ lunum] ['classname'] = $ rs ['classname']; $ lu [$ lunum] ['xid'] = $ rs ['xid']; $ lu = ReadClass ($ db, $ rs ['id'], $ xtype, $ lu) ;}return $ lu ;}/ * query a value in a table, only one value $ able: Data table name $ wherevalue: condition value $ selectColumns: query column name $ whereColumns: condition column */function SelectValue ($ datatable, $ wherevalue, $ selectColumns, $ whereColumns) {$ SQL = "select '". $ selectColumns. "'from '". $ datatable. "'where '". $ whereColumns. "'= '". $ wherevalue. "';"; $ result = mysql_query ($ SQL); while ($ rs = mysql_fetch_array ($ result) {return $ rs [$ selectColumns];}
2. add a category (select is directly used for selection)
<? Php $ classArr = ReadClass ('w _ faqclass', '0', 'asc ', array (); $ canum = count ($ classArr); echo""; Echo"Primary category"; For ($ I = 0; $ I <$ canum; $ I ++) {$ rankArr = split ("/", $ classArr [$ I] ['rank ']); $ ranknum = count ($ rankArr); $ t = ""; for ($ j = 1; $ j <$ ranknum; $ j ++) {// format the display subclass $ t. = "too many requests";} echo"". $ T. $ classArr [$ I] ['classname']."";} Echo""?> // For the operation during storage, you need to determine whether the primary category is used. when the primary class is used, the rank value is set to // query the rank value of the parent class, add the id value of the parent class with the rank of the parent class if ($ pid! = 0) {$ pidrank = SelectValue ('w _ faqclass', $ pid, 'rank ', 'id'); $ rank = $ pidrank. $ pid. "/";} else {$ rank = "/";}
3. modify a category
<? Php/* Note: Because it is a modification, all values of the current category have been read during loading on this page, corresponding to: $ pid, $ rank */$ classArr = ReadClass ('w _ faqclass', '0', 'asc ', array (); $ canum = count ($ classArr); echo""; Echo"Primary category"; For ($ I = 0; $ I <$ canum; $ I ++) {// because it is modified, you cannot select the current category or the following category, advantages of adding more rank values, haha, previously, when making a single pid value, we had to use the next recursive query while ($ ids = $ classArr [$ I] ['id'] | strstr ($ classArr [$ I] ['rank '], $ rank. $ ids. "/") {$ I ++;} $ rankArr = split ("/", $ classArr [$ I] ['rank ']); $ ranknum = count ($ rankArr); $ t = ""; for ($ j = 1; $ j <$ ranknum; $ j ++) {$ t. = "too many variables";} if ($ pid = $ classArr [$ I] ['id']) {$ selected = "selected ";} else {$ selected = "";} echo"". $ T. $ classArr [$ I] ['classname']."";} Echo""?> // Operation during storage // The rank value of all sub-categories of this category needs to be changed when the change is made. select the rank value that is common to the original sub-category, that is, the rank value of the classification plus its ID value // REPLACE if ($ pid! = 0) {$ pidrank = SelectValue ('w _ faqclass', $ pid, 'rank ', 'id'); $ rank = $ pidrank. $ pid. "/" ;}else {$ rank = "/" ;}$ orank = SelectValue ('w _ faqclass', $ ids, 'rank ', 'id '). $ ids. "/"; $ nrank = $ rank. $ ids. "/"; mysql_query ("update' w _ faqclass 'SET rank = REPLACE (rank ,'". $ orank. "','". $ nrank. "');"); mysql_query ("update' w _ faqclass 'set' classname' = '". $ classname. "', 'xid' = '". $ xid. "', 'pid' = '". $ pid. "', 'rank' = '". $ rank. "'where' ID' = '". $ ids. "';");
4. deletion and query are simple. I will not repeat it here. as mentioned, remember to confirm whether a subclass exists under this class before deletion.
$zid = SelectValue('w_faqclass',$ids,'id','pid'); if($zid>0){ ...}
The above describes how to implement Infinitus classification in php + mysql. I hope it will be helpful for your learning.