Cautare cu afisare cuvinte apropiate relevante

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Avatar utilizator
trif
Mesaje:500

Cautare cu afisare cuvinte apropiate relevante

sSalut,
Cum as putea sa fac ca script de cautare cu ajax care sa faca urmatoarele:
Cel mai bun exemplu este la control panel la cautare, atunci cand scriu ceva imi raman inconitele care contin ceea ce am scris.
Deci ceea ce as dori si nu stiu sa fac este in felul urmator:
Am un select cu urmatoarele afisari:

Cod: Selectaţi tot

a
aa
ab
bb
ba
bcc
Acesta lista este tot timpul cat timp nu am scris nimic in casuta de cautare, iar de exemplu scriu "a" si lista sa se actualizeze automat cu ajax si ar trebui sa apara:

Cod: Selectaţi tot

aa
ab
ba
Am incercat dar nu stiu.
Am scriptul acesta:
index.php

Cod: Selectaţi tot

<script type="text/javascript" src="jquery-1.2.1.pack.js"></script>
<script type="text/javascript"><!--
var rbtn_v = '';     // aici se adauga valoarea initiala, transmisa daca nu e buton bifat
$(document).ready(function() {
  $("input:radio[name=rbtn]").click(function() {
    rbtn_v = $(this).val();
  });
});

function lookup(inputString) {
  if(inputString.length == 0) {
   // Hide the suggestion box.
   $('#suggestions').hide();
  }
  else {
    var data = 'queryString='+$('#inputString').val()+ '&rbtn='+rbtn_v;
//     alert(data);    // verifica ce date preia si trimite javascript
    $.post('cautare.php', data, function(response){
//     alert(response);    // ca sa se verifice datele primite
      if(data.length > 0) {
        $('#suggestions').show();
        $('#autoSuggestionsList').html(response);
      }
    });

    return false;      // required to not open the page when form is submited
  }
}
//-->
</script>

Cod: Selectaţi tot

<form action="cautare.php" method="post" onsubmit="lookup(); return false;">
 | <input type="radio" name="rbtn" value="" >Toate
 | <input type="radio" name="rbtn" value="c">Copii
</form>
<form id="search" name="search">
<input type="text" size="50" name="term" value="" placeholder="Scrie numele cantarii" id="inputString" onkeyup="lookup(this.value);" onblur="fill();" />
</form> <br><br>
   <div class="suggestionsBox" id="suggestions" style="display: none;"> 
            <div class="suggestionList" id="autoSuggestionsList">
            </div>
</div>

cautare.php

Cod: Selectaţi tot

$db = new mysqli('localhost', 'root' ,'', 'cantaric_ppt');
     if(!$db) {
      echo 'Nu se poate conecta la Baza de date!';
   } else {
      if(isset($_POST['queryString'])) {
         $queryString = $db->real_escape_string($_POST['queryString']);         
         if(strlen($queryString) >0) {
         $categoria = isset($_POST['rbtn']) ? $_POST['rbtn'] : 'd';
            $query = $db->query("SELECT * FROM cantari_ppt WHERE categoria='".$categoria."' AND aprobare = 1 AND denumire LIKE '$queryString%' ORDER BY denumire LIMIT 10");
            if($query) {
               while ($result = $query ->fetch_object()) {
                  echo '<img src="powerpoint_icon.png" width="24" height="24"> <a href="localhost/cautare/index.php?urlf='.$result->urlf.'">'.$result->denumire.'</a>  <br>';
              } 
            } else {
               echo 'A aparut o problema. nu este query';
            }
         } else {
         }
      }
       else {
         echo 'Nu s-a trimis nimic de la index!';
      }   
   }
 
Care este functional 85% si cauta in functie de ceea ce aleg eu.
Iar al doilea index.php:

Cod: Selectaţi tot

