sql >> Database >  >> RDS >> Mysql

Onbewerkte SQL-querystring ophalen uit door PDO voorbereide instructies

Ik neem aan dat je bedoelt dat je de uiteindelijke SQL-query wilt, met daarin geïnterpoleerde parameterwaarden. Ik begrijp dat dit nuttig zou zijn voor het opsporen van fouten, maar het is niet de manier waarop voorbereide instructies werken. Parameters worden niet gecombineerd met een voorbereide instructie aan de clientzijde, dus PDO mag nooit toegang hebben tot de querystring in combinatie met zijn parameters.

De SQL-instructie wordt naar de databaseserver verzonden wanneer u prepare() doet, en de parameters worden afzonderlijk verzonden wanneer u execute(). Het algemene querylogboek van MySQL toont de uiteindelijke SQL met waarden die zijn geïnterpoleerd nadat u execute(). Hieronder vindt u een fragment uit mijn algemene querylogboek. Ik heb de queries uitgevoerd vanuit de mysql CLI, niet vanuit PDO, maar het principe is hetzelfde.

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

U kunt ook krijgen wat u wilt als u het PDO-kenmerk PDO::ATTR_EMULATE_PREPARES instelt. In deze modus interpoleert PDO parameters in de SQL-query en verzendt de hele query wanneer u execute(). Dit is geen echt voorbereide zoekopdracht. U omzeilt de voordelen van voorbereide query's door variabelen in de SQL-string te interpoleren voordat execute().

Re reactie van @afilina:

Nee, de tekstuele SQL-query is niet gecombineerd met de parameters tijdens de uitvoering. Er is dus niets voor PDO om je te laten zien.

Als u PDO::ATTR_EMULATE_PREPARES gebruikt, maakt PDO intern een kopie van de SQL-query en interpoleert daarin parameterwaarden voordat de voorbereiding en uitvoering wordt uitgevoerd. Maar PDO onthult deze gewijzigde SQL-query niet.

Het PDOStatement-object heeft een eigenschap $queryString, maar deze wordt alleen ingesteld in de constructor voor de PDOStatement en wordt niet bijgewerkt wanneer de query wordt herschreven met parameters.

Het zou een redelijk feature request zijn voor PDO om hen te vragen om de herschreven query bloot te leggen. Maar zelfs dat zou je niet de "complete" query geven, tenzij je PDO::ATTR_EMULATE_PREPARES gebruikt.

Dit is de reden waarom ik de bovenstaande tijdelijke oplossing laat zien van het gebruik van het algemene querylogboek van de MySQL-server, omdat in dit geval zelfs een voorbereide query met tijdelijke aanduidingen voor parameters op de server wordt herschreven, waarbij parameterwaarden worden ingevuld in de queryreeks. Maar dit wordt alleen gedaan tijdens het loggen, niet tijdens het uitvoeren van de query.



  1. Vereenvoudig gebruikersaccountbeheer met MariaDB MaxScale 2.2 en MariaDB Server 10.3

  2. Hoe de datum en tijd in SQL Server te formatteren?

  3. Is het mogelijk om de verwerking van offertes in de Postgres COPY-opdracht met CSV-indeling uit te schakelen?

  4. SQL-fout:ORA-02291:integriteitsbeperking