Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]wyszukiwarka oparta na xml ?
Forum PHP.pl > Forum > Przedszkole
Michał90
Witam,
Mam taką stronę:
Wyniki są zapisane w pliku xml i są one pobierane do danej kategorii na stronę główną itd. Jak można zrobić wyszukiwarkę, żeby wyszukiwała wyniki np. po tytule z pliku xml lub już z kategorii, które są na stronie głównej?

Pozdrawiam
thek
Można rozwiązać to na kilka sposobów, ale myślę, że jednym z bardziej przyjaznych dla programisty jest użycie XPath w pliku XML. Wygoda jak dla mnie porównywalna z zapytaniami do bazy danych smile.gif
Michał90
Można troszkę jaśniej smile.gif ?

Pozdrawiam
Void
Tu masz ładnie opisane użycie XML w PHP (łącznie z XPath): http://devzone.zend.com/article/1713
Michał90
Można coś w wersji pl? biggrin.gif
thek
Przyzwyczajaj się, że poznając programowanie większość tych rzeczy powyżej absolutnych podstaw nie jest dostępna w języku polskim. A jeśli już jest, to będziesz za nią musiał zapłacić (książki, kursy, płatne treści na stronach). Na szczęście XPath jest bliski podstawom i tutaj masz choćby krótki tutorialik do niego:
http://www.ygreg.com/pokaz.php/xpath
Michał90
Kod
simplexml
ladujesz do niego, wyciagasz kolumne zwiazana z wyszukiwana rzecza (np. tytul), w petli od 0 do liczba_elementow porownujesz (eregi) wartosc wezla z szukana wartoscia, jesli sie zgadza, to zapamietujesz index w tablicy $wyniki

na koniec pokazujesz zawartosc xml odwolujac sie do listy publication i indeksow z tablicy wyniki (jesli szukany tytul byl na pozycjach 0, 5 i 67 to pokazujesz publication[0], publication[5] i publication[67])


czy ktoś mi pomoże zamienić to na php biggrin.gif jak to zrobić?

Pozdrawiam
Void
A co, dostałeś taką odpowiedź na innym forum i nie wiesz co z tym zrobić ? sleep.gif

Ja bym tego jednak nie robił za pomocą simplexml tylko obiektu DomDocument i później domxpath.

1. tworzysz nowy obiekt DomDocument ($x = new DomDocument() ) i ładujesz do niego plik xml metodą load(sciezka/do/pliku.xml)
2. tworzysz nowy obiekt domxpath, podając mu w argumencie konstruktora instancję wcześniej utworzonego obiektu DomDocument ($y = new domxpath($x) )
3. wywołujesz metodę query obiektu domxpath, podając w argumencie ścieżkę xpath do elementów XML, które chcesz pobrać. Wynik przypisujesz do zmiennej
4. za pomocą pętli foreach iterujesz tablicę zawierającą pobrane elementy i wyświetlasz je lub robisz z nimi co tam potrzebujesz smile.gif
Michał90
Nie wiem czy mnie dobrze rozumicie i czy to dobrze napisałem w pierwszym wątku.

W jednym pliku xml mam tam zawarte wszystkie tytuły smile.gif i właśnie z tego dokumentu xml pobieram/wyświetlam dane na str. tylko chciałbym jeszcze zrobić wyszukiwarkę na stronie, jak ją zrobić?
Void
No i robisz dokładnie tak jak napisałem, a w tej pętli foreach (pkt 4) po prostu sprawdzasz czy szukana fraza pojawia się w którymś z tytułów pobranych Xpathem.

Przykładowo:
masz taki plik xml:
  1. <dane>
  2. <news>
  3. <tytul>News testowy</tytul>
  4. <kategoria>1</kategoria>
  5. <tresc>...</tresc>
  6. </news>
  7. <news>
  8. <tytul>news nr 2</tytul>
  9. <kategoria>3</kategoria>
  10. <tresc>abc</tresc>
  11. </news>
  12. ...
  13. </dane>


to metoda query obiektu domxpath będzie wyglądała tak:
  1. // Definicja potrzebnych obiektów, załadowanie pliku xml, czyli to co pisałem w poprzednim poście
  2. $results = $myDomxpathObject->query('/dane/news/tytul');
  3. // dalej foreach i porównujesz frazę, którą wpisał użytkownik z każdym elementem tablicy $results.


Już chyba więcej napisać się nie da smile.gif

Jak dalej nie wiesz jak tworzyć te obiekty to zajrzyj do tego artykułu, którego link wcześniej podałem, nie musisz znać angielskiego, popatrz na kody po prostu smile.gif
Michał90
Ok już wyświetlają mi się tytuły.
Zrobiłem to tak:
  1. <?php
  2. $dom = new DomDocument();
  3. $dom->load("publikacje.xml");
  4. $xp = new domxpath($dom);
  5. // Definicja potrzebnych obiektów, załadowanie pliku xml, czyli to co pisałem w poprzednim poście
  6. $results = $xp->query('/publications/publication/tytul');
  7. // dalej foreach i porównujesz frazę, którą wpisał użytkownik z każdym elementem tablicy $results.
  8. foreach ($results as $node) {
  9. echo $node->textContent . " ";
  10. }
  11. ?>


Teraz jak podpiąć pod to wyszukiwarkę biggrin.gif ?
Void
W pętli foreach zamiast wyświetlać wartość pola textContent każdego elementu XML porównaj ją np. za pomocą funkcji stristr z frazą wpisaną przez użytkownika. Jeżeli funkcja zwróci true - znaczy że dany tytuł pasuje w jakimś stopniu do zapytania, jeśli false - znaczy, że nie został znaleziony.
Michał90
Można troszkę jaśniej smile.gif ?

Pozdrawiam
Void
  1. foreach ($results as $node) {
  2. if ( stristr($node->textContent, $_POST['nazwa_pola_wyszukiwania_w_formularzu']) ) {
  3. // tytuł odpowiada zapytaniu
  4. } else {
  5. // tytuł nie odpowiada zapytaniu
  6. }
  7. }


No i oczywiście musisz dorobić do tego jakiś formularz. Nie wiem co w tym jest niejasnego
Michał90
Czyli ma to wyglądać tak:

wyszukiwarka.php
  1. <?php
  2. $dom = new DomDocument();
  3. $dom->load("publikacje.xml");
  4. $xp = new domxpath($dom);
  5. // Definicja potrzebnych obiektów, załadowanie pliku xml, czyli to co pisałem w poprzednim poście
  6. $results = $xp->query('/publications/publication/tytul');
  7. // dalej foreach i porównujesz frazę, którą wpisał użytkownik z każdym elementem tablicy $results.
  8. foreach ($results as $node) {
  9. if ( stristr($node->textContent, $_POST['wyszukiwarka']) ) {
  10. // tytuł odpowiada zapytaniu
  11. echo $wyszukiwarka;
  12. } else {
  13. // tytuł nie odpowiada zapytaniu
  14. echo 'nie ma takiej pozycji';
  15. }
  16. }
  17. ?>


pole.html
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <form action="wyszukiwarka.php" method="post">
  6. <input name="wyszukiwarka" type="text" />
  7. <input type="submit" value="Szukaj" />
  8. </form>
  9. </body>
  10. </html>


Tak to ma wyglądać..? Coś nie działa :/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.