Witam. Mam problem z rozwiązaniem systemu wyszukiwania książek w bazie danych MySQL. Wcześniej miałem to zrobione na kilku IFach, ale takie wyszukiwanie jest bez sensu. Chciałbym, żeby skrypt działał w ten sposób, że każde dodatkowe pole w formularzu dopełnia zapytanie, ale jeżeli podamy na przykład tylko jedno pole to i tak się nam 'coś' wyszuka. Zrobiłem to wyszukiwanie wzorując się na innym temacie na tym forum, ale w moim przypadku jest ono bez sensu, bo mam osobną tabelę z autorami i osobną tabelę z książkami, które są połączone relacją wiele do wielu(tabela pomocnicza autorzy_to_ksiazki).

Potrzebuje wiec podpowiedzi czy jest wykonalnym zrobienie czegoś takiego stosując jedno zapytanie SQL, czy powinienem ten mechanizm wyszukiwania całkiem inaczej przerobić? A jeżeli tak, to mniej więcej w jaki sposób?

To jest moja baza:
  1. CREATE TABLE IF NOT EXISTS `ksiazki` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `tytul` varchar(200) COLLATE utf8_polish_ci NOT NULL,
  4. `wydanie` int(11) DEFAULT NULL,
  5. `miejsce_wydania` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  6. `wydawnictwo` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  7. `rok_wydania` int(11) NOT NULL,
  8. `haslo_przedmiotowe` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  9. `ISBN` varchar(17) COLLATE utf8_polish_ci NOT NULL,
  10. `komentarz` varchar(500) COLLATE utf8_polish_ci NOT NULL,
  11. PRIMARY KEY (`id`),
  12. UNIQUE KEY `ISBN` (`ISBN`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=12 ;
  14.  
  15. CREATE TABLE IF NOT EXISTS `autorzy` (
  16. `id` int(11) NOT NULL AUTO_INCREMENT,
  17. `imie` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  18. `nazwisko` varchar(35) COLLATE utf8_polish_ci NOT NULL,
  19. PRIMARY KEY (`id`)
  20. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=23 ;
  21.  
  22. CREATE TABLE IF NOT EXISTS `autorzy_to_ksiazki` (
  23. `autor_id` int(11) NOT NULL,
  24. `ksiazka_id` int(11) NOT NULL,
  25. KEY `autor_id` (`autor_id`,`ksiazka_id`),
  26. KEY `ksiazka_id` (`ksiazka_id`)
  27. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
  28.  
  29. CREATE TABLE IF NOT EXISTS `hasla_przedmiotowe` (
  30. `id` int(11) NOT NULL AUTO_INCREMENT,
  31. `haslo` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  32. PRIMARY KEY (`id`)
  33. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=3 ;
  34.  
  35. CREATE TABLE IF NOT EXISTS `slowa_kluczowe` (
  36. `id` int(11) NOT NULL AUTO_INCREMENT,
  37. `slowo_klucz` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  38. PRIMARY KEY (`id`),
  39. UNIQUE KEY `slowo_klucz` (`slowo_klucz`)
  40. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=2 ;
  41.  
  42. CREATE TABLE IF NOT EXISTS `slowa_to_ksiazki` (
  43. `slowo_id` int(11) NOT NULL,
  44. `ksiazka_id` int(11) NOT NULL
  45. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
  46.  
  47. ALTER TABLE `autorzy_to_ksiazki`
  48. ADD CONSTRAINT `autorzy_to_ksiazki_ibfk_2` FOREIGN KEY (`ksiazka_id`) REFERENCES `ksiazki` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  49. ADD CONSTRAINT `autorzy_to_ksiazki_ibfk_3` FOREIGN KEY (`autor_id`) REFERENCES `autorzy` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;


To jest formularz:

  1. <form method="post" action="">
  2. <input id="autor" name="autor" type="text" />
  3. <input id="tytul" name="tytul" type="text" />
  4. <input id="haslo_przedmiotowe" name="haslo_przedmiotowe" />
  5. <input id="rok_wydania" name="rok_wydania" type="text" />
  6. <input id="saveForm" class="button_text" type="submit" name="wyslane" value="Szukaj" />
  7. </form>


  1. if(isset($_POST['wyslane'])){
  2.  
  3. $wh = array(); //inicjalizujemy tablicę z warunkami
  4.  
  5. if (!empty($_POST['tytul'])) //jeśli podano tytul
  6.  
  7. $wh[] = "tytul = '".$_POST["tytul"]."' ";
  8.  
  9. if (!empty($_POST['autor'])) //jeśli podano autora
  10.  
  11. $wh[] = "autor = '".$_POST["autor"]."' ";
  12.  
  13. if (!empty($_POST['rok_wydania'])) //jeśli podano rok wydania
  14.  
  15. $wh[] = "rok = '".$_POST["rok_wydania"]."' ";
  16.  
  17. if (!empty($_POST['haslo_przedmiotowe'])) //jeśli podano haslo_przedmiotowe
  18.  
  19. $wh[] = "haslo = '".$_POST["haslo_przedmiotowe"]."' ";
  20.  
  21. if (!empty($wh)){
  22.  
  23. $where = "where k.tytul like '%".$_POST["tytul"]."%' and a.nazwisko like '%".$_POST["autor"]."%'
  24. and k.rok_wydania like '%".$_POST["rok_wydania"]."%' and k.haslo_przedmiotowe like '%".$_POST["haslo_przedmiotowe"]."%' ";
  25.  
  26. }else{
  27. $where = '';
  28. $sql = 'select * from bibliografia.ksiazki as k, bibliografia.autorzy as a '.$where;
  29.  
  30. $wynik = mysql_query($sql);
  31.  
  32. echo "<table cellpadding=\"4\" border=2>";
  33. echo "<tr>";
  34. echo "<td> tytul </td>";
  35. echo "<td> autor </td>";
  36. echo "<td> rok </td>";
  37. echo "<td> haslo </td>";
  38. echo "<tr>";
  39. while ($row8 = mysql_fetch_array ($wynik))
  40. {
  41. echo "<tr>";
  42. echo "<td>{$row8['tytul']}</td>";
  43. echo "<td>{$row8['nazwisko']}</td>";
  44. echo "<td>{$row8['rok_wydania']}</td>";
  45. echo "<td>{$row8['haslo_przedmiotowe']}</td>";
  46. echo "<tr>";
  47. //return $wynik;
  48. }
  49. //mysql_free_result($wynik);
  50.  
  51. echo "</table>";
  52. }
  53. }