Įžanga Kagi šiuo straipsniuku norėčiau supažindinti su idėjom keliom. Kuriant pavyzdžiui nuorodų katalogą, taip pat kaip geriau realizuoti paieškas, trynimą, atnaujinimą duombazėje. Manau šis straipsniukas padės suprasti keletą gudrybių PHP, MYSQL panaudojimo pradedantiems, galbūt ir daugiau pažengusiems. Duomenų bazė Kaip manau įsivaizduojate, nuorodų katalogas turi kategorijas, kiekviena kategorija gali turėti begalę subkategorijų. Na o kiekviena subkategorija gali turėti bagalę nuorodų. Bandom įsivaizudoti kaip galėtų atroyti šios lentelės. Lentelė "Kategorijos" CREATE TABLE `l_cat` ( `id` int(11) NOT NULL auto_increment, `parent` int(11) NOT NULL default '0', `name` varchar(255) NOT NULL default '', `kelias` text NOT NULL, PRIMARY KEY (`id`) ) TYPE=MyISAM Manau čia viskas turėtų būti aišku. O tiem kuriems tai nauja paaiškinsiu. id tai kategorijos numeris, parent - kuriai kategorijai prikaluso, jei kategorija yra pačiam viršuje tai reikšmė bus 0, name - kategorijos pavadinimas, kelias - šis stulpelis turbūt keisčiausias. Jame bus nurodyta visas kelias iki jos pačios. Kam to reikia? Dėl patogumo, greitumo ir pan. Pvz jūs norite kažkurią kategoriją per savo susikurtą valdymo sistemą perkelti į visiškai kitą, atrodytų užtenka tik pakeisti jos parent reikšmę. Taip teisingai. Bet įsivaizduokit jūs norite ištrinti kokią pagrindinę subkategoriją, kurioje dar yra galybę subkategorijų bei nuorodų. Kaip daryti .. čia ir prasideda linksumas. Logiškai mastant reikės paimti kiekvieną kategoriją ir žiūrint parentus eiti aukštyn kol sužinosim ar priklauso ji ar ne, tas pats su nuorodom. O pasinaudojus keliu tereikės nurodyti reikšmę ir padaryti užklausą pagal ją. Kitas pavyzdys, jei reikia suskaičiuoti nuorodų skaičių kategorijoje kurioje. Irgi palengvins darbas. Realiai ten eis serializntas masyvas. serialize($array), kuris paverčia masyvą string formatu, gaunasi kažkas panašaus į a:3:{i:0;s:4:"id0a";i:1;s:4:"id2a";i:2;s:5:"id11a";} masyvo elementai yra id0a ir id2a bei id11a. Jei išifruosim šį kelią suprasim kad kategorijos Id =11, ji yra 2 (id) subkategorija, na o antra yra viena iš pagrindinių kategorijų. Dadėtas prie kiekvieno kazkokie savo sumastyti simboliai tam kad atliekant užklausą nesusimaiytų tarkim ieškan 11 su 111 butų tarkim kelias LIKE '%id11a%'. Lentelė "Nuorodos" CREATE TABLE `l_links` ( `id` int(11) NOT NULL auto_increment, `parent` int(11) NOT NULL default '0', `name` varchar(255) NOT NULL default '', `linkas` varchar(255) NOT NULL default '', PRIMARY KEY (`id`) ) TYPE=MyISAM Na čia tik vienas pasakymas parent yra kategorijos id kuriai nuoroda .priklauso Susitarimas (iš mano pusės) Pradžiai PHP funkcijos kurias naaudosiu darbui su MYSQL <? function connect() { // prisijungimas prie db global $db_host, $db_user, $db_pasw, $db_name,$link; $link = mysql_connect("$db_host", "$db_user", "$db_pasw") or die ("Negaliu prisijungti"); mysql_select_db ("$db_name") or die ("Negaliu prisijungti prie lenteles"); } function disconnect() { // atsijungimas nuo db global $link; mysql_close($link); } function SQLQuery($query) { // grazina masyva array('0'=> array('mysql eilute'),'1'=>... $rez = mysql_query ($query) or print("<li> Query Failed: </li>\n" . "<li> errorno = " . mysql_errno() . "</li>\n" . "<li> error = " . mysql_error() . "</li>\n" . "<li> query = " . $query . "</li>\n"); while ($line = mysql_fetch_assoc($rez)) $ats[]=$line; return $ats; } function SQLQueryd($query) { // grazina vieną eilutę $rez = mysql_query ($query) or print("<li> Query Failed: </li>\n" . "<li> errorno = " . mysql_errno() . "</li>\n" . "<li> error = " . mysql_error() . "</li>\n" . "<li> query = " . $query . "</li>\n"); return mysql_fetch_assoc($rez); } function SQL($query) { // INSERT, UPDATE, DELETE funkcijom $rez = mysql_query ($query) or print("<li> Query Failed: </li>\n" . "<li> errorno = " . mysql_errno() . "</li>\n" . "<li> error = " . mysql_error() . "</li>\n" . "<li> query = " . $query . "</li>\n"); return $rez; } ?> PROGRAMAVIMAS Nerašysiu čia viso pilno skripto, bus jums pasipraktikuoti ir pasidaryti. Tad pateiksiu tik keletą realizavimo fragmentų, nors čia jau didžioji dalis. <? function pathurl($dir) { /* atvaizduoja kelia, navigacijai TOP : Paslaugos : Dizaino darbai */ $kelias=""; $nr=$dir; while ($nr != 0) { $q = " SELECT * FROM l_cat where id=$nr "; $nuor=SQLQueryd($q); $kelias = "<a href=\"nuorodos.php?id=".$nuor['id']."\"> ".$nuor['name']."</a> : ".$vardas; $nr = $nuor['parent']; } $kelias="<a href='nuorodos.php'> TOP </a> : ".$kelias."<br>"; return $vardas; } function numberinks($id) { /* Suskaiciuoja kiek kategorijoje yra nuorodu (skaiciuojant ir subkategorijose */ $q="Select COUNT(*) as kiekis from l_links as l, l_cat as c where l.parent=c.id and c.kelias LIKE '%id".$id."a%'"; $kiekis=SQLQueryd($q); Return $kiekis['kiekis']; } ?> Na bandom rašyti skriptuką. Kuris pavaizduos mums nuorodu kataloga <? $db_host = "localhost"; // Mysql hostas $db_user = "useris"; // Mysql useris $db_pasw = "paswordas"; // Mysql paswordas $db_name = "manodb"; // Mysql duombaze connect(); // jei nenurodyta kategorija (pirma kart iejus) $id=(!isset($id)) ? 0 : $id; // Atspausdiname kelia echo pathurl($id); $q = "SELECT * FROM l_cat where parent=".$forma['id']." and confirm order by name asc"; $sar=SQLQuery($q); echo "<b>KATEGORIJŲ SĄRAŠAS</b><br>&nbsp;"; // atspausdiname 2 stuleliose kategorijas echo "<table width=100% cellpadding=2 cellspacing=0>"; $pr="1"; foreach($sar as $key=>$val) { if($pr=="1") { echo "<tr ><td align=left><a href='nuorodos.php?id=".$val[id]."'>".$val['name']."</a>&nbsp;[".numberinks($val['id'])."]<td>"; $pr++; } elseif ($pr=="2") { echo "<td align=left><a href='nuorodos.php?id=".$val[id]."'>".$val['name']."</a>&nbsp;[".numberinks($val['id'])."]<td></tr>"; $pr="1"; } } echo "</table>"; echo "<hr>"; // atspausdiname nuorodas po viena vienoje eiluteje $q = "SELECT * FROM l_links where parent=".$id." order by views desc, name asc"; $sar=SQLQuery($q); if(is_array($sar)) { print "<b>Nuorodos:</b><br><br>"; print "<table width=100% cellpadding=2 cellspacing=0>"; foreach($sar as $val) { echo "<tr><a href='".$val['linkas']."' target='_blank'>".$val['name']."</a><br>&nbsp;</tr>"; <? } echo "</table>"; } //turim jau viska disconnect(); ?> Taigi is vartotojo dalies jau viską turime. Vartotojas jau galės slankioti po kategorijas ir lankytis nuorodose.... Kagi kolkas kelio minimaliai prireikė tik suskaičiuoti nuorodas ADMIN DALIS pateikiu tik kas daroma po formos vygdymo. Surašau viską į vieną krūva, atskirdamas tik komentarais kokius veiksmus atlieka kodas. <? // -----------NAIKINAM KATEGORIJAS SU JU VIDUMI-------------------------------- /* istrinam kategorija $kategorija_id su visom subkategorijom bei nuorodom */ $linkai=SQLQuery("Select id from l_cat where kelias LIKE '%id".$kategorija_id."a%'"); foreach ($linkai as $val) { SQL("Delete from l_links where parent='".$val['id']."'"); } SQL("Delete from l_cat where kelias LIKE '%id".$kategorija_id."\a%'"); // -------------NAUJA KATEGORIJA------------------------------ /* ITERPIAM NAUJA KATEGORIJA $cat - Kategorijai kuriai priklauso nauja kategorija $vardas - priskiriamas kategorijos pavadinimas */ if ($cat==0) { $kelias=array("id0"); } else { $kelias_=SQLQueryd("Select kelias from l_cat where id='".$cat."'"); $kelias=unserialize($kelias_['kelias']); } // turim pradini kelia jau SQL("Insert into l_cat set name='".$vardas."', parent='".$cat."'"); $new_id=mysql_insert_id(); $kelias[]="id".$new_id."a"; $new_kelias=serialize($kelias); SQL("Update l_cat set kelias='".$new_kelias."' where id='".$new_id."'"); // ----------KATEGORIJOS ISAUGOJIMAS--------------------------------- // 1. SAVE // $name - naujas vardas // $kategorija_id - kurios kategorijos varda norite pakeisti // velniskai paprasta SQL("update l_cat set name='".$name."' where id='".$kategorija_id."'"); // ----------KATEGORIJOS PERKELIMAS--------------------------------- // 2.MOVE // daug idomesnis variantas kaip minejau // $katnew - i kuria norite kategoija permesti // $kategorija_id - jusu redaguojama kategorija //pirmiausia suzinome nauja busima kelia if ($catnew==0) { $kelias=array("id0a"); $atejois="0"; $pradzia = array("id0a"); // pradzia subkategorijom be tos kategorijos id } else { $kelias_ = SQLQueryd("Select parent, kelias from l_cat where id='".$catnew."'"); $kelias = unserialize($kelias_['kelias']); $pradzia = $kelias; // pradzia subkategorijom be tos kategorijos id $atejois = $forma['catnew']; } $kelias[]="id".$kategorija_id."a"; $newkelias=serialize($kelias); // pradedame keitimus //updatinam kategorija SQL("update l_cat set parent='".$catnew."', name='".$name."', kelias='".$newkelias."' where id='".$kategorija_id."'"); // na linksmiause dalis tai pakeisti likusias... $elementas=SQLQuery("Select id, kelias from l_cat where kelias like '%id".$kategorija_id."\a%' and id !='".$kategorija_id."' "); foreach ($elementas as $el) { $mas = $pradzia; $el_kelias=unserialize($el['kelias']); //reikia pakeisti subkategorijos kelia nauju $galima=false; // ar galima pradeti keitinejima? foreach ($el_kelias as $val) { if ($val=="id".$kategorija_id."a") $galima=true; // keitinejimas prasides tada kai suras $kategorija_id if ($galima) $mas[]=$val; } // na ir updatinam kelia subkategorijai SQL("Update l_cat set kelias='".serialize($mas)."' where id='".$el['id']."'"); } // updatinimas baigtas // ---------- NAUJAS LINKAS --------------------------------- // naujas linkas SQL("Insert into l_links set parent='".$cat."', name='".$vardas."', linkas='".$adresas."'"); ?> Manau atsirinkiste kas kur... ir galėsite pritaikyti savo reikmėms. na o pabaigai dar viena perliukas, kurio tikrai prireiks jei pagridausite darytis admin valdyma. Reikalinga <select> elemente pavaizduoti kategorijas. tokiu formatu / /Paslaugos /Paslaugos/Programavimas /Paslaugos/Dizainas ... /Resursai /Resursai/Grafika ... Tai palengvins darbą turint tokį selectą nereikės darytis tarkim atskiro vaikštinėjimo po kategorijas, kad papildyti nauju linku ar kategorija. <? function dir_i_option($ar=0) { $q = "SELECT * FROM l_cat order by name asc"; $links=SqlQuery($q); foreach($links as $val) { $a=c_path($val[id]); $sel.="<option t='".$a."' value='{$val[id]}'>".$a."</option>\n"; } $categories = explode("\n",$sel); asort($categories); $c= implode("\n",$categories); $pliusas=($ar)?'<option value=0>/</option>':""; $sel="<select name=cat style=\"width:100%\">".$pliusas.$c."</select>"; Return $sel; } function c_path($dir) { $vardas=""; $nr=$dir; while ($nr != 0) { $diras=SQLQueryd("Select * from l_cat where id='".$nr."'"); $vardas = $diras['name']."/".$vardas; $nr= $diras['parent']; } Return "/".$vardas; } ?> parašius funkciją dir_i_option(); gausime ši grazu selectą... Jei jums pavyko pasidaryti, galima papildyti daugiau galimybių pvz. Nuorodu apibudinimas Kategoriju apbudinimas plačiau Skaičiavimas nuorodų vaikčiojimo (linkas.php?id=$nuoroda_id) Populiariausios nuorodos ir Kategorijos (pagal lankomumą) Jei daugiau vartotojų prižiūri patvirtinta nepatvirtinta (matoma, nematoma), arba siūlote vartotojui kurti kategorijas, bei nuuorodas Galimybė prie kategorijos, nuorodos pridėti paveiksliuką, Paieška ir t.t Taigi tikiuosim kad čia mano darbelį jūs surasite sau kažko naudingo. SĖKMĖS
---
[^] Atgal
[«] Skaitykla

* * Gen. time: 0.1401
* © xneox.com