쿼리 실행 Queries
$this->db->query();
쿼리를 실행하기위해서는 다음 함수를 사용합니다.:
$this->db->query('YOUR QUERY HERE');
query() 함수는 데이터를 읽어오는 쿼리 실행시 결과 객체를 리턴합니다. 이 결과객체는 쿼리결과생성에서 사용할수 있습니다. 데이터를 쓰거나, 업데이트 하는 쿼리를 실행하면 그 성공여부에 따라서 TRUE 나FALSE 를 리턴합니다. 결과값을 가져오려면 아래와같이 쿼리함수를 특정 변수에 할당합니다.:
$query = $this->db->query('YOUR QUERY HERE');
$this->db->simple_query();
이 함수는 $this->db->query() 함수의 간단 버전입니다.실행시 그 결과여부만을 단순히 TRUE 나 FALSE로 리턴합니다.또한 데이터베이스 결과셋이라든지 쿼리타이머,데이터바인딩의 컴파일(compile bind data), 디버깅을 위한 쿼리 저장등도 수행하지않습니다. 이 함수는 단순히 쿼리를 실행하는 역할만합니다. 대부분의 경우 이함수를 사용하지 않습니다.
데이터베이스 접두어 수동으로 추가하기 Adding Database prefixes manually
데이터베이스 접두어를 설정한 상태에서 수동으로 그 접두어를 추가하고싶다면, 다음과같이 합니다..
$this->db->dbprefix('tablename');
// outputs prefix_tablename
식별자 보호 Protecting identifiers
데이터베이스를 사용할때 테이블과 필드 이름을 보호하는것이 좋습니다. 예를 들어 MySQL을 사용할경우 액티브레코드( Active Record )쿼리들은 자동으로 보호됩니다., 그러나, 수동으로 식별자를 보호하려면 아래와같이 합니다.:
$this->db->protect_identifiers('table_name');
이 함수는 테이블명에 접두어를 붙여주며 데이터베이스 설정파일에 접두어를 이미 설정해 두었다고 가정합니다. 접두어를 활성(enable)화 하려면 두번째 파라미터로TRUE (boolen)를 넘겨줍니다.:
$this->db->protect_identifiers('table_name', TRUE);
쿼리 이스케이프 하기 Escaping Queries
쿼리를 실행하기전에 데이터를 이스케이프하는것은 대단히 실용적인 보안강화 방법입니다. CI 에서는 이 작업을 돕기위해서 세가지 방법을 제공합니다.:
- $this->db->escape() 이 함수는 데이터형을 확인하여 문자열형(string)에만 자동으로 '( single quotes) 를 붙여줍니다.:
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
- $this->db->escape_str() 이 함수는 데이터형에 상관없이 이스케이프 시킵니다. 대부분의 경우 위의 함수를 사용하는것이 이 함수를 사용하는것보다 좋습니다.이 함수는 아래와 같이 사용합니다.:
$sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
- $this->db->escape_like_str() 이 함수는 대부분 문자열이 LIKE 조건절을 사용할때 사용됩니다. 그러므로 문자열에 있는 ('%','_') 도 정확하게 이스케이프 됩니다.
$search = '20% raise';
$sql = "SELECT id FROM table WHERE column LIKE '%".$this->db->escape_like_str($search)."%'";
쿼리 바인딩Query Bindings
바인딩 쿼리를 좀더 간단하게 해줍니다. 아래 예제를 보세요:
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
쿼리안에 있는 물음표는 자동으로 두번째 파라미터로 전달되는 배열의 값으로 치환 됩니다.
바인딩으로 사용하면 값들은 자동으로 이스케이프 되기때문에 보안에도 좋습니다. 이경우 수동으로 이스케이프해야하는 부담이 없으며, CI가 알아서 해줍니다.