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

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


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(); 

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;

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];

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();

4
Błąd krytyczny: wywołanie niezdefiniowanej metody CI_DB_mysql_driver :: get_compiled_select ()
itskawsar


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();

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

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 ();


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ść.


-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!


To nie jest sposób CodeIgnitera.
mickmackusa

-1

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


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.