tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

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