Oznámení
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 ..