제목 | euc-kr 환경의 웹페이지 + oracle 바인딩 & 버그수정 | ||
---|---|---|---|
글쓴이 | 초원을달리는유부남 | 작성시각 | 2010/01/14 14:19:48 |
|
|||
안녕하세요. 매일 질문만 던져서 답반 가져가는 초원을 달리는 유부남 인사드립니다. :) CodeIgniter는 utf-8 환경에서 돌아가도록 되어 있습니다.
* application/config/config.php 내용 수정 euc-kr 환경을 코드이그나이트 문서의 가이드에 따라 아래처럼 설정 합니다. $config['charset'] = "euc-kr";
* system/libraries/URI.php 생성자 함수(49라인)에 내용 추가 URL은 kirrie 님이 이미 기록한 문서(http://codeigniter-kr.org/tip/view/240/page/1/q/euc-kr)에서도 if (($charset = $this->config->item('charset')) != 'utf-8') { if (isset($_SERVER['PATH_INFO'])) { $_SERVER['PATH_INFO'] = iconv('utf-8', $charset, $_SERVER['PATH_INFO']); } if (isset($_SERVER['PHP_SELF'])) { $_SERVER['PHP_SELF'] = iconv('utf-8', $charset, $_SERVER['PHP_SELF']); } if (isset($_SERVER['PATH_TRANSLATED'])) { $_SERVER['PATH_TRANSLATED'] = iconv('utf-8', $charset, $_SERVER['PATH_TRANSLATED']); } if (isset($_SERVER['REQUEST_URI'])) { $_SERVER['REQUEST_URI'] = iconv('utf-8', $charset, $_SERVER['REQUEST_URI']); } }
ocierror() 함수는 한번 사용하면, 결과 리턴 후에는 해당 리소스가 사라지는 것에서 생긴 문제와, 74라인에 전역변수 추가 var $error = array();
function _error_message() { if (!isset($this->error[$this->stmt_id])) { $this->error[$this->stmt_id] = ocierror($this->stmt_id); } return $this->error[$this->stmt_id]['message']; } function _error_number() { if (!isset($this->error[$this->stmt_id])) { $this->error[$this->stmt_id] = ocierror($this->stmt_id); } return $this->error[$this->stmt_id]['code']; }
escape_str() 메소드에서 escape 처리를 하고 있으나, 간단한 escape 조차도 하지 못하고 있음. 409라인 교체 $str = $CI->input->_remove_invisible_characters($str); $str = str_replace("'", "''", $CI->input->_remove_invisible_characters($str));
$str = str_replace( array('%', '_', $this->_like_escape_chr), array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), $str); $str = str_replace( array('%', '_', '\'', $this->_like_escape_chr), array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.'\'', $this->_like_escape_chr.$this->_like_escape_chr), $str);
오라클 바인딩 기능은 escape 문제로 인해 반드시 필요한 기능이라고 생각합니다. // 기존 바인딩 사용방법 (? 이용한) $sql = "select ? from dual"; $bind_array[0] = '검색값'; $result = $this->db->query($sql, $bind_array); // 오라클 바인드 기능 사용방법 $sql = "select :search_key from dual"; $bind_array[':search_key'] = '검색값'; $result = $this->db->parse($sql, $bind_array); * system/database/DB_driver.php 파일 수정하기 $this->db->query() 대신 $this->db->parse() 를 사용했다는 표시 부분을 추가하면, function query($sql, $binds = FALSE, $return_object = TRUE) function query($sql, $binds = FALSE, $return_object = TRUE, $pre_parse = FALSE)
if (FALSE === ($this->result_id = $this->simple_query($sql))) if (FALSE === ($this->result_id = $this->simple_query($sql, $pre_parse))) 440라인 교체 function simple_query($sql) function simple_query($sql, $pre_parse = FALSE) 447라인 교체 return $this->_execute($sql); return $this->_execute($sql, $pre_parse);
function parse($sql, $binds, $return_object = TRUE) { $params = array(); foreach ($binds as $name => $param) { if (!is_array($param)) { $params[] = array('name' => $name, 'value' => $param); } else { if (!isset($param[1])) { $param[1] = ''; } if (!isset($param[2])) { $param[2] = ''; } $params[] = array('name' => $name, 'value' => $param[0], 'type' => $param[1], 'length' => $param[2]); } } $this->stmt_id = FALSE; $this->_set_stmt_id($sql); $this->_bind_params($params); return $this->query($sql, FALSE, $return_object, TRUE); }
function _execute($sql, $pre_parse = FALSE) { // oracle must parse the query before it is run. All of the actions with // the query are based on the statement id returned by ociparse if ($pre_parse === FALSE) { $this->stmt_id = FALSE; $this->_set_stmt_id($sql); } ocisetprefetch($this->stmt_id, 1000); return @ociexecute($this->stmt_id, $this->_commit); }
function _bind_params($params) { if ( ! is_array($params) OR ! is_resource($this->stmt_id)) { return; } foreach ($params as $param) { foreach (array('name', 'value', 'type', 'length') as $val) { if ( ! isset($param[$val])) { $param[$val] = ''; } } if ($param['type'] != '') { ocibindbyname($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']); } elseif ($param['length'] != '') { ocibindbyname($this->stmt_id, $param['name'], $param['value'], $param['length']); } else { ocibindbyname($this->stmt_id, $param['name'], $param['value']); } } } |
|||
다음글 | [펌]editplus에서 자주 활용하는 기능 (4) | ||
이전글 | 드디어 쓸만한 PHP IDE가 있네요. (8) | ||
변종원(웅파)
/
2010/01/14 14:45:31 /
추천
0
|
양승현
/
2010/01/22 09:34:51 /
추천
0
좋은 정보네요..
|
좋은 정보 감사합니다.