Codeigniter 모델에서 SQL 문을 인쇄하는 방법


107

내 모델에 SQL 문이 있습니다.

나는 다음 말한다

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

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

내 쿼리는 항상 실패합니다. 내 데이터베이스로 전송되는 정확한 SQL 문을 인쇄하도록 PHP를 얻으려면 어떻게해야합니까? 그리고 내 PHP보기, 페이지에 표시

답변:


124

쿼리 문자열을 표시하려면 :

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

질의 결과를 표시하려면 :

print_r($query);

Profiler 클래스는 페이지 하단에 벤치 마크 결과, 실행 한 쿼리 및 $ _POST 데이터를 표시합니다. 프로파일 러를 활성화하려면 Controller 메서드 내에서 다음 줄을 배치하십시오.

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

프로파일 링 사용자 가이드 : https://www.codeigniter.com/user_guide/general/profiling.html


7
내가 할 때 print_r ($ query); 아무것도 인쇄되지 않음
Technupe

1
프로파일 러에 내장 된 CI 사용, 자세한 정보는 여기
Novo

2
내가 원하는 것은 데이터베이스에 전달 된 SQL 문을 인쇄하는 것입니다.
죄송

내가 게시 한 사용자 가이드 링크를 방문하여 작동하지 않으면 대신 어떻게되는지 알려주십시오.
Novo

그럼 난 내 문제를 생각, 오라클 내 날짜 형식을 수락하지 않는, 내가 생각하는 모든 형식을 시도 필자, 그것은 단지 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 2013 년

3
CI3에서는 $this->db->get_compiled_select()대신 사용하십시오 .
닉 영

17

쿼리에 대한 빠른 테스트가 필요한 경우이 방법이 좋습니다.

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

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

@Chumillas의 답변과 @chhameed의 답변을 시도했지만 SQL이 잘못 되었기 때문에 작동하지 않습니다. 그래서 다음과 같은 새로운 접근 방식을 찾았습니다 .

  • 삽입 echo $sql; flush(); exit;전에로 return $sql; _compile_select의 기능DB_active_rec.php

0

인쇄하려는 쿼리 바로 뒤에이 줄을 추가합니다.

예:

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

//이 줄을 추가합니다.

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

출구();

또는

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


0

xdebug를 사용하여 VSCode에서 각 확장명과 CI v2.x로이 값을 확인합니다. 나는 $this->db->last_query()watch 섹션에 expresion 을 추가 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();

일하기 위해 오류가 발생했습니다.

xx 라인의 컨트롤러에서 'Welcome'컨텍스트에서 보호 된 메소드 CI_DB_active_record :: _ compile_select () 호출

그래서 나는 protected파일에서 아래 줄에서 제거 \system\database\DB_active_rec.php했고 작동했습니다.

protected function _compile_select($select_override = FALSE)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.