programing

zend 프레임워크에서 정확한 SQL 쿼리를 인쇄하는 방법

yoursource 2022. 10. 23. 19:53
반응형

zend 프레임워크에서 정확한 SQL 쿼리를 인쇄하는 방법

나는 모델에서 가져온 아래의 코드를 가지고 있다.

    ...
                  $select = $this->_db->select()
                    ->from($this->_name)
                    ->where('shipping=?',$type)
                    ->where('customer_id=?',$userid);
                 echo  $select; exit; // which gives exact mysql query.
            .....

zend에서 다음과 같은 업데이트 쿼리를 사용하는 경우,

$up_value = array('billing'=> '0');
$this->update($up_value,'customer_id ='.$userid.' and address_id <> '.$data['address_Id']);      

여기서 나는 정확한 mysql 쿼리를 알고 싶다.mysql query를 zend로 출력할 수 있는 방법이 없을까요? 조언 부탁드립니다.

Zend Framework에서 __toString() 메서드를 가진 개체를 선택합니다.

Zend Framework 매뉴얼:

$select = $db->select()
             ->from('products');

$sql = $select->__toString();
echo "$sql\n";

// The output is the string:
//   SELECT * FROM "products"

대체 솔루션은 Zend_Db_Profiler를 사용하는 것입니다.

$db->getProfiler()->setEnabled(true);

// your code
$this->update($up_value,'customer_id ='.$userid.' and address_id <> '.$data['address_Id']); 

Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQuery());
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQueryParams());
$db->getProfiler()->setEnabled(false);

http://framework.zend.com/manual/en/zend.db.select.html

>= 2.1.4부터

echo $select->getSqlString()

수백 페이지를 넘보고, 검색도 많이 해봤지만 정확한 해결책을 찾지 못했습니다.드디어 이게 먹혔어컨트롤러 또는 모델 중 어느 쪽의 위치에 있든 상관없습니다.어디서든 이 코드가 통했어그냥 이거 써.

//Before executing your query
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$db->getProfiler()->setEnabled(true);
$profiler = $db->getProfiler();

// Execute your any of database query here like select, update, insert
//The code below must be after query execution
$query  = $profiler->getLastQueryProfile();
$params = $query->getQueryParams();
$querystr  = $query->getQuery();

foreach ($params as $par) {
    $querystr = preg_replace('/\\?/', "'" . $par . "'", $querystr, 1);
}
echo $querystr;

드디어 이게 먹혔어.

사용할 수 있습니다.Zend_Debug::Dump($select->assemble());SQL 쿼리를 가져옵니다.

또는 Zend DB FirePHP 프로파일러를 활성화하면 Firebug(UPDATE 문도 포함)에서 모든 쿼리를 깔끔한 형식으로 얻을 수 있습니다.

편집: FirePHP를 사용한 프로파일링은 FF6.0+에서도 기능합니다(링크에서 권장하는 FF3.0뿐만이 아닙니다).

Zend2에 대해서:

$select->getSqlString();

ZendDbSql 개체에서 생성된 SQL 표시

인쇄할 수 있습니다.

print_r($select->assemble());
$statement = $this->sql->getSqlStringForSqlObject( HERE GOES Zend\Db\Sql\SelectSQL object );

echo "SQL statement: $statement";

예:

$select = $this->sql->select();
...
$select->from(array( 'u' => 'users' ));
$select->join(...
$select->group('u.id');
...
$statement = $this->sql->getSqlStringForSqlObject($select);
echo $statement;

더 짧다:

echo $select->__toString()."\n";

짧은 시간:

echo  $select .""; die;

이것은 Zend Framework 문서(즉,갱신):

echo $update->getSqlString();

(Bonus) 내 모델 파일에 이 파일을 사용합니다.

echo $this->tableGateway->getSql()->getSqlstringForSqlObject($select);

좋은 하루 되세요 :)

사용방법:-

echo $select->query();

또는

Zend_Debug::dump($select->query();

Zend_Db_Profiler를 확인합니다.이렇게 하면 SQL 문이 준비되고 실행될 때 기록할 수 있습니다.SELECT 쿼리뿐만 아니라 UPDATE 문에도 사용할 수 있습니다.

나는 이 방법으로 이것을 해 왔다.

$sql = new Sql($this->adapter);
        $select = $sql->select();
        $select->from('mock_paper');
        $select->columns(array(
            'is_section'
        ));
        $select->where(array('exam_id = ?' => $exam_id,'level_id = ?' => $level_id))->limit(1);



        $sqlstring = $sql->buildSqlString($select);
        echo $sqlstring;
        die();

프로파일러 또는 쿼리 개체에서 반환된 쿼리는 플레이스 홀더를 사용할 경우 플레이스 홀더를 가집니다.

mysql에 의해 실행되는 정확한 쿼리를 표시하려면 일반 쿼리 로그를 사용합니다.

활성화된 이후 실행된 모든 쿼리가 나열됩니다.샘플을 수집한 후에는 이 설정을 해제하는 것을 잊지 마십시오. 액티브 서버에서는, 이 로그는 순식간에 가득 찰 가능성이 있습니다.

mysql 터미널 또는 MySQL Workbench와 같은 쿼리 도구에서 다음을 실행합니다.

SET GLOBAL log_output = 'table';
SET GLOBAL general_log = 1;

그런 다음 쿼리를 실행합니다.결과는 "mysql.general_log" 테이블에 저장됩니다.

SELECT * FROM mysql.general_log

쿼리 로그를 비활성화하려면:

SET GLOBAL general_log = 0;

꺼져 있는지 확인하려면:

SHOW VARIABLES LIKE 'general%';

이를 통해 자리 표시자가 zend db로 대체되지 않은 쿼리를 찾을 수 있었습니다.프로파일러로는 볼 수 없었어요

$db->getProfiler()->setEnabled(true);

// your code    
$this->update('table', $data, $where);    
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQuery());    
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQueryParams());    
$db->getProfiler()->setEnabled(false);

언급URL : https://stackoverflow.com/questions/7723657/how-to-print-exact-sql-query-in-zend-framework

반응형