쿼리 실행

쿼리 기초

일반 쿼리

쿼리를 실행하려면 query 함수를 사용하세요:

$this->db->query('YOUR QUERY HERE');

query() 함수는 “읽기” 유형 쿼리가 실행될 때 데이터베이스 결과 오브젝트를 반환하며, 이를 사용하여 결과를 표시할 수 있습니다. “쓰기” 유형 쿼리가 실행될 때는 성공 또는 실패에 따라 TRUE 또는 FALSE를 반환합니다. 데이터를 검색할 때는 일반적으로 다음과 같이 쿼리를 변수에 할당합니다:

$query = $this->db->query('YOUR QUERY HERE');

단순화된 쿼리

simple_query 메소드는 $this->db->query() 메소드의 단순화된 버전입니다. 데이터베이스 결과 세트를 반환하지 않으며, 쿼리 타이머를 설정하거나, 바인드 데이터를 컴파일하거나, 디버깅을 위해 쿼리를 저장하지 않습니다. 단순히 쿼리를 실행할 수 있게 해줍니다. 대부분의 사용자는 이 함수를 거의 사용하지 않습니다.

데이터베이스 드라이버의 “execute” 함수가 반환하는 값을 반환합니다. 일반적으로 INSERT, DELETE, UPDATE와 같은 쓰기 유형 쿼리의 경우 성공 또는 실패에 따라 TRUE/FALSE이며, 결과를 가져올 수 있는 쿼리의 경우 성공 시 리소스/오브젝트입니다.

if ($this->db->simple_query('YOUR QUERY'))
{
        echo "Success!";
}
else
{
        echo "Query failed!";
}

참고

PostgreSQL의 pg_exec() 함수는 쓰기 유형 쿼리에서도 항상 성공 시 리소스를 반환합니다. 불리언 값을 찾는 경우 이 점을 고려하세요.

데이터베이스 접두사 수동 처리

데이터베이스 접두사를 설정했고 네이티브 SQL 쿼리에서 사용하기 위해 테이블 이름에 접두사를 추가하려면 다음을 사용할 수 있습니다:

$this->db->dbprefix('tablename'); // prefix_tablename 출력

어떤 이유로 새 연결을 만들지 않고도 프로그래밍 방식으로 접두사를 변경하려면 이 메소드를 사용할 수 있습니다:

$this->db->set_dbprefix('newprefix_');
$this->db->dbprefix('tablename'); // newprefix_tablename 출력

식별자 보호

많은 데이터베이스에서 테이블과 필드 이름을 보호하는 것이 좋습니다. 예를 들어 MySQL에서는 백틱을 사용합니다. Query Builder 쿼리는 자동으로 보호됩니다. 그러나 수동으로 식별자를 보호해야 하는 경우 다음을 사용할 수 있습니다:

$this->db->protect_identifiers('table_name');

중요

Query Builder는 입력하는 필드와 테이블 이름을 적절하게 인용하기 위해 최선을 다하지만, 임의의 사용자 입력과 함께 작동하도록 설계되지 않았습니다. 살균되지 않은 사용자 데이터를 입력하지 마세요.

이 함수는 database config 파일에 접두사가 지정되어 있다고 가정하고 테이블에 테이블 접두사도 추가합니다. 두 번째 매개변수에 TRUE(불리언)를 설정하여 접두사를 활성화할 수 있습니다:

$this->db->protect_identifiers('table_name', TRUE);

쿼리 이스케이핑

데이터를 데이터베이스에 제출하기 전에 이스케이프하는 것은 매우 좋은 보안 관행입니다. CodeIgniter에는 이를 도와주는 세 가지 메소드가 있습니다:

  1. $this->db->escape() 이 함수는 데이터 유형을 결정하여 문자열 데이터만 이스케이프합니다. 또한 데이터 주위에 작은따옴표를 자동으로 추가합니다:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    
  2. $this->db->escape_str() 이 함수는 유형에 관계없이 전달된 데이터를 이스케이프합니다. 대부분의 경우 이 함수 대신 위의 함수를 사용합니다:

    $sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
    
  3. $this->db->escape_like_str() 이 메소드는 문자열이 LIKE 조건에 사용될 때 LIKE 와일드카드(‘%’, ‘_’)도 적절히 이스케이프되도록 사용해야 합니다.

$search = '20% raise';
$sql = "SELECT id FROM table WHERE column LIKE '%" .
    $this->db->escape_like_str($search)."%' ESCAPE '!'";

중요

escape_like_str() 메소드는 LIKE 조건에 대한 특수 문자를 이스케이프하기 위해 ‘!’(느낌표)를 사용합니다. 이 메소드는 직접 따옴표로 묶을 부분 문자열을 이스케이프하기 때문에 ESCAPE '!' 조건을 자동으로 추가할 수 없으므로 수동으로 해야 합니다.

쿼리 바인딩

바인딩을 사용하면 시스템이 쿼리를 조합하도록 하여 쿼리 구문을 단순화할 수 있습니다. 다음 예시를 고려하세요:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));

쿼리의 물음표는 query 함수의 두 번째 매개변수에 있는 배열의 값으로 자동으로 대체됩니다.

바인딩은 배열에서도 작동하며 IN 세트로 변환됩니다:

$sql = "SELECT * FROM some_table WHERE id IN ? AND status = ? AND author = ?";
$this->db->query($sql, array(array(3, 6), 'live', 'Rick'));

결과 쿼리는 다음과 같습니다:

SELECT * FROM some_table WHERE id IN (3,6) AND status = 'live' AND author = 'Rick'

바인딩 사용의 추가적인 이점은 값이 자동으로 이스케이프되어 더 안전한 쿼리를 생성한다는 것입니다. 데이터를 수동으로 이스케이프하는 것을 기억할 필요가 없으며, 엔진이 자동으로 처리합니다.

에러 처리

$this->db->error();

마지막으로 발생한 에러를 가져와야 하는 경우 error() 메소드는 코드와 메시지를 포함하는 배열을 반환합니다. 간단한 예시입니다:

if ( ! $this->db->simple_query('SELECT `example_field` FROM `example_table`'))
{
        $error = $this->db->error(); // 'code'와 'message' 키를 가집니다
}