Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][XML][PHP]Wyszukiwarka xml z php
Forum PHP.pl > Forum > Przedszkole
loleq1111
Witam, posiadam problem z przeszukaniem dokumentu xml
ma ktoś pomysł by dopasować to w taki sposób by przeszukało cały dokument xml ?
bo aktualnie skupia się na pierwszym wpisie <ksiazka> </ksiazka> a dalej nie przeszukuje
tzn. jeśli pierwszy element w xml jest wyszukiwany to pokazuje wynik poprawnie
jeśli element jest drugi lub później w kolejności w pliku xml zwraca wynik nie znaleziono...
dodam że skrypt odwołuje się do plików xml w katalogu tzn przeszukuje pliki z katalogu

skrypt php:
  1. <?php
  2. header('Content-Type: text/html; charset = UTF-8');
  3.  
  4. $tytul = $_POST['tytul'];
  5. $autor = $_POST['autor'];
  6. $gatunek= $_POST['gatunek'];
  7.  
  8. //Oznaczenie które pola były wpisane
  9. $wpisano=0;
  10.  
  11.  
  12. if ($tytul != "") wpisano ++;
  13. if ( $autor != "") wpisano =+ 2;
  14. if ( $gatunek != "") wpisano =+ 4;
  15.  
  16.  
  17. $tytul = mb_convert_case($tytul, MB_CASE_TITLE, "UTF-8");
  18. $autor = mb_convert_case($autor, MB_CASE_TITLE, "UTF-8");
  19.  
  20. $folder = glob('ksiazki/*.xml');
  21. foreach ($folder as $file) {
  22. $plik = file_get_contents($file);
  23. $xml = simplexml_load_string($plik);
  24.  
  25. $pokaz = 0;
  26. if ((string) $xml->ksiazka->tytul == $tytul) $pokaz ++;
  27. if ((string) $xml->ksiazka->autor == $autor) $pokaz =+ 2;
  28. if ((string) $xml->ksiazka->gatunek == $gatunek) $pokaz =+ 4;
  29. if($pokaz==$wpisano) {
  30. echo "TYTUŁ:", ' ', $xml->ksiazka->tytul, '<br>';
  31. echo "AUTOR:", ' ', $xml->ksiazka->autor, '<br>';
  32. echo "GATUNEK:", ' ', $xml->ksiazka->gatunek, '<br>';
  33. echo "OPIS:", ' ', $xml->ksiazka->opis, '<br>';
  34. echo "WYDAWNCTWO:", ' ', $xml->ksiazka->wydawnictwo, '<br>';
  35. echo "ROK WYDANIA:", ' ', $xml->ksiazka->wydana, '<br><br>';
  36. }
  37. else echo "Nie znaleziono żadnych książek";
  38. }
  39. ?>



przykład xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <literatura>
  3.  
  4.  
  5.  
  6. <ksiazka>
  7. <nr_id>1244</nr_id>
  8. <tytul>Lalka</tytul>
  9. <autor>Boleslaw Prus</autor>
  10. <gatunek>Powiesc</gatunek>
  11. <opis>Opis</opis>
  12. <wydawnictwo>WSIP</wydawnictwo>
  13. <wydana>1994</wydana>
  14. </ksiazka>
  15. </literatura>
  16.  
Popek231
  1. # 10 linia z ew. błędem
  2. if ($tytul != "") wpisano ++;
  3. if ( $autor != "") wpisano =+ 2;
  4. if ( $gatunek != "") wpisano =+ 4;


a nie przypadkiem:
  1. # 10 linia z ew. błędem
  2. if ($tytul != "") wpisano ++;
  3. if ( $autor != "") wpisano += 2;
  4. if ( $gatunek != "") wpisano += 4;

?
+= zamiast =+


to samo od 26 się zaczyna
  1. if ((string) $xml->ksiazka->tytul == $tytul) $pokaz ++;
  2. if ((string) $xml->ksiazka->autor == $autor) $pokaz += 2;
  3. if ((string) $xml->ksiazka->gatunek == $gatunek) $pokaz += 4;



Operatory tego typu wyglądają w ten sposób:
  1. <?php
  2. $o0=5;
  3. $o1=5;
  4. $o2=5;
  5. $o3=5;
  6. $o4=5;
  7. $o1+=$o0;
  8. $o2-=$o0;
  9. $o3/=$o0;
  10. $o4*=$o0;
  11. echo $o1.'<br>'.$o2.'<br>'.$o3.'<br>'.$o4;
  12. ?>


ps.
Dodatkowo uwaga do tego co poprawiałem:

linia 10:
  1. if ($tytul != "") $wpisano++;
  2. if ( $autor != "") $wpisano += 2;
  3. if ( $gatunek != "") $wpisano += 4;


$wpisano zamiast wpisano (brak dolca $) smile.gif


ps2.
z tego co pamiętam, użycie kropek zamiast przecinków jest szybsze:)
i po co wstawiać spacje w osobnym ciągu?
  1. echo "TYTUŁ:", ' ', $xml->ksiazka->tytul, '<br>';

daj spacje od razu za dwukropkiem i załatwione:)
  1. echo "TYTUŁ: ".$xml->ksiazka->tytul.'<br>';
  2. echo "AUTOR: ".$xml->ksiazka->autor.'<br>';
  3. echo "GATUNEK: ".$xml->ksiazka->gatunek.'<br>';
  4. echo "OPIS: ".$xml->ksiazka->opis.'<br>';
  5. echo "WYDAWNCTWO: ".$xml->ksiazka->wydawnictwo.'<br>';
  6. echo "ROK WYDANIA: ".$xml->ksiazka->wydana.'<br><br>';



