쿼리 실행 Queries

기본 쿼리 Query Basics

일반 쿼리 Regular Queries

쿼리를 실행하기 위해서, 일반 쿼리문을 사용합니다:

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

query() 함수는 데이터를 읽어오는 쿼리 실행시 결과 객체를 리턴합니다. 이 결과객체는 쿼리 결과 생성에서 사용할 수 있습니다. 데이터를 쓰거나, 업데이트 하는 쿼리를 실행하면 그 성공여부에 따라서 TRUE나 FALSE를 리턴합니다. 결과값을 가져오려면 아래와 같이 쿼리함수를 특정 변수에 할당합니다:

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

단순 쿼리 Simplified Queries

단순쿼리(simple_query) 함수는 $this->db->query() 의 단순 버전입니다. 그 결과여부만을 단순히 TRUE 나 FALSE로 리턴합니다.또한 데이터베이스 결과셋이라든지 쿼리타이머,데이터바인딩의 컴파일(compile bind data), 디버깅을 위한 쿼리 저장등도 수행하지않습니다. 이 함수는 단순히 쿼리를 실행하는 역할만합니다. 대부분의 경우 이 함수를 사용하지 않습니다.

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

Note

PostgreSQL’s pg_exec() 함수 (예를 들어) 는 항상 리소스를 반환합니다. 심지어 쓰기 쿼리에서도요. 그래서 boolean 값을 찾고 있다면 마음에 걸릴 것입니다.

데이터베이스 접두어를 수동으로 관리 Working with Database prefixes manually

데이터베이스 접두어가 설정되어 있고, 일반적인 SQL에서 테이블 이름에 그 접두어를 사용하고 싶다면, 아래와 같이 합니다:

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

새로 연결하지 않고 프로그램에서 접두사를 변경하려면 다음 방법을 사용합니다:

$this->db->set_dbprefix('newprefix');
$this->db->dbprefix('tablename'); // outputs newprefix_tablename

식별자 보호 Protecting identifiers

데이터베이스를 사용할 때 테이블과 필드 이름을 보호하는 것이 좋습니다. 예를 들어 MySQL을 사용할 경우 쿼리 빌더( Query Builder queries )쿼리들은 자동으로 보호됩니다, 그러나, 수동으로 식별자를 보호하려면 아래와 같이 합니다:

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

Important

쿼리 빌더가 당신이 제공하는 필드와 테이블명을 인용하기 위해 최선을 다할 것입니다. 사용자 입력에서 작동되도록 설계되지 않았습니다. unsanitized user data 와 함께 제공하지 말아주세요.

이 함수는 테이블명에 접두어를 붙여주며 데이터베이스 설정파일에 접두어를 이미 설정해 두었다고 가정합니다. 접두어를 활성(enable)화 하려면 두 번째 파라미터로 TRUE (boolen)를 넘겨줍니다:

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

쿼리 이스케이프 하기 Escaping Queries

쿼리를 실행하기 전에 데이터를 이스케이프하는 것은 대단히 실용적인 보안강화 방법입니다. CI 에서는 이 작업을 돕기위해서 세 가지 방법을 제공합니다:

  1. $this->db->escape() 이 함수는 데이터형을 확인하여 문자열형(string)에만 자동으로 '( single quotes) 를 붙여줍니다.

    $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 '!'";

Important

escape_like_str() 함수는 LIKE 조건과 같은 특수 문자를 사용하기 위해 ‘!’ (느낌표) 를 사용합니다. 이 함수는 따옴표로 감싼 일부 문자열만을 이스케이프하기 때문입니다. ESCAPE '!' 조건을 자동으로 더하지 않습니다. 그리고 수동으로 더할 수 있습니다.

쿼리 바인딩 Query Bindings

바인딩 쿼리를 좀 더 간단하게 해줍니다. 아래 예제를 보세요:

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

쿼리안에 있는 물음표는 자동으로 두 번째 파라미터로 전달되는 배열의 값으로 치환됩니다.

바인딩은 IN set 애서 변환될 배열과도 함께 작동됩니다:

$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'

바인딩으로 사용하면 값들은 자동으로 이스케이프 되기 때문에 보안에도 좋습니다. 이 경우 수동으로 이스케이프해야하는 부담이 없으며, CI가 알아서 해줍니다.

에러 핸들링 Handling Errors

$this->db->error();

발생된 가장 최근 에러를 얻고 싶다면, error() 함수는 code 와 메세지를 포함한 배열로 반환합니다. 간단 예제:

if ( ! $this->db->simple_query('SELECT `example_field` FROM `example_table`'))
{
        $error = $this->db->error(); // Has keys 'code' and 'message'
}