Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [AJAX][MySQL][PHP] Przerobienie wyszukiwarki korzystającej z plików TXT na wyszukiwarkę MySQL, jak ustawić szukanie w bazie danych MySQL zamiast w plikach tekstowych
szymek001
post 18.08.2011, 22:37:04
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 21.09.2005

Ostrzeżenie: (10%)
X----


Witam, znalazłem dosyć ciekawą wyszukiwarkę ajax, różne opcje są dostępne, mnie interesuje nr.3: http://gajdaw.pl/ajax/ajax-wyszukiwarka/examples.html
demo jest na stronie: http://danowski.pl/ (po prawej). Jednak w plikach które są do pobrania skrypt korzysta z bazy tekstowej.

Wydaje mi sie, że trzeba zmienić plik funkcje.inc.php:
  1. <?php
  2.  
  3. function podaj_dane($ANazwapliku)
  4. {
  5. $tmp = array();
  6. $p = file($ANazwapliku);
  7. $pc = count($p);
  8. $tmp['ile'] = $pc;
  9.  
  10. $tytuly = array();
  11. $nazwyplikow = array();
  12.  
  13. for ($i = 0; $i < $pc; $i++) {
  14. $e = explode('|', trim($p[$i]));
  15. $tytuly[$i] = $e[0];
  16. $nazwyplikow[$i] = $e[1];
  17. }
  18.  
  19. $tmp['nazwyplikow'] = $nazwyplikow;
  20. $tmp['tytuly'] = $tytuly;
  21.  
  22. return $tmp;
  23. }
  24.  
  25.  
  26. function wyniki_szukaj($ASzukaj, $ADane, $AMax = false)
  27. {
  28. $dane = array();
  29. $dane[0] = array();
  30. $dane[1] = array();
  31. $dane[2] = array();
  32.  
  33. for ($i = 0; $i < $ADane['ile']; $i++) {
  34. $t = file_get_contents('txt/' . $ADane['nazwyplikow'][$i]);
  35.  
  36. //tytul
  37. $dane[0][$i] = $ADane['tytuly'][$i];
  38.  
  39. //id
  40. $dane[1][$i] = $i + 1;
  41.  
  42. //liczba wystapien slowa
  43. $dane[2][$i] = substr_count($t, $ASzukaj);
  44. }
  45. $dane[2], SORT_DESC, SORT_NUMERIC,
  46. $dane[0], SORT_ASC, SORT_STRING,
  47. $dane[1]
  48. );
  49.  
  50. if ($dane[2][0] == 0) {
  51. //nic nie znaleziono
  52.  
  53. return false;
  54.  
  55. } else {
  56.  
  57. if ($AMax === false) {
  58. //zwracamy wszystkie wyniki
  59.  
  60. for ($i = 0; ($i < $ADane['ile']) && ($dane[2][$i] > 0); $i++);
  61.  
  62. $dane['ile'] = $i;
  63. $dane['pokazpelnalista'] = false;
  64.  
  65. $dane[0] = array_slice($dane[0], 0, $i, true);
  66. $dane[1] = array_slice($dane[1], 0, $i, true);
  67. $dane[2] = array_slice($dane[2], 0, $i, true);
  68.  
  69.  
  70. } else {
  71.  
  72.  
  73. if ($dane[2][$AMax] > 0) {
  74. //zwracamy co najwyżej Max wyników
  75. //znaleziono więcej niż Max
  76.  
  77. $dane['ile'] = $AMax;
  78. $dane['pokazpelnalista'] = true;
  79.  
  80. $dane[0] = array_slice($dane[0], 0, $AMax, true);
  81. $dane[1] = array_slice($dane[1], 0, $AMax, true);
  82. $dane[2] = array_slice($dane[2], 0, $AMax, true);
  83.  
  84.  
  85. } else {
  86. //zwracamy co najwyżej Max wyników
  87. //znaleziono mniej niż Max
  88.  
  89.  
  90. for ($i = 0; ($i < $ADane['ile']) && ($dane[2][$i] > 0); $i++);
  91.  
  92. $dane['ile'] = $i;
  93. $dane['pokazpelnalista'] = false;
  94.  
  95. $dane[0] = array_slice($dane[0], 0, $i, true);
  96. $dane[1] = array_slice($dane[1], 0, $i, true);
  97. $dane[2] = array_slice($dane[2], 0, $i, true);
  98.  
  99. }
  100.  
  101. }
  102.  
  103. return $dane;
  104.  
  105. }
  106.  
  107. }
  108.  
  109. function wyniki_html($AWyniki, $ASzukaj)
  110. {
  111. if ($AWyniki) {
  112.  
  113.  
  114. $wynik = '<ol>';
  115. for ($i = 0; $i < $AWyniki['ile']; $i++) {
  116. $wynik .=
  117. '<li><a href="index.php?id=2&amp;id2=' .
  118. $AWyniki[1][$i] .
  119. '">' .
  120. $AWyniki[0][$i] .
  121. '</a> (' .
  122. $AWyniki[2][$i] .
  123. ')' .
  124. '</li>';
  125. }
  126. $wynik .= '</ol>';
  127.  
  128. if ($AWyniki['pokazpelnalista']) {
  129. $wynik .=
  130. '</ol><a id="pelnalista" href="index.php?id=3&amp;szukaj=' .
  131. $ASzukaj .
  132. '">pełna lista wyników</a>';
  133. }
  134.  
  135. } else {
  136. $wynik = 'Nic nie znaleziono!';
  137. }
  138.  
  139. return $wynik;
  140.  
  141. }
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150. ?>


