tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

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

před 8 lety

Václav M.
Člen | 34

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.

před 8 lety

Milo
Nette Core | 1119

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

před 8 lety

Václav M.
Člen | 34

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?

před 8 lety

HosipLan
Moderator | 4693

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

před 8 lety

Václav M.
Člen | 34

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)

před 8 lety

HosipLan
Moderator | 4693

před 8 lety

Václav M.
Člen | 34

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

před 8 lety

Milo
Nette Core | 1119

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'], '
');