Víc where a SqlLiteral → SQLSTATE[42000]: Syntax error or access violation: 1064
- rfilip
- Člen | 20
Mám následující kod:
$this->selectionfactory->table("teplota")->where("id",$id)
->where( new SqlLiteral('YEAR(datum)'), new SqlLiteral('YEAR(NOW())') )
->where( new SqlLiteral('MONTH(datum)'),new SqlLiteral('MONTH(NOW())') )
->order("datum ASC");
Který mi vygeneruje tento dotaz:
SELECT *
FROM `teplota`
WHERE (`id` = '1') AND (YEAR(`datum`) YEAR(NOW()))
ORDER BY `datum` ASC
Což skončí hláškou:
PDOException #42000
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'YEAR(NOW())) ORDER BY `datum` ASC' at line 1
Snažím se vybrat záznamy z aktuálního měsíce s daným id
V čem dělám chybu?
Předem děkuji Rfilip
Editoval rfilip (25. 7. 2013 17:25)
- hrach
- Člen | 1838
je to cele wtf.
spravne:
->where('YEAR(datum) = YEAR(NOW())')
->where('MONTH(datum) = MONTH(NOW())')
a pokud se sql literal (v teoretickem pripade, kdy by to bylo treba… tady to treba neni) tak
->where('? = ?', new SqlLiteral('YEAR(datum)'), new SqlLiteral('YEAR(NOW())') )
->where('? = ?', new SqlLiteral('MONTH(datum)'),new SqlLiteral('MONTH(NOW())') )
- rfilip
- Člen | 20
Aha, opraveno, ale nastal další problém:
Timhle foreachem to proběhne jen jednou, ačkoliv výš uvedený dotaz vrací
dle laděnky 3 řádky.
Výsledek dotazu je v $mrazak->teploty
{foreach $mrazak->teploty as $mereni}
data.addRow([new Date({$mereni->datum|date: DateTime::RFC2822}),{$mereni->rezim == "1" ? -18 : $mereni->Hi + 2},{$mereni->teplota},{(int)$mereni->Lo},{(int)$mereni->Hi}]);
{/foreach}
Výsledkem má být třikrát tenhle řádek Javascriptu s různými hodnotami:
data.addRow([new Date("Thu, 25 Jul 2013 17:29:16 +0200"),-3,-13.4,-10,-5]);
ale vypíše se jen jednou.
Co mám špatně tentokrát?
Foreach používám běžně bez problémů, ted poprvé s ním mám
problém
- rfilip
- Člen | 20
Ne ta tabulka vůbec nemá primární klíč má jen index:
Posílám strukturu a dump tabulky:
CREATE TABLE IF NOT EXISTS `teplota` (
`id` tinyint(4) NOT NULL,
`teplota` decimal(3,1) NOT NULL,
`datum` datetime NOT NULL,
`Lo` tinyint(4) NOT NULL,
`Hi` tinyint(4) NOT NULL,
`rezim` enum('0','1','AUT','AUT ECO') COLLATE utf8_czech_ci NOT NULL,
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
INSERT INTO `teplota` (`id`, `teplota`, `datum`, `Lo`, `Hi`, `rezim`) VALUES
(1, -23.5, '2013-07-22 14:03:26', -26, -20, '1'),
(1, -22.6, '2013-07-24 14:27:07', -10, -5, 'AUT ECO'),
(1, -13.4, '2013-07-25 17:29:16', -10, -5, 'AUT ECO');
id jen identifikuje na které stanici byly udaje naměřeny a v této tabulce se bude mnohokrát opakovat proto je jen KEY