Mysql
 sql >> база данни >  >> RDS >> Mysql

Получаване на необработен низ за SQL заявка от подготвени оператори на PDO

Предполагам, че имате предвид, че искате окончателната SQL заявка, със стойности на параметри, интерполирани в нея. Разбирам, че това би било полезно за отстраняване на грешки, но не е начинът, по който работят подготвените оператори. Параметрите не се комбинират с подготвен оператор от страна на клиента, така че PDO никога не трябва да има достъп до низа на заявката, комбиниран с неговите параметри.

SQL операторът се изпраща на сървъра на базата данни, когато правите подготовка(), а параметрите се изпращат отделно, когато правите execute(). Общият дневник на заявките на MySQL показва окончателния SQL със стойности, интерполирани, след като изпълните(). По-долу е извадка от моя общ дневник на заявките. Изпълних заявките от mysql CLI, а не от PDO, но принципът е същият.

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

Можете също да получите това, което искате, ако зададете PDO атрибута PDO::ATTR_EMULATE_PREPARES. В този режим PDO интерполира параметрите в SQL заявката и изпраща цялата заявка, когато изпълнявате(). Това не е истинска подготвена заявка. Ще заобиколите предимствата на подготвените заявки, като интерполирате променливи в SQL низа преди execute().

Повторен коментар от @afilina:

Не, текстовата SQL заявка е не комбинирани с параметрите по време на изпълнение. Така че няма какво да ви покаже PDO.

Вътрешно, ако използвате PDO::ATTR_EMULATE_PREPARES, PDO прави копие на SQL заявката и интерполира стойностите на параметрите в нея, преди да извърши подготовката и изпълнението. Но PDO не разкрива тази модифицирана SQL заявка.

Обектът PDOStatement има свойство $queryString, но това е зададено само в конструктора за PDOStatement и не се актуализира, когато заявката е пренаписана с параметри.

Би било разумно изискване за функция PDO да ги помоли да разкрият пренаписаната заявка. Но дори и това няма да ви даде "пълната" заявка, освен ако не използвате PDO::ATTR_EMULATE_PREPARES.

Ето защо показвам заобикалянето по-горе при използването на общия регистър на заявките на MySQL сървъра, тъй като в този случай дори подготвена заявка с заместващи параметри се пренаписва на сървъра, като стойностите на параметрите се запълват обратно в низа на заявката. Но това се прави само по време на регистриране, а не по време на изпълнение на заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. phpMyBackupPro – Уеб базиран инструмент за архивиране на MySQL за Linux

  2. Производителност на пакетно вмъкване на JDBC

  3. Извличане на последния вмъкнат идентификатор с Mysql

  4. Не може да се свърже със сървър на база данни (работна маса на mysql)

  5. Коригирайте „ГРЕШКА 1136 (21S01):Броят на колоните не съвпада с броя на стойностите на ред 2“, когато използвате инструкцията VALUES в MySQL