Używamy Doctrine, PHP ORM. Tworzę takie zapytanie:
$q = Doctrine_Query::create()->select('id')->from('MyTable');
a następnie w funkcji dodaję różne klauzule Where i inne odpowiednie rzeczy, jak to
$q->where('normalisedname = ? OR name = ?', array($string, $originalString));
Później, przed wykonaniem execute()
tego obiektu zapytania, chcę wydrukować nieprzetworzony kod SQL, aby go zbadać, i zrobić to:
$q->getSQLQuery();
Jednak powoduje to wydrukowanie tylko przygotowanej instrukcji, a nie całego zapytania. Chcę zobaczyć, co wysyła do MySQL, ale zamiast tego wypisuje przygotowane zestawienie, w tym ?
's. Czy istnieje sposób, aby wyświetlić „pełne” zapytanie?
Odpowiedzi:
Doctrine nie wysyła "prawdziwego zapytania SQL" do serwera bazy danych: w rzeczywistości używa przygotowanych instrukcji, co oznacza:
$query->getSql()
)$query->getParameters()
)Oznacza to, że po stronie PHP nigdy nie ma „prawdziwego” zapytania SQL - więc Doctrine nie może go wyświetlić.
źródło
$query->getParameters();
NIE zwróci parametrów w poprawnej kolejności, tak jak powinny się one pojawić w przygotowanym zapytaniuDziałający przykład:
źródło
Możesz sprawdzić zapytanie wykonane przez Twoją aplikację, jeśli rejestrujesz wszystkie zapytania w mysql:
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
będzie więcej zapytań nie tylko tego, którego szukasz, ale możesz go grepować.
ale zwykle
->getSql();
działaEdytować:
aby wyświetlić wszystkie zapytania mysql, których używam
i dodaj te 2 wiersze:
i zrestartuj mysql
źródło
Stworzyłem Doctrine2 Logger, który robi dokładnie to. "Hydratuje" sparametryzowane zapytanie sql wartościami przy użyciu własnych konwerterów typu danych Doctrine 2.
Przykład użycia :; Poniższy spokój kodu odbija się echem na standardowym wyjściu wszystkich zdań SQL INSERT, UPDATE, DELETE wygenerowanych za pomocą $ em Entity Manager,
źródło
getSqlQuery()
technicznie pokazuje całe polecenie SQL, ale jest o wiele bardziej przydatne, gdy można również zobaczyć parametry.Aby uczynić ten wzorzec łatwiejszym do ponownego użycia, w komentarzach w Raw SQL z Doctrine Query Object opisano przyjemne podejście .
źródło
$q
. Wygląda na to, że nie jest to zapytanie ani narzędzie do tworzenia zapytań.$q
w tym przypadku jest to zapytanie Doctrine 1. Być może używasz Doctrine 2, w takim przypadku będziesz potrzebować czegoś takiego, jak$qb = $this->createQueryBuilder('a'); $q = $qb->getQuery(); $sql = $q->getSQL(); $params = $q->getParameters();
Mam nadzieję, że pomoże!Nie ma innego prawdziwego zapytania, tak działają przygotowane zestawienia. Wartości są powiązane na serwerze bazy danych, a nie w warstwie aplikacji.
Zobacz moją odpowiedź na to pytanie: Jak w PHP z PDO sprawdzić ostateczne sparametryzowane zapytanie SQL?
(Powtórzono tutaj dla wygody :)
źródło
Moje rozwiązanie:
Przykład użycia:
źródło
Możesz łatwo uzyskać dostęp do parametrów SQL, korzystając z następującego podejścia.
Więc jeśli wydrukowałeś
$param_values
i$col_names
, możesz uzyskać wartości parametrów przechodzące przez sql i nazwy odpowiednich kolumn.Uwaga: Jeśli
$param
zwraca tablicę, musisz powtórzyć iterację, ponieważ parametry w środkuIN (:?)
zwykle pojawiają się jako tablica zagnieżdżona.W międzyczasie, jeśli znalazłeś inne podejście, prosimy o podzielenie się z nami :)
Dziękuję Ci!
źródło
Bardziej przejrzyste rozwiązanie:
źródło
źródło
Możesz użyć :
Jeśli używasz MySQL, możesz użyć Workbench do przeglądania uruchomionych instrukcji SQL. Możesz również użyć widoku uruchomionego zapytania z mysql, używając następujących poleceń:
źródło
Może komuś się przyda:
źródło
TL; DR
w swoich plikach twig użyj filtrów pomocników gałązek Doctrine:
Wyjaśnienie:
Inne odpowiedzi, w których wspomina się, że Prepared statement są w rzeczywistości „prawdziwymi zapytaniami”, są prawidłowe, ale nie odpowiadają oczywistym oczekiwaniom pytającego ... Każdy programista chce wyświetlić „wykonalne zapytanie” w celu debugowania (lub wyświetlenia go użytkownikowi) .
Więc przejrzałem źródła profilera Symfony, aby zobaczyć, jak to robią. Za część Doctrine odpowiada Doctrine, więc stworzyli pakiet doktryn do integracji z Symfony. Rzucając okiem na
doctrine-bundle/Resources/views/Collector/db.html.twig
plik, dowiesz się, jak to robią (może się to zmienić w różnych wersjach). Co ciekawe, stworzyli filtry gałązkowe, których możemy użyć ponownie (patrz wyżej).Aby wszystko działało, musimy włączyć rejestrowanie dla naszego zapytania. Można to zrobić na wiele sposobów i tutaj używam DebugStack, który pozwala rejestrować zapytania bez ich drukowania. Zapewnia to również, że będzie działać w trybie produkcyjnym, jeśli tego potrzebujesz ...
Jeśli potrzebujesz dalszego formatowania, zobaczysz, że zawierają one CSS w tagu stylu, więc po prostu go „ukradnij” ^^:
Mam nadzieję, że to pomoże ;-)
źródło
Napisałem prosty logger, który może logować zapytanie z wstawionymi parametrami. Instalacja:
Stosowanie:
źródło
źródło
Zmodyfikowano funkcję @dsamblas, aby działała, gdy parametry są ciągami dat, takimi jak „2019-01-01”, i gdy jest przekazywana tablica przy użyciu IN, takich jak
. Zrób więc wszystko, co napisał dsamblas, ale zamień startQuery na ten lub zobacz różnice i dodaj mój kod. (w przypadku, gdy zmodyfikował coś w swojej funkcji, a moja wersja nie ma modyfikacji).
Nie testowałem dużo.
źródło
Zrobiłem trochę badań na ten temat, ponieważ chciałem zdebugować wygenerowane zapytanie SQL i wykonać je w edytorze sql. Jak widać we wszystkich odpowiedziach, jest to temat wysoce techniczny.
Kiedy zakładam, że początkowe pytanie opiera się na dev-env, w tej chwili brakuje jednej, bardzo prostej odpowiedzi. Możesz po prostu użyć kompilacji w profilerze Symfony. Po prostu kliknij kartę Doctrine, przewiń do zapytania, które chcesz sprawdzić. Następnie kliknij „wyświetl zapytanie do wykonania” i możesz wkleić zapytanie bezpośrednio w edytorze SQL
Bardziej podstawowe podejście do interfejsu użytkownika, ale bardzo szybkie i bez obciążenia związanego z debugowaniem kodu.
źródło
źródło
Aby wydrukować zapytanie SQL w Doctrine, użyj:
źródło