Oznámení
Nefunkční dotaz obsahující funkci FIELD
před 10 lety
- blacksun
- Člen | 181
Ahoj,
narazil jsem na problém s jedním dotazem. Generuji jej pomocí fluent interface tímto kódem (ořezaný o pár podmínek, proto třeba where část na více řádcích):
<?php
$dbShifts = dibi::select('[s.id] as id, [zacatek], [konec], [stroj]');
$dbShifts->select('CAST(GROUP_CONCAT([osoba]) as char) as [osoby]');
$dbShifts->from('[smeny] s');
$dbShifts->join('[obsazenost] o')->on('[s.id] = [o.smena]');
$dbShifts->where('[smazano] = %i',0);
$dbShifts->where('[stroj] IN %l',$machines);
$dbShifts->where('[zacatek] >= %i',$dateFrom);
$dbShifts->where('[konec] <= %i',$dateTo);
$dbShifts->groupBy('[id],[zacatek],[konec],[stroj]');
$dbShifts->orderBy()->field('([stroj],',$machines,')');
$dbShifts->orderBy(array(
'zacatek'=>'d',
'konec'=> 'd',
));
$dbShifts->test();
?>
Dostanu takto složený dotaz, který normálně funguje, pokud jej spustím přes phpMyAdmina:
<?php
SELECT `s`.`id` as id, `zacatek`, `konec`, `stroj` , CAST(GROUP_CONCAT(`osoba`) as char) as `osoby`
FROM `smeny` s JOIN `obsazenost` o ON `s`.`id` = `o`.`smena`
WHERE `smazano` = 0 AND `stroj` IN ('1', '18', '12') AND `zacatek` >= 1259535600 AND `konec` <= 1259794800
GROUP BY `id`,`zacatek`,`konec`,`stroj`
ORDER BY FIELD (`stroj`, '1', '18', '12') , `zacatek` DESC, `konec` DESC
?>
Pokud jej spustím v aplikaci, laděnka zobrazí výjimku DibiDriverException #1305
FUNCTION stroje.FIELD does not exist
File: /var/www/html_testis/dibi/drivers/mysqli.php Line: 157
Nenarazil jste někdo na něco podobného, nenakopnete mě správným směrem? Napadlo mě, že by to mohl být problém mezery před ( u funkce FIELD, přes phpMyAdmina na tom ale nezáleží.
P.S.: Používám PHP verze 5.2.6, dibi latest.
před 10 lety
- blacksun
- Člen | 181
Tak jsem zkusil tvrobu dotazu přepsat pomocí pole, viz kód, dibi::test pak vypíše stejný dotaz s jediným rozdílem a tím je právě absence mezery za slovem FIELD před otvírací závorkou. Takto složený dotaz už bez problémů proběhne.
<?php
$dbS = array();
$dbS[] = 'SELECT [s.id] as [id], [zacatek], [konec], [stroj]';
$dbS[] = ', CAST(GROUP_CONCAT([osoba]) as char) as [osoby]';
$dbS[] = 'FROM [smeny] s';
array_push($dbS, 'JOIN [obsazenost] o ON [s.id] = [o.smena]');
$dbS[] = 'WHERE';
array_push($dbS, '[smazano] = %i',0,'AND [stroj] IN %l',$machines);
array_push($dbS, 'AND [zacatek] >= %i',$dateFrom);
array_push($dbS, 'AND [konec] <= %i',$dateTo);
$dbS[] = 'GROUP BY [id],[zacatek],[konec],[stroj]';
array_push($dbS, 'ORDER BY FIELD([stroj], ',$machines,'), [zacatek] DESC, [konec] DESC');
dibi::test($dbS);
?>