Cara mencetak pernyataan SQL dalam model codeigniter

107

Saya memiliki pernyataan sql dalam model saya,

Saya kemudian berkata

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

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

Permintaan saya selalu gagal, bagaimana cara mendapatkan php untuk mencetak pernyataan sql yang tepat yang dikirim ke database saya? Dan tampilkan itu di tampilan php saya, halaman

Technupe
sumber

Jawaban:

124

Untuk menampilkan string kueri:

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

Untuk menampilkan hasil query:

print_r($query);

Kelas Profiler akan menampilkan hasil benchmark, kueri yang telah Anda jalankan, dan data $ _POST di bagian bawah halaman Anda. Untuk mengaktifkan profiler, letakkan baris berikut di mana saja dalam metode Controller Anda:

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

Panduan pengguna profil: https://www.codeigniter.com/user_guide/general/profiling.html

Novo
sumber
7
ketika saya melakukan print_r ($ query); tidak ada yang tercetak sama sekali
Technupe
1
Gunakan CI built in profiler, info lebih lanjut di sini
Novo
2
yang ingin saya lakukan hanyalah mencetak pernyataan sql yang diteruskan ke database, sory tetapi profiler tidak banyak membantu
Technupe
Kunjungi tautan panduan pengguna yang saya posting, jika tidak berfungsi, beri tahu kami apa yang terjadi.
Novo
Yah saya pikir masalah saya, oracle tidak menerima format tanggal saya, ive mencoba semua format yang saya pikir, itu hanya akan menerima SYSDATE
Technupe
41

Anda dapat menampilkan SQL yang dihasilkan ActiveRecord:

Sebelum kueri dijalankan:

$this->db->_compile_select(); 

Dan setelah itu berjalan:

$this->db->last_query(); 
pedro
sumber
4
ketika saya menggunakan $ this-> db -> _ compile_select (); saya mendapatkan kesalahan Fatal: Panggilan ke metode dilindungi CI_DB_active_record :: _ compile_select () dari
Angelin Nadar
Hal profiler tidak baik untuk saya, tidak menunjukkan query yang saya inginkan, terlalu rumit untuk hanya mendapatkan SQL ... Ini bekerja untuk saya: - echo $ this-> EE-> db -> _ compile_select ();
Laurence Cope
3
Di CI3, Gunakan $this->db->get_compiled_select()sebagai gantinya.
Nick Tsai
17

jika Anda memerlukan pengujian cepat atas kueri Anda, ini sangat cocok untuk saya

echo $this->db->last_query(); die;
Programmer
sumber
14

Setelah mencoba tanpa hasil untuk menggunakan _compiled_select()atau get_compiled_select()saya baru saja mencetak dbobjek, dan Anda dapat melihat kueri di sanaqueries properti.

Cobalah sendiri:

var_dump( $this->db );

Jika Anda tahu Anda hanya memiliki satu kueri, Anda dapat mencetaknya secara langsung:

echo $this->db->queries[0];
Christian Dechery
sumber
9

Ada metode publik baru get_compiled_selectyang dapat mencetak kueri sebelum menjalankannya. _compile_selectsekarang dilindungi oleh karena itu tidak dapat digunakan.

echo $this->db->get_compiled_select(); // before $this->db->get();
Naveed
sumber
4
Kesalahan fatal: Panggilan ke metode yang tidak ditentukan CI_DB_mysql_driver :: get_compiled_select ()
itskawsar
9

Anda cukup menggunakan ini di akhir ..

echo $this->db->last_query();
Muhammad Sadiq
sumber
2

Tidak ada last_query()atau tidak get_compiled_select()berfungsi untuk saya, jadi sedikit perubahan kode pedro berhasil untuk saya. Jangan sertakan ->get()dalam build Anda, ini harus sebelum -> get ()

 echo $this->EE->db->_compile_select();
Laurence Cope
sumber
1

Saya mencoba untuk jawaban @ Chumillas dan jawaban @ chhameed, tetapi tidak berhasil, karena sql-nya salah, jadi saya menemukan pendekatan baru, seperti ini:

  • Masukkan echo $sql; flush(); exit;ke dalam return $sql; _compile_selectfungsi sebelumDB_active_rec.php
Chanble
sumber
0

Tambahkan baris ini tepat setelah kueri yang ingin Anda cetak.

Contoh:

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

// Tambahkan baris ini.

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

keluar();

atau

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

larp
sumber
0

Saya menggunakan xdebug untuk melihat nilai-nilai ini di VSCode dengan ekstensi masing-masing dan CI v2.x. Saya menambahkan ekspresi $this->db->last_query()di bagian arloji, dan saya menambahkan xdebugSettingssimpul seperti baris ini untuk mendapatkan nilai non-pemotongan di launch.json.

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

Dan jalankan debuger saya dengan breakpoint dan terakhir pilih ekspresi saya dan klik kanan> salin nilai.

uescamilla.dll
sumber
-1

Saya memiliki masalah yang persis sama dan akhirnya menemukan solusinya. Kueri saya berjalan seperti:

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

Untuk menampilkan perintah sql, yang harus saya lakukan adalah membuat variabel ($ resultstring) dengan konten yang sama persis dengan kueri saya dan kemudian menggemakannya, seperti ini:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

Berhasil!

Mark Janssen
sumber
Ini bukan cara CodeIgniter.
mickmackusa
-1

gunakan get_compiled_select()untuk mengambil kueri alih-alih menggantinya

pengguna2049634
sumber
Saya menyarankan untuk menunjukkan bagaimana menggunakan fungsi yang Anda usulkan dalam kasus khusus ini, tidak hanya menyebutkannya. Salam
YakovL
-2

Saya membaca semua jawaban di sini, tetapi tidak bisa

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

bekerja, Ini memberi saya kesalahan seperti,

Panggilan ke metode yang dilindungi CI_DB_active_record :: _ compile_select () dari konteks 'Selamat datang' di pengontrol pada baris xx

Jadi saya menghapus protecteddari baris di bawah ini dari file \system\database\DB_active_rec.phpdan berhasil

protected function _compile_select($select_override = FALSE)
virus
sumber