Jak wydrukować instrukcję SQL w modelu codeigniter

107

Mam w modelu instrukcję sql,

Wtedy mówię

$query = $this->db->query($sql, array(fields, fields1);

if ($query) {
    return true:
} else {
    echo "failed";
    return false;
}

Moje zapytanie zawsze kończy się niepowodzeniem, jak mam skłonić php do wydrukowania dokładnej instrukcji sql wysyłanej do mojej bazy danych? I wyświetl to w moim widoku php, stronie

Technupe
źródło

Odpowiedzi:

124

Aby wyświetlić ciąg zapytania:

print_r($this->db->last_query());    

Aby wyświetlić wynik zapytania:

print_r($query);

Klasa Profiler wyświetli wyniki testów porównawczych, wykonane zapytania i dane $ _POST na dole stron. Aby włączyć profiler, umieść następujący wiersz w dowolnym miejscu w metodach kontrolera:

$this->output->enable_profiler(TRUE);

Przewodnik użytkownika profilowania: https://www.codeigniter.com/user_guide/general/profiling.html

Novo
źródło
7
kiedy robię print_r (zapytanie $); nic nie jest drukowane
Technupe
1
Użyj wbudowanego profilera CI, więcej informacji tutaj
Novo
2
wszystko, czego chcę, to wydrukować instrukcję sql przekazaną do bazy danych, sory, ale profiler też nie pomaga
Technupe
Odwiedź link do przewodnika użytkownika, który opublikowałem, jeśli nie działa, powiedz nam, co się stanie.
Novo
Cóż, pomyślałem, że mój problem, oracle nie akceptuje mojego formatu daty, wypróbowałem każdy format, który myślę, zaakceptuje tylko SYSDATE
Technupe
41

Możesz wyświetlić SQL wygenerowany przez ActiveRecord:

Przed uruchomieniem zapytania:

$this->db->_compile_select(); 

A po uruchomieniu:

$this->db->last_query(); 
pedro
źródło
4
kiedy używam $ this-> db -> _ compile_select (); Otrzymuję błąd krytyczny: wywołanie metody chronionej CI_DB_active_record :: _ compile_select () z
Angelin Nadar
Problem z profilerem nie jest dla mnie dobry, nie wyświetla zapytania, którego chcę, jest zbyt skomplikowane, aby po prostu uzyskać SQL ... To działa dla mnie: - echo $ this-> EE-> db -> _ compile_select ();
Laurence Cope
3
W CI3 użyj $this->db->get_compiled_select()zamiast tego.
Nick Tsai
17

jeśli potrzebujesz szybkiego testu swojego zapytania, to działa świetnie

echo $this->db->last_query(); die;
Programista
źródło
14

Po bezskutecznej próbie użycia _compiled_select()lub get_compiled_select()po prostu wydrukowałem dbobiekt i możesz zobaczyć zapytanie tam we querieswłaściwości.

Spróbuj sam:

var_dump( $this->db );

Jeśli wiesz, że masz tylko jedno zapytanie, możesz je wydrukować bezpośrednio:

echo $this->db->queries[0];
Christian Dechery
źródło
9

Istnieje nowa metoda publiczna, get_compiled_selectktóra może wydrukować zapytanie przed jego uruchomieniem. _compile_selectjest teraz chroniony, dlatego nie można go używać.

echo $this->db->get_compiled_select(); // before $this->db->get();
Naveed
źródło
4
Błąd krytyczny: wywołanie niezdefiniowanej metody CI_DB_mysql_driver :: get_compiled_select ()
itskawsar
9

Możesz po prostu użyć tego na końcu.

echo $this->db->last_query();
Muhammad Sadiq
źródło
2

Ani jedno, last_query()ani get_compiled_select()drugie dla mnie działa, więc niewielka zmiana w kodzie pedro działa dla mnie dobrze. Nie uwzględniaj ->get()w swojej kompilacji, musi to nastąpić przed -> get ()

 echo $this->EE->db->_compile_select();
Laurence Cope
źródło
1

Próbuję odpowiedzieć @ Chumillas i @ chhameed, ale to nie działa, ponieważ sql jest błędne, więc znalazłem nowe podejście, takie jak to:

  • Wstaw echo $sql; flush(); exit;przed return $sql; _compile_selectfunkcjąDB_active_rec.php
Chanble
źródło
0

Dodaj tę linię zaraz po zapytaniu, które chcesz wydrukować.

Przykład:

$ query = $ this-> db-> query ('SELECT * FROM table WHERE condition');

// Dodaj tę linię.

var_dump ($ this-> db-> last_query ());

wyjście();

lub

echo $ this-> db-> last_query ();

larp
źródło
0

Używam xdebug do oglądania tych wartości w VSCode z odpowiednim rozszerzeniem i CI v2.x. Dodaję wyrażenie $this->db->last_query()w sekcji obserwacyjnej i dodaję xdebugSettingswęzeł, taki jak te linie, aby uzyskać wartość nieobciętą w launch.json.

{
  "name": "Launch currently open script",
  "type": "php",
  "request": "launch",
  "program": "${file}",
  "cwd": "${fileDirname}",
  "port": 9000,
  "xdebugSettings": {
    "max_data": -1,
    "max_children": -1
  }
},

I uruchom mój debuger z punktem przerwania, a na koniec po prostu wybierz moje wyrażenie i kliknij prawym przyciskiem myszy> skopiuj wartość.

uescamilla
źródło
-1

Miałem dokładnie ten sam problem i ostatecznie znalazłem rozwiązanie. Moje zapytanie wygląda następująco:

$result = mysqli_query($link,'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC ');

Aby wyświetlić polecenie sql, wszystko, co musiałem zrobić, to utworzyć zmienną ($ resultstring) o dokładnie takiej samej treści jak moje zapytanie, a następnie powtórzyć ją, na przykład:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

To działa!

Mark Janssen
źródło
To nie jest sposób CodeIgnitera.
mickmackusa
-1

służy get_compiled_select()do pobierania zapytania zamiast go zastępować

user2049634
źródło
Proponuję pokazać, jak korzystać z funkcji, którą proponujesz w tym konkretnym przypadku, a nie tylko o niej wspominać. Z poważaniem
YakovL
-2

Przeczytałem tutaj wszystkie odpowiedzi, ale nie mogę

echo $this->db->get_compiled_select();

do pracy, dało mi to błąd w stylu,

Wywołanie metody chronionej CI_DB_active_record :: _ compile_select () z kontekstu 'Witamy' w kontrolerach on-line xx

Więc usunąłem protectedz poniższej linii z pliku \system\database\DB_active_rec.phpi zadziałało

protected function _compile_select($select_override = FALSE)
wirusowy
źródło