i przy $_POST możesz dodać, żeby nie wywalało błędu jak ktoś dotrze do pliku bez formularza:
  1. $tytul = (isset($_POST['tytul']))?$_POST['tytul']:'';
  2. $autor = (isset($_POST['autor']))?$_POST['autor']:'';
  3. $gatunek = (isset($_POST['gatunek']))?$_POST['gatunek']:'';


ps3.
już więcej nie piszę, bo wyjdzie, że się czepiam biggrin.gif

jak przerobię, żeby wyświetlało więcej wyników, zamiast jednego, to dam znać wink.gif









No:)
jedna chwila, pętelka i gotowe:)

Proszę:
test.php (tak nazwałem)
  1. <?php
  2. header('Content-Type: text/html; charset = UTF-8');
  3.  
  4. $tytul = (isset($_POST['tytul']))?$_POST['tytul']:'';
  5. $autor = (isset($_POST['autor']))?$_POST['autor']:'';
  6. $gatunek = (isset($_POST['gatunek']))?$_POST['gatunek']:'';
  7.  
  8. //$tytul = 'Lalka'; //znajdzie 2 wyniki
  9. //$tytul = 'Lalkaa'; //znajdzie 1 wynik
  10. //$tytul = 'Lalkaaa'; //znajdzie 0 wyników
  11. // //jak zostawione puste wszystko, to pokaże wszystkie wyniki
  12.  
  13. //Oznaczenie które pola były wpisane
  14. $wpisano=0;
  15. $pokazanowynikow=0;
  16.  
  17.  
  18. if($tytul!="") $wpisano++;
  19. if($autor!="") $wpisano+=2;
  20. if($gatunek!="") $wpisano+=4;
  21.  
  22.  
  23. $tytul = mb_convert_case($tytul, MB_CASE_TITLE, "UTF-8");
  24. $autor = mb_convert_case($autor, MB_CASE_TITLE, "UTF-8");
  25.  
  26. $folder = glob('test.xml');
  27. foreach($folder as $file){
  28. $plik = file_get_contents($file);
  29. $xml = simplexml_load_string($plik);
  30.  
  31. for($id=0;$id<(count($xml));$id++){
  32. $pokaz = 0;
  33. if((string)$xml->ksiazka[$id]->tytul == $tytul) $pokaz++;
  34. if((string)$xml->ksiazka[$id]->autor == $autor) $pokaz+=2;
  35. if((string)$xml->ksiazka[$id]->gatunek == $gatunek) $pokaz+=4;
  36. if($pokaz==$wpisano) {
  37. echo "TYTUŁ: ".$xml->ksiazka[$id]->tytul.'<br>';
  38. echo "AUTOR: ".$xml->ksiazka[$id]->autor.'<br>';
  39. echo "GATUNEK: ".$xml->ksiazka[$id]->gatunek.'<br>';
  40. echo "OPIS: ".$xml->ksiazka[$id]->opis.'<br>';
  41. echo "WYDAWNCTWO: ".$xml->ksiazka[$id]->wydawnictwo.'<br>';
  42. echo "ROK WYDANIA: ".$xml->ksiazka[$id]->wydana.'<br><br>';
  43. $pokazanowynikow++;
  44. }
  45. }
  46. }
  47. if($pokazanowynikow==0) echo "Nie znaleziono żadnych książek";
  48. ?>


test.xml (tak nazwałem) //byłem zbyt leniwy, żeby dodać prawdziwe dane tongue.gif
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <literatura>
  3. <ksiazka>
  4. <nr_id>1244</nr_id>
  5. <tytul>Lalka</tytul>
  6. <autor>Boleslaw Prus</autor>
  7. <gatunek>Powiesc</gatunek>
  8. <opis>Opis</opis>
  9. <wydawnictwo>WSIP</wydawnictwo>
  10. <wydana>1994</wydana>
  11. </ksiazka>
  12. <ksiazka>
  13. <nr_id>1234</nr_id>
  14. <tytul>Lalka</tytul>
  15. <autor>Boleslaw Pruss</autor>
  16. <gatunek>Powiessc</gatunek>
  17. <opis>Opiss</opis>
  18. <wydawnictwo>WsSIP</wydawnictwo>
  19. <wydana>12994</wydana>
  20. </ksiazka>
  21. <ksiazka>
  22. <nr_id>1234</nr_id>
  23. <tytul>Lalkaa</tytul>
  24. <autor>Boleslaw Pruss</autor>
  25. <gatunek>Powiessc</gatunek>
  26. <opis>Opiss</opis>
  27. <wydawnictwo>WsSIP</wydawnictwo>
  28. <wydana>12994</wydana>
  29. </ksiazka>
  30. </literatura>
loleq1111
Wielkie dzieki za wszystkie uwagi
i oczywiście poprawne rozw smile.gif
Popek231
////////////////////
  1. for($id=0;$id<(count($xml));$id++){

zamień na:
  1. $ilewierszy = count($xml);
  2. for($id=0;$id<$ilewierszy;$id++){

ponieważ przy każdym przelocie, pętla sprawdza warunek od nowa i za każdym razem zlicza ile jest $xml - jeśli jest dużo, będzie muliło...


ew. możesz dodać jeszcze taki bajer na końcu:
  1. if($pokazanowynikow==0) echo "Nie znaleziono żadnych książek.";
  2. else echo "Spośród $ilewierszy książek w bazie danych znaleziono $pokazanowynikow pasujących wyników.";
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.