tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Chybné escapování vnořeného selectu

před 7 lety

2bfree
Člen | 245
+
0
-

Vytvořil jsem následující php dotaz

$this->dibi
    ->select('unnest([a.friends])')->as('fb_uid')
    ->from('[schema.tabulka]')->as('a')
    ->where('[a.fb_uid] = %s','123456789')->test();

a dibi pro PostgreSQL správně vrátilo

/--sql
SELECT unnest(„a“.„friends“) AS „fb_uid“
FROM „schema“.„tabulka“ AS „a“
WHERE „a“.„fb_uid“ = ‚123456789‘
\--

Jakmile jsem však dle návodu znořil select, najednou to jakoby zapomnělo na postgre a začalo escapovat apostrofy

$this->dibi
    ->select(
        $this->dibi
            ->select('unnest([a.friends])')->as('fb_uid')
            ->from('[schema.tabulka]')->as('a')
            ->where('[a.fb_uid] = %s','123456789')
    )->test();

a vysledek

/--sql
SELECT (
SELECT unnest(‚a‘.‚friends‘) AS ‚fb_uid‘
FROM ‚schema‘.‚tabulka‘ AS ‚a‘
WHERE ‚a‘.‚fb_uid‘ = ‚123456789‘)
\--

před 7 lety

2bfree
Člen | 245
+
0
-

Chyba bude pravděpodobně v DibiTranslator.php v části

case 'sql': // preserve as dibi-SQL  (TODO: leave only %ex)
case 'SQL': // preserve as real SQL (TODO: rename to %sql)

Tedy dočasný workaround je díky nezdokumentovanému %SQL n8sledovný:

$this->dibi
        ->select('%SQL',$this->dibi
                        ->select('unnest([a.friends])')->as('fb_uid')
                        ->from('[schema.tabulka]')->as('a')
                        ->where('[a.fb_uid] = %s','123456789')->__toString()
        )->test();

Editoval 2bfree (9. 5. 2012 13:05)