쿼리 기초
쿼리 형식
쿼리를 실행하려면 다음 함수를 사용하세요 :
$this->db->query('YOUR QUERY HERE');
"query()" 함수는 읽기 형식의 쿼리 실행 시, 데이터베이스 결과 객체를 반환합니다.
쓰기 형식의 쿼리 실행 시, 성공 및 실패를 알려주는 값은 "TRUE" 또는 "FALSE"가 반환됩니다.
데이터를 가지고 올 경우, 다음과 같이 간단히 당신의 변수에 쿼리를 할당할 수 있습니다 :
$query = $this->db->query('YOUR QUERY HERE');
쿼리 단순화
"simple_query" 메소드는 "$this->db->query()" 메소드의 단순화 버전입니다.
그리고, 데이터베이스 결과 세트(result set)를 반환하지 않습니다.
또한 쿼리 타이머를 설정하지 않고 데이터 바인딩을 위한 컴파일 작업을 수행하지 않습니다.
그리고 디버깅을 위해 쿼리를 저장하지도 않습니다.
다만, 단순히 쿼리를 실행하도록만 합니다.
대부분의 경우 이 함수를 사용하지 않을 것입니다.
이 메소드는 데이터베이스 드라이버의 "execute"함수가 반환하는 값을 그대로 반환합니다.
"INSERT", "DELETE" 및 "UPDATE"와 같은 쓰기 형식의 쿼리 실행 시, 성공 및 실패 결과로서 "TRUE/FALSE"를 반환합니다.
그리고 쿼리 작업 성공에 따른 결과 값이 있으면 해당 자원/객체를 반환합니다.
if ($this->db->simple_query('YOUR QUERY'))
{
echo "Success!";
}
else
{
echo "Query failed!";
}
주의사항
예를 들어, PostgreSQL의 "pg_exec()" 함수는, 쓰기 형식의 쿼리에 대해서도, 항상 성공한 자원을 돌려줍니다.
따라서 이 경우, boolean 값을 기대한다면 이를 염두에 두십시오.
수동으로 데이터베이스 접두사를 사용하는 경우
데이터베이스 접두사를 구성한 후, 네이티브 SQL 쿼리 사용 시 이를 사용 테이블 이름 앞에 추가하려는 경우 다음처럼 할 수 있습니다 :
$this->db->dbprefix('tablename'); // outputs prefix_tablename
어떠한 이유에서, 새 연결 작성 없이 프로그램적으로 접두사를 변경하려는 경우, 다음처럼 할 수 있습니다 :
$this->db->set_dbprefix('newprefix_');
$this->db->dbprefix('tablename'); // outputs newprefix_tablename
보호 식별자
많은 경우, 데이터베이스에서 테이블과 필드 이름을 보호하는 것이 좋습니다 (예 : MySQL의 backtick).
쿼리 빌더를 통한 쿼리는 자동적으로 보호받지만 사용자는 식별자로 직접 보호할 필요가 있습니다 :
$this->db->protect_identifiers('table_name');
중요사항
쿼리 작성기는 제공되는 모든 필드 및 테이블 이름에 적절한 따옴표 처리를 하기 위해 최선을 다하지만, 임의의 사용자 입력에 문제 없도록 작동하지 않음에 유의하세요.
정제되지 않은 사용자 데이터가 입력되지 않도록 하세요.
데이터베이스 구성 파일에 접두어가 지정되어 있다고 가정하면, 이 함수는 테이블에 접두어를 추가합니다.
접두어 사용을 활성화하려면 두 번째 매개 변수에 TRUE(boolean)를 넣으세요 :
$this->db->protect_identifiers('table_name', TRUE);
쿼리 이스케이프(Escaping)
데이터를 데이터베이스에 제출하기 전에 해당 데이터에 이스케이프 처리하는 것이 보안상 좋습니다.
코드이그나이터는 이 작업에 도움을 주는 세 가지 방법을 제공합니다 :
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 조건의 특수 문자를 이스케이프 처리하기 위해 '!'(느낌표)를 사용합니다.
이 메서드는 따옴표로 묶은 부분을 이스케이프 처리하므로, 자동 이스케이프 '!' 추가 처리를 할 수 없습니다.
그렇게 하기 원한다면, 수동으로 처리해야 합니다.
쿼리 바인딩
당신의 의도에 맞게 시스템에서 쿼리 내의 값을 할당하므로, 바인딩은 쿼리를 단순하게 해 줍니다.
다음 예제를 고려하세요 :
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
쿼리 내의 물음표 마크는, 쿼리 함수의 두 번째 매개 변수를 통해 들어온 배열의 값으로 자동 대체됩니다.
바인딩은 배열로도 작동되며 "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'
바인드를 사용하여 얻는 부차적 이점은 값이 자동으로 이스케이프(escaped) 처리되므로 안전한 쿼리가 생성된다는 점입니다.
수동으로 데이터를 이스케이프 처리할 필요가 없습니다. 엔진이 자동으로 처리해줍니다.
에러 핸들링
$this->db->error();
발생한 오류 중 마지막 오류를 가져고 오려면, error() 메서드를 사용하면 됩니다.
이 메소드는 에러 코드 및 메시지가 포함된 배열을 반환합니다.
다음은 간단한 예입니다 :
if ( ! $this->db->simple_query('SELECT `example_field` FROM `example_table`'))
{
$error = $this->db->error(); // Has keys 'code' and 'message'
}