sql >> Databáze >  >> RDS >> Mysql

Získání nezpracovaného řetězce dotazu SQL z připravených příkazů PDO

Předpokládám, že máte na mysli, že chcete konečný SQL dotaz s interpolovanými hodnotami parametrů. Chápu, že by to bylo užitečné pro ladění, ale takto připravené příkazy nefungují. Parametry nejsou kombinovány s připraveným příkazem na straně klienta, takže PDO by nikdy nemělo mít přístup k řetězci dotazu kombinovanému s jeho parametry.

Příkaz SQL je odeslán na databázový server, když provádíte Prepare(), a parametry jsou odesílány samostatně, když provádíte provádění(). Obecný protokol dotazů MySQL zobrazuje konečné SQL s hodnotami interpolovanými po spuštění(). Níže je výňatek z mého obecného protokolu dotazů. Spustil jsem dotazy z mysql CLI, ne z PDO, ale princip je stejný.

081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
                2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
                2 Execute     [2] select * from foo where i = 1

Můžete také získat, co chcete, pokud nastavíte atribut PDO PDO::ATTR_EMULATE_PREPARES. V tomto režimu PDO interpoluje parametry do SQL dotazu a odešle celý dotaz, když spustíte(). Toto není skutečně připravený dotaz. Výhody připravených dotazů obejdete interpolací proměnných do řetězce SQL před vykonáním().

Znovu komentář od @afilina:

Ne, textový SQL dotaz není v kombinaci s parametry během provádění. PDO vám tedy nemá co ukázat.

Pokud interně použijete PDO::ATTR_EMULATE_PREPARES, PDO vytvoří kopii dotazu SQL a před provedením přípravy a spuštění do něj interpoluje hodnoty parametrů. Ale PDO nevystavuje tento upravený SQL dotaz.

Objekt PDOStatement má vlastnost $queryString, ale tato je nastavena pouze v konstruktoru pro PDOStatement a není aktualizována, když je dotaz přepsán pomocí parametrů.

Bylo by rozumné, aby PDO požádalo o vystavení přepsaného dotazu. Ale ani to by vám neposkytlo „úplný“ dotaz, pokud nepoužijete PDO::ATTR_EMULATE_PREPARES.

Proto ukazuji výše uvedené řešení použití obecného protokolu dotazů serveru MySQL, protože v tomto případě je na serveru přepsán i připravený dotaz se zástupnými symboly parametrů, přičemž hodnoty parametrů se vyplní do řetězce dotazu. To se však děje pouze během protokolování, nikoli během provádění dotazu.



  1. PostgreSQL JDBC Null String přijatý jako bajt

  2. Filtrování protokolů výstrah v EM13c

  3. Připojení Pythonu k databázi MySQL pomocí konektoru MySQL a příkladu PyMySQL

  4. Jak mohu zajistit, aby byl materializovaný pohled vždy aktuální?