i server.php:
  1. <?php
  2.  
  3. require_once 'walidacja.inc.php';
  4. require_once 'funkcje.inc.php';
  5.  
  6. $dane = podaj_dane('00index.log');
  7.  
  8. if (
  9. isset($_GET['co']) &&
  10. (strlen($_GET['co']) < 20) &&
  11. preg_match('/^[a-z]+$/', $_GET['co'])
  12. ) {
  13. header('Content-Type: text/html; charset=utf-8');
  14.  
  15. $w = wyniki_szukaj($_GET['co'], $dane, 5);
  16. echo wyniki_html($w, $_GET['co']);
  17.  
  18. } else {
  19. header('HTTP/1.x 404 Not Found');
  20. }
  21.  
  22. ?>


Nie potrafię jednak przerobić tego by podpiąć pod to MySQL, dlatego proszę o jakieś sugestie.
Go to the top of the page
+Quote Post
bastard13
post 18.08.2011, 22:45:51
Post #2





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Funkcja podaj_dane() wyciąga dane z pliku, więc powinna je wyciągać z bazy.
Najpierw łączysz się z bazą: http://pl.php.net/manual/en/mysqli.connect.php
Następnie pobierasz dane: http://pl.php.net/manual/en/mysqli.query.php
Przy użyciu selecta wynikiem jest: http://pl.php.net/manual/en/class.mysqli-result.php
Żeby dostać dane w postaci tablicy asocjacyjnej wykonujesz metodę: http://pl.php.net/manual/en/mysqli-result.fetch-assoc.php
I gotowe:)


--------------------
Go to the top of the page
+Quote Post
szymek001
post 19.08.2011, 07:23:56
Post #3





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 21.09.2005

Ostrzeżenie: (10%)
X----


Koniecznie wymagane jest użycie bazy asocjacyjnej? Dane w tablicy mam w standardowy sposób zapisane, to jest w tabeli 'tytul' mam przechowywane tytuły, a chciałbym zrobić samo wyszukiwanie po tytułach, mam już to zrobione według innego skryptu, jednak wyniki wyświetlają się dopiero po przeładowaniu strony, a ajaxowo działa tylko autopodpowiadanie.
Go to the top of the page
+Quote Post
sada
post 19.08.2011, 13:51:24
Post #4





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

Ostrzeżenie: (0%)
-----


Tu masz ogólną konstrukcję pobierania danych AJAX
Na stronie gdzie chcesz mieć wyniki :

[JAVASCRIPT] pobierz, plaintext
  1. load('adres_pliku_który-stworzysz?zmiennaGET1='+$a+'&zmiennaGET2='+$b+'&zmiennaGET3='+$c, function(xhr) {
  2.  
  3. var response = JSON.parse(xhr.responseText);
  4.  
  5. len = response.length;
  6.  
  7. for(var i = 0; i < len; i++) {
  8. wynik1[i]=response[i].Nazwa_kolumny1;
  9. wynik2[i]=response[i].Nazwa_kolumny2;
  10. wynikn[i]=response[i].Nazwa_kolumnyn;
  11. }
[JAVASCRIPT] pobierz, plaintext


stworzysz osobny plik PHP a w nim zgrubsza tak:

  1. $mysql = new mysqli(DANE POŁĄCZENIA ) or die('Houston mamy problem');
  2.  
  3. if($result = $mysql->query("SELECT * TEREFERE)) {
  4. $returnedArray = array();
  5. while($row = $result->fetch_object()) {
  6. $returnedArray[] = $row;
  7. }
  8. echo json_encode($returnedArray);


Ten post edytował sada 19.08.2011, 13:52:48
Go to the top of the page
+Quote Post
szymek001
post 19.08.2011, 20:14:45
Post #5





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 21.09.2005

Ostrzeżenie: (10%)
X----


a co jeśli wyszukiwarka wygląda tak:
  1. <?
  2. mysql_connect("localhost", "login", "haslo");
  3. if(mysql_num_rows(mysql_query("select tytul from teksty where tytul='".$_GET["q"]."'")))mysql_query("update tytul set id=id+1 where tytul='".$_GET["q"]."'");
  4. else mysql_query("insert into tytul values('".$_GET["q"]."', 1)");
  5.  
  6. $wynik=mysql_query("select tytul from teksty where tytul like '%".$_GET["q"]."%'"); //proste przeszukiwanie bazy
  7. while($rekord=mysql_fetch_array($wynik))echo "<a href='strona.php?id=".$rekord["tytul"]."'>".$rekord["tytul"]."</a><br>";
  8. ?>


a index.php:
  1. <script>
  2. var xmlHttp;
  3. var txt="";
  4. var pozycja=0;
  5. var ile;
  6.  
  7. function Zapytanie(adres){
  8. if(xmlHttp==null){ //w zależności od przeglądarki tworzymy obiekt XMLHTTP
  9. if(window.ActiveXObject)xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); //dla IE
  10. else if(window.XMLHttpRequest)xmlHttp = new XMLHttpRequest(); //Firefox, Opera, Safari itp.
  11. }
  12. if (xmlHttp == null){alert("Nie udało się zainicjować obiektu xmlHttpRequest!");return;} //jeśli obiekt nie został utworzony, zwracamy, błąd a skrypt zostaje przerwany
  13.  
  14. xmlHttp.onreadystatechange = function(){ //funkcja ma za zadanie wyświetlić wyniki zwrócone przez serwer
  15. if (xmlHttp.readyState == 4 || xmlHttp.status == 200) //sprawdzamy czy udało się pobrać zawartość strony (readyState=4) lub czy serwer nie zwrócił błędu(status=200 oznacza że jest OK)
  16. document.getElementById("wyniki").innerHTML = xmlHttp.responseText; //zwrócony tekst zapisujemy do warstwy
  17. };
  18. xmlHttp.open("GET", adres); //ustawiamy metodę i adres żądania
  19. xmlHttp.send(null); //wysyłamy żądanie
  20. }
  21.  
  22. function podpowiedz(event){
  23.  
  24. if(event.keyCode!=40 && event.keyCode!=38 && event.keyCode!=13){
  25. pozycja=-1;
  26. Zapytanie("suggest.php?tek="+document.getElementById("tekst").value);
  27. txt=document.getElementById("tekst").value;
  28. }
  29. else{
  30. ile=document.getElementById("ile_wynikow").value;
  31. if(event.keyCode==40){
  32. if(pozycja==ile)pozycja=0;
  33. else pozycja++;
  34. }
  35. else if(event.keyCode==38){
  36. if(pozycja==0)pozycja=ile;
  37. else pozycja--;
  38. }
  39. else if(event.keyCode==13)ruszaj();
  40.  
  41. document.getElementById("tekst").value=(pozycja==ile)?txt:document.getElementById("kl"+pozycja).innerHTML;
  42. for(var i=0;i<ile;i++)document.getElementById("kl"+i).className=(i==pozycja)?"podswietlone":"zwykle";
  43. }
  44. }
  45.  
  46. function swiec(el){
  47. pozycja=el;
  48. for(var i=0;i<ile;i++)document.getElementById("kl"+i).className=(i==pozycja)?"podswietlone":"zwykle";
  49. }
  50. function wloz(id){
  51. document.getElementById("tekst").value=document.getElementById("kl"+id).innerHTML;
  52. ruszaj();
  53. }
  54.  
  55. function ruszaj(){
  56. location.href="wyszukiwarka.php?q="+document.getElementById("tekst").value;
  57. }
  58. </script>


nie potrzebuję mysqli, aktualnie mogę szukać normalnie gdy nie działa js, i szukać normalnie z podpowiedzią autosugestera - jednak brakuje opcji wczytywania ajaxowego...


próbowałem:
  1. function ruszaj(){
  2. load(''wyszukiwarka.php?q='+document.getElementById('tytul').value', function(xhr) {
  3.  
  4. var response = JSON.parse(xhr.responseText);
  5.  
  6. len = response.length;
  7.  
  8. for(var i = 0; i < len; i++) {
  9. wynik1[i]=response[i].Nazwa_kolumny1;
  10. wynik2[i]=response[i].Nazwa_kolumny2;
  11. wynikn[i]=response[i].Nazwa_kolumnyn;
  12. }
  13. }


Ale wtedy nawet autosuggest nie działa...

Ten post edytował szymek001 19.08.2011, 20:16:14
Go to the top of the page
+Quote Post
sada
post 19.08.2011, 21:27:42
Post #6





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

Ostrzeżenie: (0%)
-----


A funkcję load podpiąłeś

[JAVASCRIPT] pobierz, plaintext
  1. function load(url, callback) {
  2. var xhr;
  3. if(typeof XMLHttpRequest !== 'undefined') xhr = new XMLHttpRequest();
  4. else {
  5. var versions = ["Microsoft.XmlHttp",
  6. "MSXML2.XmlHttp",
  7. "MSXML2.XmlHttp.3.0",
  8. "MSXML2.XmlHttp.4.0",
  9. "MSXML2.XmlHttp.5.0"];
  10.  
  11. for(var m = 0, len = versions.length; m < len; m++) {
  12. try {
  13. xhr = new ActiveXObject(versions[m]);
  14. break;
  15. }
  16. catch(e){}
  17. } // end for
  18. }
  19.  
  20. if (xhr) {
  21. xhr.open("GET", url, false);
  22. xhr.send(null);
  23. return callback(xhr);
  24. } else {
  25. return false;
  26. }
[JAVASCRIPT] pobierz, plaintext
Go to the top of the page
+Quote Post
szymek001
post 20.08.2011, 23:19:21
Post #7





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 21.09.2005

Ostrzeżenie: (10%)
X----


Nawet jeśli podepne to i tak działa standardowo i nie chodzi wtedy podpowiadanie..
No cóż, chyba jednak daruje sobie to ajaxowe wczytywanie. Jakby co to polecam wyszukiwarkę ajaxowoą: http://www.komputerswiat.pl/download/4344/...i-projektu.aspx ciekawa z autosugestią szukanej frazy wink.gif

Znalazłem coś ciekawego, bo ma wczytywanie bez przeładowania, jednak nie obsługuje listingu niestety: http://www.codeforest.net/simple-search-wi...query-and-mysql

Ten post edytował szymek001 21.08.2011, 10:25:22
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.05.2024 - 07:50