Cautare in tabel expresie asemanatoare

Ai o întrebare legată de PHP? Incercăm să îi găsim soluţie. Sau poate doar vrei să publici un cod interesant.

Moderatori: Zamolxe, Moderatori

Avatar utilizator
Double_Web
Average Member
Mesaje: 183
Membru din: Joi Apr 12, 2012 2:33 pm
Localitate: Bucuresti
Contact:

Cautare in tabel expresie asemanatoare

Mesajde Double_Web » Lun Mai 21, 2012 6:37 pm

Am gasit o problema noua:
utilizatorul introduce intr-o zona de text, un text. Cum fac sa caut in tabel acel text; daca nu gaseste sa-mi caute ceva asemanator.

De exemplu:
utilizatorul introduce urm. txt:

Cod: Selectaţi tot

Regula: 1+1=3


daca in tabel scie

Cod: Selectaţi tot

Regula: 1+1=2


da eroare ca nu gaseste acel text.
Cum fac sa-mi caute in tabel (daca nu gaseste inregistrarea ca atare), ceva semanator cu ce scrie userul?[/quote]



frederikb
PHPRomania Supporter
Mesaje: 9
Membru din: Lun Mai 21, 2012 7:02 pm
Localitate: Bucuresti
Contact:

unde?

Mesajde frederikb » Lun Mai 21, 2012 7:09 pm

Intr-un tabel dintr-o baza de date?

Avatar utilizator
Double_Web
Average Member
Mesaje: 183
Membru din: Joi Apr 12, 2012 2:33 pm
Localitate: Bucuresti
Contact:

Mesajde Double_Web » Lun Mai 21, 2012 8:03 pm

da.
o baza de date are untabel.
tabelul are 3 coloane:
-id;
-col1;
-col2.

In col1 exista un text "Regula: 1+1=2".
Userul scrie intr-un camp: "Regula: 1+1=3"

O sa-mi apare eroare ca nu gaseste acel text, dar eu vreau sa caute un text asemanator cu ce introduce userul.

frederikb
PHPRomania Supporter
Mesaje: 9
Membru din: Lun Mai 21, 2012 7:02 pm
Localitate: Bucuresti
Contact:

Mesajde frederikb » Mar Mai 22, 2012 1:16 pm

pai
SELECT * FROM tabel WHERE col1 LIKE %expresie%

nu ?

Avatar utilizator
Double_Web
Average Member
Mesaje: 183
Membru din: Joi Apr 12, 2012 2:33 pm
Localitate: Bucuresti
Contact:

Mesajde Double_Web » Mar Mai 22, 2012 9:22 pm

am incercat si asa dar nu merge...
alte idei ?

frederikb
PHPRomania Supporter
Mesaje: 9
Membru din: Lun Mai 21, 2012 7:02 pm
Localitate: Bucuresti
Contact:

cod

Mesajde frederikb » Mie Mai 23, 2012 12:07 am

posteaza bucata de cod.
trebuie sa meaga

dechim
Senior Member
Mesaje: 1486
Membru din: Mar Mai 10, 2005 11:53 pm
Localitate: Drobeta Turnu Severin

Mesajde dechim » Mie Mai 23, 2012 2:24 am

Incearca dupa cum "suna":

SELECT * FROM tabela WHERE SOUNDEX($expresie) = SOUNDEX(col1);

sau

SELECT * FROM tabela WHERE $expresie SOUNDS LIKE col1;

Ar trebui sa mearga

frederikb
PHPRomania Supporter
Mesaje: 9
Membru din: Lun Mai 21, 2012 7:02 pm
Localitate: Bucuresti
Contact:

test

Mesajde frederikb » Mie Mai 23, 2012 4:01 am

deci, din ce imi dau seama abia acum

mysql va incerca sa testeze sa vada conditia
deci, egalul ala nu are ce cauta acolo

atat timp cat e 1+1=3 pus in queryul tau
n-o sa mearga, ptr ca 1+1 nu e egal cu 3.

ma indoies si in cazul lui 1+1=2 , dar nu intelg de ce

vrei sa faci WHERE col LIKE 1+1=3 , n-are sens.

