tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Like vyhledavani z promenne s %

před 9 lety

Dr.Diesel
Člen | 53

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.

před 9 lety

David Grudl
Nette Core | 6806

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?

před 9 lety

westrem
Člen | 398

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?

před 9 lety

Dr.Diesel
Člen | 53

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

před 9 lety

Milo
Nette Core | 1119

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.

před 9 lety

David Grudl
Nette Core | 6806

maTidla dobrá, beru :-)

před 9 lety

westrem
Člen | 398

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 :)

před 9 lety

Milo
Nette Core | 1119

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)

před 9 lety

David Grudl
Nette Core | 6806

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

před 9 lety

westrem
Člen | 398

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 ..