Ho trovato questo script, e cercavo di utilizzarlo,
Codice PHP:
<?
// PulisciQuery: Restituisce la query pulita da porole inutili(congiunzioni etc.)
function PulisciQuery($queryvar){
// array parole di cui non tener conto nelle ricerche
$arrayBadWord=Array("lo", "l", "il", "la", "i", "gli", "le", "uno", "un", "una", "un", "su", "sul", "sulla", "sullo", "sull", "in", "nel", "nello", "nella", "nell", "con", "di", "da", "dei", "d", "della", "dello", "del", "dell", "che", "a", "dal", "è", "e", "per", "non", "si", "al", "ai", "allo", "all", "al", "o");
$queryclean=strtolower($queryvar);
for($a=0;$a<count($arrayBadWord);$a++){
// sostituisco bad words con espressioni regolari \b ->solo se parole singole, non facenti parti di altre
$queryclean=preg_replace("/\b".$arrayBadWord[$a]."\b/", "", $queryclean);
}
// elimino tutti caratteri non alfanumerici sostituendeli con uno spazio
$queryclean=preg_replace("/\W/", " ", $queryclean);
return $queryclean;
}
// QueryToArray: Restituisce array delle parole chiave da cercare
function QueryToArray($queryvar){
// pulisco query da parole accessorie e caratteri non alfanumerici
$querypulita=PulisciQuery($queryvar);
// costruisco l'array contenente tutte le parole da cercare
$arraySearch=explode(" ", $querypulita);
// elimino doppioni dall'array
$arraySearchUnique=array_unique($arraySearch);
// elimino valori array vuoti o con solo spazi
$arrayVuoto=Array(""," ");
$arrayToReturn=array_diff($arraySearchUnique, $arrayVuoto);
return $arrayToReturn;
}
// CreaQueryRicerca: Creo la query di ricerca.
// peso titolo se non specificato=5, peso testo se non specificato=3
// searchlevel -> 1 o 0. default 1. Se 0 trova parole non complete. Es. cerchi osso?ok anche ossobuco. Se 1 non succede.
function CreaQueryRicerca($queryvar, $pesotitolo=5, $pesotesto=3, $searchlevel=1){
// trasformo la stringa in un array di parole da cercare
$arrayToFind=QueryToArray($queryvar);
// numero elementi da cercare
$elementiToFind=count($arrayToFind);
// punteggio massimo raggiungibile
$maxPoint=$elementiToFind*$pesotitolo+$elementiToFind*$pesotesto;
if($elementiToFind==0){
return "";
}else{
$query="select ROUND((";
$sqlwhere="";
// ciclo per ogni parola trovata ($Valore)
foreach($arrayToFind As $Indice => $Valore){
// se $Valore è presente in titolo instr(titolo, '$Valore') restituirà 1 altrimenti 0
// moltiplico il valore restituito (1 o 0) per il peso della parola (5 per il titolo, 3 per testo)
if($searchlevel==1){
// regexp: uso espressioni regolari. [[:<:]] equivale a \b per separare parole
$query.="((titolo REGEXP '[[:<:]]".$Valore."[[:>:]]')>0)*$pesotitolo+";
$query.="((testo REGEXP '[[:<:]]".$Valore."[[:>:]]')>0)*$pesotesto+";
$sqlwhere.="titolo REGEXP '[[:<:]]".$Valore."[[:>:]]' OR testo REGEXP '[[:<:]]".$Valore."[[:>:]]' OR ";
}else{
$query.="(instr(titolo, '$Valore')>0)*$pesotitolo+";
$query.="(instr(testo, '$Valore')>0)*$pesotesto+";
$sqlwhere.="titolo like '%$Valore%' OR testo like '%$Valore%' OR ";
}
}
$sqlwhere=substr($sqlwhere, 0, strlen($sqlwhere)-4);
// calcolo la percentuale di rilevanza --> rilevanza*100/$maxPoint
$query.="0)*100/$maxPoint,2) as rilevanza, ID, titolo from tabella WHERE $sqlwhere order by rilevanza DESC";
return $query;
}
}
// stringa da ricercare presa da form.
//$queryvar="parola1 parola2"; //esempio
if(isset($_POST['search'])){$queryvar=$_POST['search'];}else{$queryvar="";}
if(trim($queryvar)=="" || strlen(trim($queryvar))<=3){
echo "La stringa di ricerca deve contenere più di 3 caratteri.";
}else{
// query da eseguire
// primo valore passato è peso delle parole cercate nel titolo, secondo peso parole nel testo
// terzo valore cercato: 1 o0: accuratezza ricerca. Se 0 trova parole non complete. Es. cerchi osso?ok anche ossobuco. Se 1 non succede.
// CreaQueryRicerca($queryvar) -> prende primo e secondo valore di default
$queryRicerca=CreaQueryRicerca($queryvar, 5, 3, 1);
// Eseguo la query
// La query restituisce ID, titolo e % di rilevanza del risultato
echo $queryRicerca;
}
?>
Ed io ho fatto piccole modifiche:
Codice PHP:
<?php
$queryvar = $_GET['k'];
// PulisciQuery: Restituisce la query pulita da porole inutili(congiunzioni etc.)
function PulisciQuery($queryvar){
// array parole di cui non tener conto nelle ricerche
$arrayBadWord=Array("lo", "l", "il", "la", "i", "gli", "le", "uno", "un", "una", "un", "su", "sul", "sulla", "sullo", "sull", "in", "nel", "nello", "nella", "nell", "con", "di", "da", "dei", "d", "della", "dello", "del", "dell", "che", "a", "dal", "è", "e", "per", "non", "si", "al", "ai", "allo", "all", "al", "o");
$queryclean=strtolower($queryvar);
for($a=0;$a<count($arrayBadWord);$a++){
// sostituisco bad words con espressioni regolari \b ->solo se parole singole, non facenti parti di altre
$queryclean=preg_replace("/\b".$arrayBadWord[$a]."\b/", "", $queryclean);
}
// elimino tutti caratteri non alfanumerici sostituendeli con uno spazio
$queryclean=preg_replace("/\W/", " ", $queryclean);
return $queryclean;
}
// QueryToArray: Restituisce array delle parole chiave da cercare
function QueryToArray($queryvar){
// pulisco query da parole accessorie e caratteri non alfanumerici
$querypulita=PulisciQuery($queryvar);
// costruisco l'array contenente tutte le parole da cercare
$arraySearch=explode(" ", $querypulita);
// elimino doppioni dall'array
$arraySearchUnique=array_unique($arraySearch);
// elimino valori array vuoti o con solo spazi
$arrayVuoto=Array(""," ");
$arrayToReturn=array_diff($arraySearchUnique, $arrayVuoto);
return $arrayToReturn;
}
// CreaQueryRicerca: Creo la query di ricerca.
// peso titolo se non specificato=5, peso testo se non specificato=3
// searchlevel -> 1 o 0. default 1. Se 0 trova parole non complete. Es. cerchi osso?ok anche ossobuco. Se 1 non succede.
function CreaQueryRicerca($queryvar, $pesotitolo=5, $pesoautore=3, $searchlevel=1){
// trasformo la stringa in un array di parole da cercare
$arrayToFind=QueryToArray($queryvar);
// numero elementi da cercare
$elementiToFind=count($arrayToFind);
// punteggio massimo raggiungibile
$maxPoint=$elementiToFind*$pesotitolo+$elementiToFind*$pesoautore;
if($elementiToFind==0){
return "";
}else{
$query="select ROUND((";
$sqlwhere="";
// ciclo per ogni parola trovata ($Valore)
foreach($arrayToFind As $Indice => $Valore){
// se $Valore è presente in titolo instr(titolo, '$Valore') restituirà 1 altrimenti 0
// moltiplico il valore restituito (1 o 0) per il peso della parola (5 per il titolo, 3 per testo)
if($searchlevel==1){
// regexp: uso espressioni regolari. [[:<:]] equivale a \b per separare parole
$query.="((titolo REGEXP '[[:<:]]".$Valore."[[:>:]]')>0)*$pesotitolo+";
$query.="((autore REGEXP '[[:<:]]".$Valore."[[:>:]]')>0)*$pesoautore+";
$sqlwhere.="Titolo REGEXP '[[:<:]]".$Valore."[[:>:]]' OR Autore REGEXP '[[:<:]]".$Valore."[[:>:]]' OR ";
}else{
$query.="(instr(titolo, '$Valore')>0)*$pesotitolo+";
$query.="(instr(autore, '$Valore')>0)*$pesoautore+";
$sqlwhere.="Titolo like '%$Valore%' OR Autore like '%$Valore%' OR ";
}
}
$sqlwhere=substr($sqlwhere, 0, strlen($sqlwhere)-4);
// calcolo la percentuale di rilevanza --> rilevanza*100/$maxPoint
$query.="0)*100/$maxPoint,2) as rilevanza, Tiolo, Autore from ((Autore right JOIN Creazione ON ID=Autore)right join Opera on Opera=Opera.ID)left join File ON Opera.ID=File.Opera
WHERE $sqlwhere order by rilevanza DESC";
return $query;
}
}
//echo
// stringa da ricercare presa da form.
//$queryvar="parola1 parola2"; //esempio
if(isset($_POST['search'])){$queryvar=$_POST['search'];}else{$queryvar="";}
if(trim($queryvar)=="" || strlen(trim($queryvar))<=3){
echo "La stringa di ricerca deve contenere più di 3 caratteri.";
}else{
// query da eseguire
// primo valore passato è peso delle parole cercate nel titolo, secondo peso parole nel testo
// terzo valore cercato: 1 o0: accuratezza ricerca. Se 0 trova parole non complete. Es. cerchi osso?ok anche ossobuco. Se 1 non succede.
// CreaQueryRicerca($queryvar) -> prende primo e secondo valore di default
$queryRicerca=CreaQueryRicerca($queryvar, 5, 3, 1);
// Eseguo la query
// La query restituisce ID, titolo e % di rilevanza del risultato
echo $queryRicerca;
}
?>
ma non ce la faccio, non ottengo alcuna query... mi dice solamente: "La stringa di ricerca deve contenere più di 3 caratteri".
Dove sbaglio?