วิธีการพิมพ์คำสั่ง SQL ในแบบจำลอง Codeigniter


107

ฉันมีคำสั่ง sql ในโมเดลของฉัน

ฉันก็พูด

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

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

แบบสอบถามของฉันมักจะล้มเหลวฉันจะให้ php พิมพ์คำสั่ง sql ถูกส่งไปยังฐานข้อมูลของฉันได้อย่างไร และแสดงสิ่งนั้นในมุมมอง php ของฉันหน้า

คำตอบ:


125

ในการแสดงสตริงการสืบค้น:

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

ในการแสดงผลการสืบค้น:

print_r($query);

Profiler Class จะแสดงผลการเปรียบเทียบการสืบค้นที่คุณเรียกใช้และข้อมูล $ _POST ที่ด้านล่างของหน้าของคุณ ในการเปิดใช้งานผู้สร้างโปรไฟล์ให้วางบรรทัดต่อไปนี้ไว้ที่ใดก็ได้ภายในวิธีการควบคุมของคุณ:

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

คู่มือการใช้โปรไฟล์: https://www.codeigniter.com/user_guide/general/profiling.html


7
เมื่อฉันพิมพ์ print_r ($ query); ไม่มีอะไรพิมพ์ออกมาเลย
Technupe

1
ใช้ CI ในตัวสร้างโปรไฟล์ข้อมูลเพิ่มเติมที่นี่
พ.ย.

2
สิ่งที่ฉันต้องการทำคือพิมพ์คำสั่ง sql ที่ส่งไปยังฐานข้อมูล sory แต่ profiler ก็ไม่ได้ช่วยอะไรมากนัก
Technupe

ไปที่ลิงก์คู่มือผู้ใช้ที่ฉันโพสต์ไว้หากใช้งานไม่ได้โปรดแจ้งให้เราทราบว่าเกิดอะไรขึ้นแทน
พ.ย.

ฉันคิดว่าปัญหาของฉัน oracle ไม่ยอมรับรูปแบบวันที่ของฉัน ive พยายามทุกรูปแบบที่ฉันคิดว่าจะยอมรับเฉพาะ SYSDATE
Technupe


41

คุณสามารถแสดง ActiveRecord สร้าง SQL:

ก่อนที่ข้อความค้นหาจะทำงาน:

$this->db->_compile_select(); 

และหลังจากทำงานแล้ว:

$this->db->last_query(); 

4
เมื่อฉันใช้ $ this-> db -> _ compile_select (); ฉันได้รับข้อผิดพลาดร้ายแรง: เรียกใช้เมธอดที่ได้รับการป้องกัน CI_DB_active_record :: _ compile_select () จาก
Angelin Nadar

สิ่งที่สร้างโปรไฟล์ไม่ดีสำหรับฉันไม่แสดงแบบสอบถามที่ฉันต้องการมันซับซ้อนกว่าที่จะรับ SQL ... สิ่งนี้เหมาะกับฉัน: - echo $ this-> EE-> db -> _ compile_select ();
Laurence Cope

3
ใน CI3 ใช้$this->db->get_compiled_select()แทน
Nick Tsai


14

หลังจากลองใช้งานโดยไม่ประสบความสำเร็จ_compiled_select()หรือget_compiled_select()ฉันเพิ่งพิมพ์dbวัตถุและคุณสามารถดูข้อความค้นหาที่นั่นในqueriesคุณสมบัติ

ลองด้วยตัวคุณเอง:

var_dump( $this->db );

หากคุณรู้ว่าคุณมีเพียงแบบสอบถามเดียวคุณสามารถพิมพ์ได้โดยตรง:

echo $this->db->queries[0];

9

มีวิธีการสาธารณะแบบใหม่get_compiled_selectที่สามารถพิมพ์แบบสอบถามก่อนที่จะเรียกใช้ _compile_selectขณะนี้ได้รับการป้องกันจึงไม่สามารถใช้งานได้

echo $this->db->get_compiled_select(); // before $this->db->get();

4
ข้อผิดพลาดร้ายแรง: เรียกใช้เมธอดที่ไม่ได้กำหนด CI_DB_mysql_driver :: get_compiled_select ()
itskawsar


2

ค่าlast_query()หรือget_compiled_select()การทำงานสำหรับฉันดังนั้นการเปลี่ยนแปลงเล็กน้อยของรหัส pedro ของการทำงานสำหรับฉันเพียงแค่ปรับ ไม่รวม->get()ในบิลด์ของคุณต้องอยู่ก่อน -> get ()

 echo $this->EE->db->_compile_select();

1

ฉันพยายามหาคำตอบของ @ ชูมิลลาสและคำตอบของ @ chhameed แต่ไม่ได้ผลเพราะ sql ผิดดังนั้นฉันจึงพบแนวทางใหม่ดังนี้:

  • ใส่echo $sql; flush(); exit;ก่อนreturn $sql; _compile_selectฟังก์ชันของDB_active_rec.php

1

เพิ่มบรรทัดนี้หลังแบบสอบถามที่คุณต้องการพิมพ์

ตัวอย่าง:

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

// แอดไลน์นี้.

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

ทางออก ();

หรือ

ก้อง $ this-> db-> last_query ();


0

ฉันใช้ xdebug เพื่อดูค่านี้ใน VSCode พร้อมส่วนขยายตามลำดับและ CI v2.x ฉันเพิ่มประสบการณ์$this->db->last_query()ในส่วนนาฬิกาและฉันเพิ่มxdebugSettingsโหนดเช่นบรรทัดเหล่านี้เพื่อรับค่าที่ไม่ตัดทอนใน launch.json

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

และเรียกใช้ดีบักเกอร์ของฉันด้วยเบรกพอยต์และในที่สุดก็เลือกประสบการณ์ของฉันแล้วคลิกขวา> คัดลอกค่า


-1

ฉันมีปัญหาเดียวกันและพบวิธีแก้ปัญหาในที่สุด ข้อความค้นหาของฉันทำงานเหมือน:

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

ในการแสดงคำสั่ง sql สิ่งที่ฉันต้องทำคือสร้างตัวแปร ($ resultstring) ที่มีเนื้อหาเดียวกับข้อความค้นหาของฉันแล้วจึงสะท้อนออกมาดังนี้:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

มันได้ผล!


นี่ไม่ใช่วิธี CodeIgniter
mickmackusa

-1

ใช้get_compiled_select()เพื่อดึงข้อความค้นหาแทนการแทนที่


ฉันขอแนะนำให้แสดงวิธีใช้ฟังก์ชันที่คุณเสนอในกรณีนี้โดยเฉพาะไม่ใช่แค่พูดถึง ขอแสดงความนับถือ
YakovL

-2

ฉันอ่านคำตอบทั้งหมดที่นี่ แต่ไม่สามารถรับได้

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

ในการทำงานมันทำให้ฉันมีข้อผิดพลาดเช่น

เรียกใช้เมธอดที่ได้รับการป้องกัน CI_DB_active_record :: _ compile_select () จากบริบท 'ยินดีต้อนรับ' ในตัวควบคุมบนบรรทัด xx

ดังนั้นฉันจึงลบออกprotectedจากบรรทัดด้านล่างจากไฟล์\system\database\DB_active_rec.phpและใช้งานได้

protected function _compile_select($select_override = FALSE)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.