| 제목 | 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
좋은 정보네요..
|
좋은 정보 감사합니다.