Autor Zpráva
esh
Profil *
Ahoj,

chtěl bych se zeptat zda někdo nevíte jak dostat z dibi čisté sql, které se posílá jako dotaz do databáze ?

napr: $sql = dibi::query(...)->test();, ale tak aby se vypsalo ciste sql bez html znacek

Díky
Tori
Profil
esh:
Podle dibi quick start by poslední provedený dotaz měl být v proměnné dibi::$sql. Háček je v tom, že tyhle ladící proměnné jsou vyplněné jen tehdy, když je nastavené logování do souboru a/nebo Firebug+FirePHP konzole. Dá se to obejít tím, že si nastavíte nějaký callback, který se má volat místo profileru po každém dotazu:
dibi::connect($options);
function foo(DibiEvent $e) { }
dibi::getConnection()->onEvent[] = 'foo';

$result = dibi::query('select * from `table` where id = %i', 1)->fetch();
var_dump($result, dibi::$sql, dibi::$elapsedTime);
V tomto případě ani nemusíte mít profiler povolený. Případně jako onEvent callback můžete využít nějakou statickou třídu, do které se zaznamenají všechny provedené dotazy.
Jan Tvrdík
Profil
esh:
Korektní postup je
$sql = $connection->translate(...);
případně (při statickém přístupu):
$sql = dibi::getConnection()->translate(...);
esh
Profil *
Díky moc za odpovědi,

kukal jsem do zdrojáků dibi a ten příkaz translate se mě zdál jako nejlepší volbou. Nevím co dělám špatně, že dostávám jenom výsledek místo dotazu. Napří:

        $q = dibi::select("name_node")->as("name");
        $q->from("node");
        $q->where('id_node = %i', 1);
        $q->limit(20);
        $q->offset(0);
        print_r(dibi::getConnection()->translate($q));

Výsledek takovéhoto snažení provede sql doaz a vrátí mě již výsledek (název sloupce s id = 1), pokud tedy není zakopaný pes ve fluentoj...
Jan Tvrdík
Profil
esh:
Inspiroval jsi mě k tweetu :)

To, cos napsal, je naprostý nesmysl. Vypadá to, že vůbec netušíš, jak to funguje. Metoda translate netuší nic o existenci třídy DibiFluent. Z DibiFluent sestavený dotaz nijak snadno nedostaneš (pokud jsem tedy něco nepřehlídl).
Tori
Profil
Jan Tvrdík:
Z DibiFluent sestavený dotaz nijak snadno nedostaneš
Tím nekorektním způsobem ano. Taky bych byla ráda, kdyby to šlo nějak nenásilně.

Co bys např. použil ty v situaci, kdy DB dotaz sice neskončí chybou (= nezjistím výsledný dotaz z výjimky), ale prostě jen proti očekávání nevrátí žádná data? (Třeba když použiju inner join místo left a pak někdy někdo smaže odpovídající řádek v připojené tabulce.) Z mého pohledu to je chyba, kterou nutno logovat, ale jak to vysvětlit dibi, když SQL je syntakticky ok?
Jan Tvrdík
Profil
Tori:
Teď mi vůbec není jasné, co řešíš za problém. Nicméně protože používám Nette a mám zapnutý dibi profiler, tak vidím všechny položené SQL dotazy v debugger panelu. Nemám-li Nette, tak ručně zavolám dibi::test(...) (resp. $fluent->test()) a za tím exit.
esh
Profil *
Děkuji, z mé strany je to vyřešené. Udělal jsem nad dibi ještě nadstavbu, můj problém řeší.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: