Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před 7 měsíci

Václav M.
Člen
Registrovaný: 19. 10. 2011
Příspěvky: 33

Chybné složení jediné podmínky s nerovnítkem

PHP: 5.3.8
DIBI: 1.5-rc1 (faf4445)

Dnes jsem potřeboval do jednoho výběrového dotazu vložit podmínku s !=, kdy jsem měl přibližně následující pole:

$Dotaz_Where = array("`Jmeno_ID` != %s", $_SESSION[PREZENTACE_Nazev]['Spravce']);

použité do přibližně následujícího příkazu:

$Vysledek = dibi::fetchAll("SELECT `Jmeno`, `Jmeno_ID` FROM `Uzivatele_Jmeno` WHERE ", $Dotaz_Where);

A stalo se to, že pole s podmínkou zpracoval špatně a výsledné SQL bylo takovéto:

SELECT `Jmeno`, `Jmeno_ID`
FROM `Uzivatele_Jmeno`
WHERE '`Jmeno_ID` != %s',
'4a5y4a521s7o1s7ocia25i614s3t1s4f4s965i5z6k53606t5e445i465e4ici8xci7o604t5i464s'

Potom jsem ten dotaz stejně musel celý přepsat, protože jsem zjistil, že výsledný výběr neodpovídal tomu, co jsem chtěl vlastně vybrat.


Chybami se člověk učí – ale někteří lidé jsou nepoučitelní.

 

#2 před 7 měsíci

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

Re: Chybné složení jediné podmínky s nerovnítkem

Dotaz se poskládal logicky správně ikdyž jinak než bys chtěl:

$Dotaz_Where = array(
        array('[Jmeno_ID] != %s', $_SESSION[PREZENTACE_Nazev]['Spravce']),
);
$Vysledek = dibi::fetchAll('SELECT [Jmeno], [Jmeno_ID] FROM [Uzivatele_Jmeno] WHERE %and', $Dotaz_Where);

 

#3 před 7 měsíci

Václav M.
Člen
Registrovaný: 19. 10. 2011
Příspěvky: 33

Re: Chybné složení jediné podmínky s nerovnítkem

No, použití toho modifikátoru %and mne tedy nenapadlo, protože jsem měl zato, že je pouze pro případy, kdy je těch podmínek více najednou. A čistě logicky by to tak být mělo – nebo ne?


Chybami se člověk učí – ale někteří lidé jsou nepoučitelní.

 

#4 před 7 měsíci

HosipLan
dibi guru
Registrovaný: 1. 6. 2009
Příspěvky: 2630

Re: Chybné složení jediné podmínky s nerovnítkem

Ne. Snaž se používat fluent. Tohleto jsou přehrocenosti.


Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHubCMS Kdyby

Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni

 

#5 před 7 měsíci

Václav M.
Člen
Registrovaný: 19. 10. 2011
Příspěvky: 33

Re: Chybné složení jediné podmínky s nerovnítkem

Přehrocenost?

A jen tak mimochodem, k fluentu bych potřeboval pár základních příkladů, abych viděl, jak co použít. Já totiž nejsem z dokumentace vytvořené z PHPDoc komentářů schopen to přečíst … pokud k tomu není slušný příklad.

A proto když jsem začal připravovat dokumentaci k frameworku VMaX-ZnaK, tak je hlavní pozornost věnována právě příkladům – no, taky bych to mohl konečně dopsat, ale vždycky dostanu nějaký nápad na nějaké vylepšení a …

Editoval Václav M. (28. 10. 2011 13:01)


Chybami se člověk učí – ale někteří lidé jsou nepoučitelní.

 

#6 před 7 měsíci

HosipLan
dibi guru
Registrovaný: 1. 6. 2009
Příspěvky: 2630

Re: Chybné složení jediné podmínky s nerovnítkem


Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHubCMS Kdyby

Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni

 

#7 před 7 měsíci

Václav M.
Člen
Registrovaný: 19. 10. 2011
Příspěvky: 33

Re: Chybné složení jediné podmínky s nerovnítkem

Dík. Snad to zatím stačit bude.


Chybami se člověk učí – ale někteří lidé jsou nepoučitelní.

 

#8 před 7 měsíci

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

Re: Chybné složení jediné podmínky s nerovnítkem

Václav M. napsal(a):

No, použití toho modifikátoru %and mne tedy nenapadlo, protože jsem měl zato, že je pouze pro případy, kdy je těch podmínek více najednou. A čistě logicky by to tak být mělo – nebo ne?

Čistě teoreticky by dibi mohlo předvídat, jaký modifikátor použít, když je parametr pole. Zrovna v tomhle případě je to jednoduché, ale obecně by byla potřeba hlubší lexikální analýza.

Navíc když si všimneš, nepoužil jsem jednoduché pole s podmínkou jako ty, ale pole v poli. Kdyby zůstalo jednoduché, je potřeba modifikátor %sql. Takže interpretace pole taky není vždy jednoznačna.

A jednu podmínku můžeš vždy napsat rovnou jako SQL bez modifikátoru.

$Vysledek = dibi::fetchAll('
        SELECT
                [Jmeno],
                [Jmeno_ID]
        FROM
                [Uzivatele_Jmeno]
        WHERE
                [Jmeno_ID] != %s', $_SESSION[PREZENTACE_Nazev]['Spravce'], '
');

 

Zápatí