Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před rokem

Dr.Diesel
Člen
Registrovaný: 18. 4. 2008
Příspěvky: 63

Like vyhledavani z promenne s %

Ahoj vsem, co se tyce like, nejsou pres modifikator %s escapovana procenta, mozna by stalo za zvazeni, zda v tomto neco neudelat:

//uzivatel zadal do inputu '%slovo%'
$word = '%slovo%';

//vyhledavani pravostranneho rozsireni, pri spolehnuti na dibi se ale % dostane az do LIKE
dibi::test('select * from [table] where [col] like %s',$word.'%');

//zadavani tohoto je imho dost "nenette/nedibi" :))
$word = str_replace('%','\%',$word);
//navic to funguje pomerne nahodou, protoze dibi escapuje to lomitko, mysql to ale presto sezere jako escape toho procenta
dibi::test('select * from [table] where [col] like %s',$word.'%');

Vysledkem je pak problematicke vyhledavani s oboustrannym rozsirenim, ktere je zasadne pomale a nezadouci, pokud vyvojar sam nestanovi jeho pouziti v kodu.

Nebo jsem neco prehlidl? ;-)

Mozna by staly za zvazeni modifikatory %sr, %sl, %sb (? +N), ktere by sestavovaly 'slovo%','%slovo','%slovo%' a uvnitr vyrazu procenta escapovaly.

 

#2 před rokem

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5548

Re: Like vyhledavani z promenne s %

Tohle jsem chtěl přidat už dávno, ale nikdy jsem nepřišel na to, jakou zvolit syntax. Na nic univerzálního jsem nepřišel, ale faktem je, že v drtivé většině případů skutečně stačí hledat 'slovo%','%slovo','%slovo%' a na to by se modifikátory daly udělat.

Nicméně v modifikátorech začíná být border a %sr, %sl, %sb se mi moc nelíbí. Možná nějaké kombinace s %like? Nebo něco jako %*like, %like*, %*like*. Ačkoliv hvězdička jako součást modifikátoru není dobrý nápad, mohlo by to porušit zpětnou kompatibilitu, pokud někdo používá třeba %d*10.

Máte nápad?

 

#3 před rokem

westrem
dibi guru
Registrovaný: 13. 1. 2009
Příspěvky: 425

Re: Like vyhledavani z promenne s %

Ten %like operator sa mi paci .. co takto pouzit tildu namiesto hviezdicky na urcenie smeru prehliadania?
Tzn:

  • %~like
  • %like~
  • %~like~

Alebo je problem aj s tildou?


Nette 2.0 alpha2 Namespaced for PHP 5.3 // http://westrem.posterous.com

 

#4 před rokem

Dr.Diesel
Člen
Registrovaný: 18. 4. 2008
Příspěvky: 63

Re: Like vyhledavani z promenne s %

westrem napsal(a):

Ten %like operator sa mi paci .. co takto pouzit tildu namiesto hviezdicky na urcenie smeru prehliadania?
Tzn:

  • %~like
  • %like~
  • %~like~

Alebo je problem aj s tildou?

Trochu problem by mohl byt, ze nekteri treba zacinajici vyvojari by tildu nemuseli na klavesnici najit :)) Ale jinak za me dobry :) .

Navrhoval bych jeste pro neco pouzit pouzit samotne %like – z meho pohledu pro pravostranne rozsireni, ktere je imho nejcastejsi (ale muze to byt jen muj pripad), tj.

%like = %like~ = slovo%

Jeste by mozna sla jedna modifikace %s :)))

%sP = %like~
%Ps = %~like
%PsP = %~like~
+ %sPN, %PsN, %PsPN

A border imho v modifikatorech neni Davide, proc myslis? :-D

 

#5 před rokem

Milo
dibi guru
Registrovaný: 4. 5. 2010
Příspěvky: 242

Re: Like vyhledavani z promenne s %

Co něco jako:

<?php
dibi::query( "SELECT * FROM table WHERE col LIKE %like ", array( '%%val1%%val2%', $val1, $val2 ), " AND ... " );
?>

Navíc se v LIKE dá použít ještě podtržítko jako zástupný znak.

 

#6 před rokem

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5548

Re: Like vyhledavani z promenne s %

maTidla dobrá, beru :-)

 

#7 před rokem

westrem
dibi guru
Registrovaný: 13. 1. 2009
Příspěvky: 425

Re: Like vyhledavani z promenne s %

Dr.Diesel napsal:
Jeste by mozna sla jedna modifikace %s :)))

To uz asi skorej nie, tie modifikatory co si napisal mi pridu uz narocne na zapamatovanie a zbytocne komplikuju prehladny zapis pomocou %like

A border imho v modifikatorech neni Davide, proc myslis?

Ked si pozries API k dibi konkretne uz sekciu, kde sa parsuje cela query do native podoby tak uvidis par TODOciek o presmiestneni a zmene vyznamu u par modifikatorov, asi toto mal David na mysli

Milo napsal:
Co něco jako:

Nepochopil som ako by sa to malo spravat, skus ozrejmit :)


Nette 2.0 alpha2 Namespaced for PHP 5.3 // http://westrem.posterous.com

 

#8 před rokem

Milo
dibi guru
Registrovaný: 4. 5. 2010
Příspěvky: 242

Re: Like vyhledavani z promenne s %

Nepochopil som ako by sa to malo spravat, skus ozrejmit :)

<?php
  ( "SELECT * FROM table WHERE col LIKE %like", $value ); // nelze, není jasné jaké % ve $value se má escapovat

  // Obecne
  ( "SELECT * FROM table WHERE col LIKE %like", array( 'format', $value1 [, $value2] ));

  // Konkretne
  $search = "Ferda";
  ( "SELECT * FROM table WHERE col LIKE %like", array( '%%v', $search ));

  // Vysledne SQL
  $sql = "SELECT * FROM table WHERE col LIKE '%Ferda'";


  ( "SELECT * FROM table WHERE col LIKE %like", array( '%%v%', "100%" ));
  $sql = "SELECT * FROM table WHERE col LIKE '%100\%%'";


  ( "SELECT * FROM table WHERE col LIKE %like", array( '%%v%%v', "Jedna", "Dve" ));
  $sql = "SELECT * FROM table WHERE col LIKE '%Jedna%Dve'";


  // Hardcore (escapovat i podtrzitko)
  ( "SELECT * FROM table WHERE col LIKE %like", array( '_%v%%v_', "Jedna%", "Dve__" ));
  $sql = "SELECT * FROM table WHERE col LIKE '_Jedna\%%Dve\_\__'";

?>

Formát je na zvážení…

EDIT: Vlastne by se dalo ve formatu pouzivat klasika %s, %d…

Editoval Milo (26. 8. 2010 15:07)

 

#9 před rokem

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5548

Re: Like vyhledavani z promenne s %

Implementováno všude s výjimkou PostgreSQL a Oracle (nemám k dispozici).

 

#10 před rokem

westrem
dibi guru
Registrovaný: 13. 1. 2009
Příspěvky: 425

Re: Like vyhledavani z promenne s %

Milo napsal:

Hezke! A moc .. musel som to sice az dvakrat precitat ten post aby som si uvedomil, ze na value sa referencujes cez %v ale je v tom pekna logika ..


Nette 2.0 alpha2 Namespaced for PHP 5.3 // http://westrem.posterous.com

 

Zápatí