tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Nesprávne ošetrenie identifikátora (databázového objektu)

před 9 lety

slapo
Člen | 23

Dobrý deň,

mám takúto query:

WITH RECURSIVE user_privileges AS (
    SELECT
        ur1."id",
        ur1.id_user_parent,
        ur1.login,
        1 AS sort_order
    FROM
        "[user"] ur1
    WHERE
        ur1.login='guest'
    UNION
    SELECT
        ur2."id",
        ur2.id_user_parent,
        ur2.login,
        2 AS sort_order
    FROM
        "[user"] ur2
        JOIN
        user_privileges ups1
        ON(ur2.id_user_parent=ups1."id" OR ur2."id"=ups1.id_user_parent)
    WHERE
        ur2.login<>'guest'
)
SELECT
    *
FROM
    user_privileges
ORDER BY
    sort_order,
    "id",
    "id_user_parent"
;

ktorá je výsledkom volania dibi::test($sql, UserModel::$user_login, UserModel::$user_login), kde $sql je:

$sql = '
WITH RECURSIVE user_privileges AS (
    SELECT
        ur1.[id],
        ur1.id_user_parent,
        ur1.login,
        1 AS sort_order
    FROM
        [' . self::TABLE_USERS . '] ur1
    WHERE
        ur1.login=%s
    UNION
    SELECT
        ur2.[id],
        ur2.id_user_parent,
        ur2.login,
        2 AS sort_order
    FROM
        [' . self::TABLE_USERS . '] ur2
        JOIN
        user_privileges ups1
        ON(ur2.id_user_parent=ups1.[id] OR ur2.[id]=ups1.id_user_parent)
    WHERE
        ur2.login<>%s
)
SELECT
    *
FROM
    user_privileges
ORDER BY
    sort_order,
    [id],
    [id_user_parent]
';

a hodnota UserModel::$user_login je guest.

Problém je, že Dibi neprepíše [user] na "user", ako je treba, ale na "[user"].

Pri použití %n v $sql namiesto [user], dostanem "[user]" namiesto "user" (vtedy volám dibi::test($sql, self::TABLE_USERS, UserModel::$user_login, self::TABLE_USERS, UserModel::$user_login)). V tomto prípade dostanem výnimku SQL translate error.

Databáza: PostgreSQL.
Dibi: Dibi 1.3-dev (revision 550be3b released on 2010–04–06).

Myslím, že by to mohla byť chyba v Dibi. Môže niekto potvrdiť?
Ako by sa dala obísť alebo ako by to išlo spraviť inak?

Z nejakého dôvodu som to asi dal do zlého (pod)fóra, moderátori, prosím prehoďte to do Řešení potíží. Zdá sa, že sám to zmeniť nemôžem.

Editoval slapo (14. 4. 2010 15:12)

před 9 lety

slapo
Člen | 23

Nepodarilo sa mi to nijako obísť, vytvoril som issue na https://github.com/…/dibi/issues#… .

před 9 lety

David Grudl
Nette Core | 6806

To "[user"] je skutečně správně?

před 9 lety

slapo
Člen | 23

David Grudl napsal(a):

To "[user"] je skutečně správně?

Práve to je tá chyba, má to byť len "user".

Ak ale myslíte, či to je správne prepísané, tak áno, je.

Editoval slapo (24. 5. 2010 14:48)

před 9 lety

David Grudl
Nette Core | 6806

Co je obsahem self::TABLE_USERS?

Každopádně pro vkládání identifikátorů existuje modifikátor %n, takže spíš než ... FROM [' . self::TABLE_USERS . '] ur1 ... by tam mělo být ... FROM %n ur1', self::TABLE_USERS, '...

před 9 lety

slapo
Člen | 23

David Grudl napsal(a):

Co je obsahem self::TABLE_USERS?

Každopádně pro vkládání identifikátorů existuje modifikátor %n, takže spíš než ... FROM [' . self::TABLE_USERS . '] ur1 ... by tam mělo být ... FROM %n ur1', self::TABLE_USERS, '...

Obsahom self::TABLE_USERS je reťazec user.
Modifikátor %n som skúšal použiť, ale neúspešne. Popis chyby pri použití identifikátora %n je v prvom poste v tomto vlákne.

před 9 lety

David Grudl
Nette Core | 6806

Můžeš mi ten kód poslat emailem?