deci ori faci LIKE, NOT LIKE sau = direct pe o expresie.

La ce anume lucrezi?

Avatar utilizator
Double_Web
Average Member
Mesaje: 183
Membru din: Joi Apr 12, 2012 2:33 pm
Localitate: Bucuresti
Contact:

Mesajde Double_Web » Mie Mai 23, 2012 7:37 pm

am incercat sa fac metoda cu 'sunatoarea' dar nu prea merge...
uite un rebut:

Cod: Selectaţi tot

$sql1="SELECT * FROM aa_bb WHERE caearinata = SOUNDS LIKE '$ceariantaa'";


am incercat si sintaxa dechim, dar nici aia nu mere..

dechim
Senior Member
Mesaje: 1486
Membru din: Mar Mai 10, 2005 11:53 pm
Localitate: Drobeta Turnu Severin

Mesajde dechim » Mie Mai 23, 2012 8:31 pm

Mai am o idee. Sterge cate un caracter de la sfarsitul expresiei de cautat

$expresie = "1+1=3";

$result = mysql_query("SELECT * FROM tabela WHERE '$expresie' LIKE '%col1%';");

while (strlen($expresie)>1 && mysql_num_rows($result)==0)
{
$expresie = substr($expresie, 0, -1);
$result = mysql_query("SELECT * FROM tabela WHERE '$expresie' LIKE '%col1%';") or die(mysql_error());
}

...

Poti incerca si alte variante, sa elimini caractere de la inceput sau din interiorul sirului dupa o regula pe care ti-o stabilesti tu

l33t
Senior Member
Mesaje: 216
Membru din: Sâm Mai 10, 2008 7:31 pm

Mesajde l33t » Joi Mai 24, 2012 12:54 am

dechim scrie:Mai am o idee. Sterge cate un caracter de la sfarsitul expresiei de cautat

...

Poti incerca si alte variante, sa elimini caractere de la inceput sau din interiorul sirului dupa o regula pe care ti-o stabilesti tu


Implementezi in mysql functia levenshtein, ai exemplu si functia mai jos:
http://stackoverflow.com/questions/4671 ... -mysql-php

Avatar utilizator
socu
Senior Member
Mesaje: 470
Membru din: Mie Apr 22, 2009 11:05 pm
Localitate: Marghita

Mesajde socu » Joi Mai 24, 2012 9:01 am

Pentru astfel de cautari ai nevoie de un search server. Solutii barbare cum ar fi inlaturarea rand pe rand a caracterelor din text sau chiar functia levenshtein or sa-ti incetineasca foarte mult cautarea, sa nu mai vorbim cand o sa ai multe inregistrari. Renunta la ideea de a face cautari complexe in mysql (sau alte sgbd-uri).

Avatar utilizator
Double_Web
Average Member
Mesaje: 183
Membru din: Joi Apr 12, 2012 2:33 pm
Localitate: Bucuresti
Contact:

Mesajde Double_Web » Joi Mai 24, 2012 11:30 am

@dechim mersi, acum cauta ceva mai bine in db.
@socu, m-am gandit sa nu fac cautari complexe dar... daca scriptu are nevoie, ce sa fac....?

AJalex
Average Member
Mesaje: 76
Membru din: Sâm Sep 27, 2008 3:54 pm

Mesajde AJalex » Dum Iun 24, 2012 11:06 pm

SELECT * FROM tabelul_tau WHERE coloana_ta LIKE %text%

Asta ar trebui sa mearga, LIKE trebuie combinat cu inlocuitori cum este si %.

Avatar utilizator
mihaitha
Senior Member
Mesaje: 2383
Membru din: Vin Mai 04, 2007 12:40 pm
Localitate: Sibiu
Contact:

Mesajde mihaitha » Lun Iun 25, 2012 11:14 am

See FULLTEXT search http://devzone.zend.com/26/using-mysql- ... searching/

Dezavantajul e ca nu merge pe tabele InnoDB, doar pe MyISAM, deci ai de ales intre fulltext search si foreign keys.


Înapoi la “Cod PHP”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 3 vizitatori