tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

MySQL funkce v klauzuli WHERE

před 10 lety

uestla
Backer | 743

Přeji pěkné odpoledne.

Nevím si rady se zápisem jednoho dotazu – využívám při jeho skládání fluent interface nad dibi::getConnection(). V tabulce mám sloupec datum jako timestamp a chci z tabulky vytáhnout pouze řádky s určitým rokem – následující kód mi nefunguje:

$rok = date('Y');
$akce = dibi::getConnection()
    ->select('*')
    ->from('akce')
    ->where('FROM_UNIXTIME(`datum`, %Y)=%s', $rok)
    ->orderBy('datum')->orderBy('detaily')
    ->execute()
    ->fetchAll();

Dibi mi vyhazuje výjimku „SQL translate error“, bohužel nevím, jak dotaz napsat v dibijštině… Mohl by mi prosím někdo poradit?

Předem děkuji.


PHP Version 5.2.9–2
Dibi 1.3-dev (revision 75ede18 released on 2009–11–26)

před 10 lety

phx
Člen | 652

Myslim si, ze dibi se snazi interpretovat %Y. Spravny zapis asi bude \%Y nebo %%Y.

Pro ladeni doporucuji metodu test(), ktera vypise vysledny dotaz.

před 10 lety

uestla
Backer | 743

phx napsal(a):

Myslim si, ze dibi se snazi interpretovat %Y. Spravny zapis asi bude \%Y nebo %%Y.

Pro ladeni doporucuji metodu test(), ktera vypise vysledny dotaz.

Díky za odpověď – na metodu test() bych málem zapoměl.

EDIT:

Tak nakonec nepomohlo ani zdvojení procenta, ani přidání zpětného lomítka (předchozí příspěvek jsem musel upravit – po smazání cache se problém objevil znovu i se zpětným lomítkem).

EDIT 2:
Dibi překladač vypisuje:

SELECT *
FROM `akce`
WHERE FROM_UNIXTIME(`datum`, \**Unknown or invalid modifier %Y**)='ORDER BY' `datum` , `detaily`

Problém tedy bude jak psal phx výše v modifikátoru %Y. Dá se vůbec nějak escapovat?

Editoval uestla (19. 12. 2009 17:45)

před 10 lety

uestla
Backer | 743

Šmankote, chyba je v tomhle případě zcela na mojí straně!

Jak „normálně“, tak v dibi je druhým argumentem funkce FROM_UNIXTIME řetězec, je ho tedy nutno zapsat mezi apostrofy/uvozovky! Pak už ho dibi nijak nepřekládá. Zde je tedy již funkční kód:

$rok = date('Y');
$akce = dibi::getConnection()
        ->select('*')
        ->from('akce')
        ->where('FROM_UNIXTIME(`datum`, "%Y")=%s', $rok)
        ->orderBy('datum')->orderBy('detaily')
        ->execute()
        ->fetchAll();