<script language="javascript" src="jquery-1.2.6.min.js"></script>
<script language="javascript" src="jquery.timers-1.0.0.js"></script>
<script type="text/javascript">
$(document).ready(function(){
   var j = jQuery.noConflict();
    j(document).ready(function()
    {
        j(".refresh").everyTime(1000,function(i){
            j.ajax({
              url: "refresh.php",
              cache: false,
              success: function(html){
                j(".refresh").html(html);
              }
            })
        })
        
    });
    j(document).ready(function() {
            j('#post_button').click(function() {
                $text = $('#post_text').val();
                j.ajax({
                    type: "POST",
                    cache: false,
                    url: "save.php",
                    data: "text="+$text,
                    success: function(data) {
                        alert('data has been stored to database');
                    }
                });
            });
        });
   j('.refresh').css({color:"#000"});
});
</script>

Cod: Selectaţi tot

<div class="refresh">
</div>
refresh.php

Cod: Selectaţi tot

$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("cantaric_ppt", $con);
// Cod de test afisare un continut pt. cei autentificati si altul pt. vizitatori 
$result = mysql_query("SELECT * FROM cantari_ppt 
INNER JOIN categorie
ON cantari_ppt.categoria = categorie.cheie
ORDER BY id_c DESC limit 10");
echo '<table align = center width=70% border="1">';
while($row = mysql_fetch_array($result))
  {
    echo '<tr><td><img src="powerpoint_icon.png" width="24" height="24"> <a href="index.php?urlf='.$row['urlf'].'">'.$row['denumire'].'</a><div align="right">' . $row['denumire_categorie'].'&nbsp;</td> </tr>';
 echo '</div>';
  }
  echo ' 
</table>';
mysql_close($con); 
Al doilea script imi afiseaza in timp real ultima data introdusa in baza de date fara refresh.
Cum le combin aceste 2 scripturi ca sa imi dea ceea ce doresc eu.
Cum am zis ceea ce vreau este ca sa nu imi apara rezultatele cand scriu ceva ci sa imi ramana in functie de ceea ce scriu eu.
Sper ca ati inteles.
Astept raspuns.
Multumesc anticipat.
Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Pentru ceea ce vrei trebuie sa aplici un Algoritm special.
In cazul in care vrei ca sa fie afisate cuvinte relevante /apropiate de ceea ce este scris in casuta de cautare, cred ca se poate folosi Algoritmul Levenstein .
Nu cunosc prea bine despre algoritmi in PHP, sunt lucruri de care nu am avut nevoie si nici nu am de gand sa ma bag la vreun cod in ele.
Din ce am gasit pe net, Algoritmul Levenstein este folosit de exemplu la cautari (google search) pentru a gasii cuvantul cel mai relevant /apropiat la cautare (exemplu scrieti "marp" si google arata "marplo", "marpa" ca fiind cel mai relevant cuvant).
PHP are deja o functie care implementeaza acest algoritm, levenshtein(), la adresa:
php.net/manual/en/function.levenshtein.php
Dar foloseste multe resurse /memorie pe server.

Poate or mai fi si alte functii sau algoritmi pt asa ceva, dar nu cunosc. Poti incerca sa cauti pe internet dupa: "algoritm cautare php".

trif Mesaje:500
Multumesc de raspuns.
M-am uitat la cest algoritm si mi se pare complicat. O alta ideie de cautare ca tot am cautat dar nimic. cu ajax ceva.

Daca nu este nici o modalitate atunci cum as putea sa combin cele doua scripturi ca sa imi faca in felul urmator:
Am asa:

Cod: Selectaţi tot

o cat1 | o cat2 | o cat2 <-- categorile
|         | <-- casuta de cautare
rezultat1
rezultat2
rezultat3
etc.
Rezultatele 1, 2, 3, etc. sa mi le afiseze al 2 lea script care afiseaza ultimile rezultate din bd fara refresh IAR cand incep sa scriu in casuta sa imi dispara al doilea rezultatul de la scriptul 2 si sa imi afiseze scriptul 1.
Am facut asa:

Cod: Selectaţi tot

<?php if (isset($_POST['queryString'])) { ?>
<div class="suggestionsBox" id="suggestions" style="display: none;"> 
            <div class="suggestionList" id="autoSuggestionsList">
            </div>
</div>
<?php }
else { ?>
 <br>
<div class="refresh">
</div>
<?php } ?>
Dar nu merge.
Sau daca este o alta solutie.
Asptet raspuns. Cu stima Trif.
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

Subiecte similare