Przed przejściem na PDO tworzyłem zapytania SQL w PHP, łącząc ciągi znaków. Jeśli wystąpił błąd składni bazy danych, mogłem po prostu powtórzyć końcowy ciąg zapytania SQL, wypróbować go samodzielnie w bazie danych i poprawić go, aż naprawię błąd, a następnie wstawić go z powrotem do kodu.
Przygotowane wyciągi PDO są szybsze, lepsze i bezpieczniejsze, ale przeszkadza mi jedno: nigdy nie widzę końcowego zapytania, gdy jest wysyłane do bazy danych. Kiedy otrzymuję błędy dotyczące składni w moim dzienniku Apache lub niestandardowym pliku dziennika (rejestruję błędy w catch
bloku), nie widzę zapytania, które je spowodowało.
Czy istnieje sposób na przechwycenie całego zapytania SQL wysłanego przez PDO do bazy danych i zapisanie go do pliku?
/var/log/mysql/*
. Parametry związane z PDO nie mogą powodować błędów składniowych, więc wszystko, czego potrzebujesz, to przygotowane zapytanie SQL.var_dump($pdo_instance->debugDumpParams())
Odpowiedzi:
Ty to mówisz :
Cóż, właściwie w przypadku korzystania z przygotowanych instrukcji nie ma czegoś takiego jak „ ostateczne zapytanie ” :
A więc odpowiadając na twoje pytanie:
Nie: ponieważ nigdzie nie ma „ pełnego zapytania SQL ”, nie ma możliwości jego przechwycenia.
Najlepszą rzeczą, jaką możesz zrobić dla celów debugowania, jest „rekonstruowanie” „prawdziwego” zapytania SQL, poprzez wstrzyknięcie wartości do ciągu SQL instrukcji.
To, co zwykle robię w tego typu sytuacjach, to:
var_dump
(lub odpowiednika) tuż po, aby wyświetlić wartości parametrówNie jest to świetne, jeśli chodzi o debugowanie - ale taka jest cena przygotowanych wyciągów i korzyści, jakie niosą.
źródło
Szukam w logu bazy danych
Chociaż Pascal MARTIN ma rację, że PDO nie wysyła od razu całego zapytania do bazy danych, sugestia ryeguy , aby użyć funkcji logowania bazy danych, faktycznie pozwoliła mi zobaczyć całe zapytanie jako złożone i wykonane przez bazę danych.
Oto jak: (Te instrukcje dotyczą MySQL na komputerze z systemem Windows - Twój przebieg może się różnić)
my.ini
w[mysqld]
sekcji dodajlog
polecenie, na przykładlog="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"
Ten plik będzie się szybko rozwijał, więc pamiętaj, aby go usunąć i wyłączyć rejestrowanie po zakończeniu testów.
źródło
PDO::ATTR_EMULATE_PREPARES
. Zobacz tę odpowiedź, aby uzyskać więcej informacji: stackoverflow.com/questions/10658865/#answer-10658929general_log
zamiastlog
. Zobacz dev.mysql.com/doc/refman/5.5/en/query-log.htmlPewnie, że możesz debugować w tym trybie.
{{ PDO::ATTR_ERRMODE }}
Po prostu dodaj nową linię przed zapytaniem, a zobaczysz linie debugowania.źródło
->query
używając przygotowanych instrukcji?Prawdopodobnie to, co chcesz zrobić, to użyć debugDumpParams () na uchwycie instrukcji. Możesz to uruchomić w dowolnym momencie po powiązaniu wartości z przygotowanym zapytaniem (bez konieczności
execute()
wykonywania instrukcji).Nie buduje przygotowanego zestawienia dla Ciebie, ale pokaże Twoje parametry.
źródło
Stary post, ale być może ktoś uzna to za przydatne;
źródło
Oto funkcja pozwalająca zobaczyć, jaki będzie efektywny SQL, zaadaptowana na podstawie komentarza „Mark” na php.net :
źródło
str_replace(":$k" ....
? Indeksy asocjacyjne już mają to w tablicy $ params.:name_long
się:name
. Przynajmniej jeśli:name
nastąpi wcześniej:name_long
. Instrukcje przygotowane przez MySQL mogą sobie z tym poradzić, więc nie daj się zmylić.Nie. Zapytania PDO nie są przygotowywane po stronie klienta. PDO po prostu wysyła zapytanie SQL i parametry do serwera bazy danych. Baza danych jest tym, co podstawia (z
?
's). Masz dwie możliwości:źródło
prawie nic nie zostało powiedziane o wyświetlaniu błędów poza sprawdzaniem dzienników błędów, ale istnieje dość przydatna funkcja:
( link do źródła )
jasne jest, że ten kod można zmodyfikować, aby był używany jako komunikat o wyjątku lub do innego rodzaju obsługi błędów
źródło
na przykład masz to oświadczenie pdo:
teraz możesz uzyskać wykonane zapytanie, definiując tablicę w następujący sposób:
źródło
));
powinno być);
(tylko jeden okrągły nawias).Szukając w Internecie, uznałem to za akceptowalne rozwiązanie. Zamiast funkcji PDO używana jest inna klasa, a funkcje PDO są wywoływane przez wywołania funkcji magicznych. Nie jestem pewien, czy stwarza to poważne problemy z wydajnością. Można go jednak używać do czasu dodania sensownej funkcji rejestrowania do PDO.
Tak więc zgodnie z tym wątkiem możesz napisać opakowanie dla połączenia PDO, które może rejestrować i zgłaszać wyjątek, gdy pojawi się błąd.
Oto prosty przykład:
więc możesz użyć tej klasy zamiast PDOStatement:
Tutaj wspomniana implementacja dekoratora PDO:
źródło
Aby zalogować MySQL w WAMP , musisz edytować plik my.ini (np. W wamp \ bin \ mysql \ mysql5.6.17 \ my.ini)
i dodaj do
[mysqld]
:źródło
Oto funkcja, którą wykonałem, aby zwrócić zapytanie SQL z „rozwiązanymi” parametrami.
Zakładając, że wykonasz w ten sposób
Ta funkcja NIE dodaje cytatów do zapytań, ale wykonuje to za mnie.
źródło
Problem, który miałem z rozwiązaniem do przechwytywania wyjątków PDO do celów debugowania polega na tym, że wychwycił on tylko wyłączenia PDO (duh), ale nie przechwycił błędów składniowych, które zostały zarejestrowane jako błędy php (nie jestem pewien, dlaczego tak jest, ale „ dlaczego ”nie ma znaczenia dla rozwiązania). Wszystkie moje wywołania PDO pochodzą z jednej klasy modelu tabeli, którą rozszerzyłem dla wszystkich moich interakcji ze wszystkimi tabelami ... to skomplikowane rzeczy, gdy próbowałem debugować kod, ponieważ błąd zarejestrowałby wiersz kodu php, w którym znajdowało się moje wywołanie wykonania zadzwonił, ale nie powiedział mi, skąd właściwie dzwoni. Użyłem poniższego kodu, aby rozwiązać ten problem:
Tak więc powyższy kod wyłapuje ZARÓWNO wyjątki PDO ORAZ błędy składniowe php i traktuje je w ten sam sposób. Mój program obsługi błędów wygląda mniej więcej tak:
Jeśli ktoś ma lepszy pomysł, jak uzyskać odpowiednie informacje do mojego modułu obsługi błędów niż ustawienie modelu tabeli jako zmiennej globalnej, byłbym szczęśliwy, słysząc to i edytując swój kod.
źródło
ten kod działa świetnie dla mnie:
Nie zapomnij zastąpić $ data i $ query swoimi nazwami
źródło
używam tej klasy do debugowania PDO (z Log4PHP )
źródło
Stworzyłem nowoczesny projekt / repozytorium ładowane przez Composer dla dokładnie tego tutaj:
pdo-debug
Znajdź stronę główną projektu na GitHub tutaj , zobacz post na blogu wyjaśniający to tutaj . Jedna linia do dodania w pliku composer.json, a następnie możesz jej używać w następujący sposób:
$ sql to nieprzetworzona instrukcja SQL, $ parameters to tablica twoich parametrów: klucz to nazwa symbolu zastępczego („: user_id”) lub numer nienazwanego parametru („?”), wartość to… cóż, wartość.
Logika stojąca za: ten skrypt po prostu oceni parametry i zamieni je na dostarczony ciąg SQL. Super proste, ale super skuteczne w 99% przypadków użycia. Uwaga: jest to tylko podstawowa emulacja, a nie prawdziwy debugowanie PDO (ponieważ nie jest to możliwe, ponieważ PHP wysyła surowy kod SQL i parametry do oddzielnego serwera MySQL).
Wielkie podziękowania dla bigwebguy i Mike'a z wątku StackOverflow Pobieranie surowego ciągu zapytania SQL z PDO za napisanie w zasadzie całej głównej funkcji tego skryptu. Big up!
źródło
Jak debugować zapytania bazy danych mysql PDO w Ubuntu
TL; DR Rejestruj wszystkie swoje zapytania i śledź dziennik mysql.
Te wskazówki dotyczą mojej instalacji Ubuntu 14.04. Wydaj polecenie,
lsb_release -a
aby pobrać swoją wersję. Twoja instalacja może wyglądać inaczej.Włącz logowanie mysql
cd /etc/mysql
. Powinieneś zobaczyć plik o nazwiemy.cnf
. To plik, który zamierzamy zmienić.cat my.cnf | grep general_log
. To filtrujemy.cnf
plik za Ciebie. Powinieneś zobaczyć dwa wpisy:#general_log_file = /var/log/mysql/mysql.log
&&#general_log = 1
.sudo service mysql restart
.sudo service nginx restart
.Dobra robota! Wszystko gotowe. Teraz wszystko, co musisz zrobić, to dostosować plik dziennika, aby zobaczyć zapytania PDO, które tworzy Twoja aplikacja w czasie rzeczywistym.
Dostosuj dziennik, aby zobaczyć swoje zapytania
Wpisz to cmd
tail -f /var/log/mysql/mysql.log
.Twój wynik będzie wyglądał mniej więcej tak:
Wszelkie nowe zapytania wysyłane przez Twoją aplikację będą automatycznie wyświetlane , o ile będziesz kontynuować śledzenie dziennika. Aby wyjść z ogona, uderz
cmd/ctrl c
.Uwagi
truncate --size 0 mysql.log
.Kredyt i podziękowania
Ogromne okrzyki do odpowiedzi Nathana Longa powyżej, aby inspo odkryło to w Ubuntu. Również dikirill za jego komentarz do posta Nathana, który doprowadził mnie do tego rozwiązania.
Uwielbiam Twój stackoverflow!
źródło
W środowisku Debian NGINX wykonałem następujące czynności.
Przejdź do
/etc/mysql/mysql.conf.d
edycji,mysqld.cnf
jeśli znajdzieszlog-error = /var/log/mysql/error.log
poniżej następujące 2 wiersze.Aby zobaczyć dzienniki, przejdź do
/var/log/mysql
itail -f mysql.log
Pamiętaj, aby skomentować te linie, gdy skończysz debugowanie, jeśli jesteś w środowisku produkcyjnym, usuń,
mysql.log
ponieważ ten plik dziennika szybko się rozrośnie i może być ogromny.źródło