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.