Víc where a SqlLiteral → SQLSTATE[42000]: Syntax error or access violation: 1064

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
rfilip
Člen | 20
+
0
-

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)

rfilip
Člen | 20
+
0
-

Nakonec jsem to rozchodil s následujícím kodem:

$this->selectionfactory->table("teplota")->where("id",$id)
	->where(new SqlLiteral('(YEAR(datum)=YEAR(NOW())) AND (MONTH(datum) = MONTH(NOW()))'))
	->order("datum ASC");
hrach
Člen | 1838
+
0
-

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
+
0
-

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

hrach
Člen | 1838
+
0
-

Rekl bych, ze tam mas nejak divne primary klice, je to mozne?

rfilip
Člen | 20
+
0
-

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

hrach
Člen | 1838
+
0
-

a jakou pouzivas reflection?

rfilip
Člen | 20
+
0
-

Nevím, asi tu výchozí, slyším o nich poprvý, aplikaci stavím na sandboxu.