Oåterkallelig meny php. §2

I den här artikeln kommer jag att visa dig hur du skapar flernivåmeny i PHP och MySQL. Naturligtvis kan du komma med många alternativ för att skapa det, men att döma av antalet frågor om detta ämne behöver du ett exempel. Och jag kommer att presentera det i den här artikeln. Jag noterar direkt att den här artikeln bara är vettig för dem som vet PHP och kan arbeta med MySQL. Alla andra måste gå igenom den här först, eller läsa några böcker om PHP och MySQL.

Låt oss först skapa en tabell i databasen med följande fält:

  • id- unik identifierare.
  • titel- Ankarlänkar i menyn.
  • länk- den adress som menyalternativet leder till.
  • parent_id- förälders ID. Om det inte finns något överordnat objekt kommer det att vara NULL (eller så kan du sätta en annan 0).

Vi klurade ut tabellen, nu är det dags php-kod. Full PHP-kod ges nedan:

$mysqli = new mysqli("localhost", "root", "", "db"); // Anslut till databasen
$result_set = $mysqli->query("VÄLJ * FRÅN `menyn`"); // Gör ett urval av alla poster från tabellen med menyn
$items = array(); // Array för menyalternativ
while (($row = $result_set->fetch_assoc()) != false) $items[$row["id"]] = $row; // Fyll arrayen med ett urval från databasen
$barn = array(); // Array för att matcha underordnade element till deras förälder
foreach ($items som $item) (
if ($item["parent_id"]) $childrens[$item["id"]] = $item["parent_id"]; // Fyll i arrayen
}
function printItem($item, $items, $children) (
/* Visa menyalternativet */
eko"

  • ";
    echo "".$item["titel"]."";
    $ul = falskt; // Visades underordnade element?
    medan (sant)(
    /* Endless loop där vi söker efter alla underordnade element */
    $key = array_search($item["id"], $children); // Letar efter ett underordnat element
    om (!$nyckel) (
    /* Inga underordnade element hittades */
    om ($ul) eko ""; // Om underordnade element visades, stäng sedan listan
    ha sönder; // Lämna loopen
    }
    unset($children[$key]); // Ta bort det hittade elementet (så att det inte visas igen)
    om (!$ul) (
    eko"
      "; // Starta den inre listan om det inte fanns några barn ännu
      $ul = sant; // Sätt flaggan
      }
      echo printItem($items[$key], $items, $children); // Mata ut alla underordnade element rekursivt
      }
      eko"";
      }
      ?>

      Den här koden fungerar fullt ut, men du bör förstå att ingen skriver så här (särskilt utdata genom eko HTML-taggar). Och din uppgift är att ta algoritmen från den här koden, men inte själva koden. Och anslut sedan den här algoritmen till din motor. Jag har försökt att noggrant kommentera utdatakoden flernivåmeny i PHP och MySQL, men det är naturligtvis inte det mest transparenta och kräver ganska goda inledande kunskaper. Om du fortfarande inte vet PHP och MySQL, då rekommenderar jag starkt att gå igenom detta först

      Inte en enda sida är komplett utan navigering, eller som "sajtmenyn" också kallas. Så sajtmenyn kan vara en-nivå och multi-level i form av ett träd. Om det inte finns några särskilda svårigheter när det gäller implementering med en ennivåmeny, måste du tänka noga när du skapar en flernivåmeny.

      Det viktigaste i denna uppgift är att designa databasen för vår flernivåmeny. Låt oss skapa en kategoritabell med tre fält id, titel, förälder var:

      • ID- identifierare
      • Titel- Menynamn
      • förälder- Standardkategori förälder 0

      Fältet ansvarar för att förgrena menyn förälder om förälder = 0, då är den här kategorin den överordnade kategorin. För att lägga till barn i föräldrakategorin måste du ange i föräldrafältet IDönskad förälder. Till exempel:

      Tabeller med kategorier

      Som framgår av tabellen, överordnad kategori Bilar det finns två ättlingar Mazda och Honda relaterat efter fält förälder. Och kategorin Motorcyklar två avkommor är kawasaki och harley. Samtidigt har kategorin Båtar inga ättlingar. Jag hoppas att du förstår hur man länkar kategorier.

      Därefter går vi från ord till praktik. Låt oss skapa tabellen Kategorier.

      SKAPA TABELL OM INTE FINNS `kategorier` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) unsigned NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- Dumpa `kategorier` tabelldata -- INFOGA INTO `kategorier` (`id`, `titel`, `förälder`) VÄRDEN (1, "Bilar", 0), (2, "Motorcyklar", 0) , (3, Mazda, 1), (4, Honda, 1), (5, Kawasaki, 2), (6, Harley, 2), (7, Mazda 3, 3 ), (8, "Mazda 6", 3), (9, "Sedan", 7), (10, "Hatchback", 7), (11, "Boats", 0), (12, "Liftback", 8), (13, "Crossover", 8), (14, "Vit", 13), (15, "Röd", 13), (16, "Svart", 13), (17, "Grön", 13), (18, Mazda CX, 3 ), (19, Mazda MX, 3);

      Algoritmen för arbete består av följande:

      Skapar en databasanslutning

      query("SET NAMES "utf8""); /* * Detta är det "officiella" objektorienterade sättet att göra detta * dock fungerade $connect_error inte förrän PHP 5.2.9 och 5.3.0. */ if ($mysqli->connect_error) ( die("Anslutning misslyckades (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Om du vill vara säker på kompatibilitet med versioner före 5.2 .9, * bättre kod som denna */ if (mysqli_connect_error()) ( die("Anslutning misslyckades (". mysqli_connect_errno() . ") ". mysqli_connect_error()); )

      Att skriva en funktion för att hämta data från tabellen Kategorier

      //Hämta vår meny array från databasen som en array funktion getCat($mysqli)( $sql = "SELECT * FROM `kategorier`"; $res = $mysqli->query($sql); //Skapa en array där arraynyckeln är meny-ID $cat = array(); while($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; )

      Vi får en sådan array, där arraynyckeln är kategori-ID.

      Array Tree Function av Tommy Lacroix

      //Funktionen för att bygga ett träd från en array från Tommy Lacroix funktionen getTree($dataset) ( $tree = array(); foreach ($dataset som $id => &$node) ( //Om det inte finns några bilagor om (!$node[" förälder"])( $tree[$id] = &$node; )else( //Om det finns barn, iterera genom arrayen $dataset[$node["förälder"]]["childs "][$id] = &$ nod; ) ) returnerar $tree; )

      Att få en array i form av ett träd

      Hela manuset

      query("SET NAMES "utf8""); /* * Detta är det "officiella" objektorienterade sättet att göra detta * dock fungerade $connect_error inte förrän PHP 5.2.9 och 5.3.0. */ if ($mysqli->connect_error) ( die("Anslutning misslyckades (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Om du vill vara säker på kompatibilitet med versioner före 5.2 .9, * är det bättre att använda den här koden */ if (mysqli_connect_error()) ( die("Anslutningsfel (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) //Hämta vår meny array från databasen som en arrayfunktion getCat($mysqli)( $sql = "SELECT * FRÅN `kategorier`"; $res = $mysqli->query($sql); //Skapa en array där arraynyckeln är meny-ID $cat = array(); while ($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; ) //Tommy Lacroix Array Tree Funktion getTree($dataset) ( $tree = array(); foreach ($dataset som $id => &$node) ( //Om det inte finns några bilagor if (!$node["förälder"])( $tree[ $id] = &$node; )else( //Om det finns barn, iterera sedan över arrayen $dataset[$node["parent"]]["childs"][$id] = &$node; ) ) return $tree; ) //Förbered dig th array med data $cat = getCat($mysqli); //Skapa en trädmeny $tree = getTree($cat); //Mall för att visa menyn i form av en trädfunktion tplMenu($category)( $menu = "
    • ".$category["titel"].""; if(isset($category["barn"]))( $menu .= "
        ".showCat($category["barn"]) ."
      "; ) $menu .= "
    • "; return $menu; ) /** * Läs vår mall rekursivt **/ function showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) returnera $string; ) //Hämta HTML-markering $cat_menu = showCat($tree); //Visa eko "
        ". $cat_menu ."
      "; ?>

      Resultatet av arbetet

      Flernivåmeny i PHP + MySQL för admin

      Om du vill använda denna meny i adminpanelen på din webbplats måste du skriva om ett par funktioner tplMenu(), showCat().

      ".$category["titel"].""; )else( $menu = " "; ) if(isset($kategori["barn"]))( $i = 1; for($j = 0; $j< $i; $j++){ $str .= "→"; } $i++; $menu .= showCat($category["childs"], $str); } return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str){ $string = ""; $str = $str; foreach($data as $item){ $string .= tplMenu($item, $str); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree, ""); //Выводим на экран echo ""; ?>

      Resultatet av arbetet

      Välj Bilar → Mazda →→ Mazda 3 →→→ Sedan →→→ Halvkombi →→ Mazda 6 →→→ Liftback →→→ Crossover →→→→ Vit →→→→ Röd →→→→ Svart →→→→ Grön →→ Mazda CX →→ Mazda MX → Honda Motorcyklar → Kawasaki → Harley Boats 23 april 2017

      I de tidigare lektionerna har vi analyserat med exempel vad arrayer är. I den här handledningen använder vi arrayer i praktiken för att skapa menyer på en webbplats.

      Varför är de bekvämare än vanliga HTML-taggar?

      Tja, låt oss säga att vår webbplats har 100 sidor, var och en med samma meny. Och plötsligt behövde vi ändra menyalternativen. Med enbart HTML kommer vi att behöva göra ändringar på 100 sidor på webbplatsen, vilket är mycket. Så PHP kommer till undsättning i sådana situationer. Det räcker med att ändra menyalternativen bara en gång i en fil.

      Och nu ska vi gå.

      På lokal värd i mappen " domäner skapa en mapp som heter " array- meny. lokal”.

      I den här mappen skapar vi fyra filer: index. php, handla om. php, Kontakt. php och meny. php.

      !!! Filsyntaxen ska varaPHP.

      I filen index.php skriver vi ett enkelt HTML-ramverk.




      charset="utf-8">



      Hem


      omfatta("menu.php");
      ?>

      Kopiera den här koden till filerna about.php och contact.php. Ändra bara rubrikerna på sidorna i taggen

      .

      Vi skriver koden för menyn.

      I fil menu.php skriva en associativ array.

      $meny = array (
      "index "=> "index.php",
      handla om => "about.php",
      "kontakter" => "contact.php"
      );
      ?>

      Nedan, med hjälp av HTML-taggar, skriver vi menyn.

      I webbläsaren kommer vi att se den vanliga menyn i form av en lista.

      Genom att klicka på valfritt menyalternativ kommer vi till motsvarande sida, medan menyn kommer att finnas på alla sidor.

      Låt oss nu komplicera uppgiften. Ta bort allt från filen menu.php och...

      Vi skriver en flerdimensionell array.




      charset="utf-8">
      <span>Använda en array för att visa menyn på webbplatsen.</span>


      $meny = array (
      array("länk" => "Hem", "href"=> "index.php"),
      array("länk" => "Om", "href"=> "about.php"),
      array("länk" => "Kontakter", "href"=> "contact.php")
      );
      ?>



      Och i sista steget...

      Rita menyn med en slinga för varje.

      Ta bort listan från menu.php-filen

        och skriv följande kod istället.

        eko"

          " ;
          för varje($menyn som$item )(
          eko "
        • ($item )
        • " ;
          }

          I webbläsaren kommer vi att se samma resultat.

          För att ändra menyalternativen, ändra dem bara i filen menu.php bara en gång.

          Det är vad vi nu ska analysera. Och så, uppgiften är att göra en vertikal meny i form av en rullgardinslista.

          Hur kan detta implementeras i PHP? Väldigt enkelt! Vi har till exempel en fil index.php, som, beroende på det valda avsnittet i rullgardinsmenyn, ska visa motsvarande innehåll på sidan. Detta implementeras enligt följande:

          1. Vi skapar filer i .html-format, som kommer att innehålla det innehåll som krävs för utdata.

          2. Vi skapar (skriver) de nödvändiga villkoren i scriptet index.php för att visa relevant information.

          3. Vi betraktar det skapade skriptet utifrån säkerheten för det skript som körs.

          Tja, det verkar, när jag avslutade med teorin, låt oss gå vidare till praktiken. Först skapar vi statiska sidor i .html-format, som kommer att innehålla nödvändig information. Du kan skriva vad ditt hjärta vill där :) Som ett resultat bör vi få minst två filer first.html respektive second.html , sedan kan de göras så många du vill, efter att ha förstått kodens grundläggande algoritm .

          För att visa en rullgardinslista i en fil index.php vi skapar ett html-formulär och nedan skriver vi ett PHP-skript med följande innehåll:



          Meny PHP


          Rullgardinsmeny i PHP












          if (isset ($_GET ["var" ]))
          {
          if ($_GET ["var" ]==1 )
          $file = "first.html" ;
          if ($_GET ["var" ]==2 )
          $fil = "second.html" ;
          include($file);
          }
          ?>


          Så rullgardinsmenyn är klar, och det som är mest intressant, det kommer att fungera normalt, men ur säkerhetssynpunkt är det sårbart.

          Sårbarheten för detta skript är att variabeln $fil förblir oinitierad, i vilket fall värdet på den automatiskt skapade variabeln går direkt till funktionen omfatta, och den i sin tur ansluter den (variabeln) framgångsrikt och visar den på skärmen. Och det kan vara mer än bara .htaccess-konfigurationsfilen. För att hacka detta skript räcker det att skicka till parametern where ett värde som inte tillhandahålls av koden, till exempel 3. Och eftersom detta värde inte tillhandahålls av skriptet, då bara en variabel $fil kommer inte att initieras. Därför kommer det att vara möjligt att ställa in ett godtyckligt värde för det genom URL-strängen.

          http://localhost/index.php?where=3&file=.htaccess

          Men det är så, en liten avvikelse från ämnet. 😀

          Lösningen på detta problem är ganska enkel, $fil den behöver bara initieras före användning, d.v.s. ge den ett standardvärde.

          Här, om parametern where skickas till skriptet, kommer variabeln att initieras korrekt, annars blir den helt enkelt tom. Här är en [säker] rullgardinsmeny i PHP.

          P.S. När du skapar scenarier är det nödvändigt att ta hänsyn till och följaktligen utesluta alla möjliga attackvektorer. Detta är det enda sättet att skapa ett projekt som uppfyller säkerhetsreglerna och som efterfrågas av kunden. Ses snart!

  • Dela med sig