반응형
맨날 JavaScript 까먹어서 이번에 걍 정리해놓고

앞으로 가져다가 사용해야겠다.. 에고~~ 이거 맨날 삽질이구낭... 흠..

우선적으로 숨기기 위해서 아래와 같이 묵는다.


1.  DIV or SPAN 으로 묶기.
    ( 기본적으로 onload시 hidden 상태로 유지되도록 style를 none으로 설정한다. )

<span id="password_hint_area" style="display:none">
    <table width="615" border="0" cellspacing="1" cellpadding="0" bgcolor="e5e5e5">
      <tr>
        <td class="detail_name">비밀번호 힌트</td>
        <td class="detail_value">
   <select name="password_hint" class="select" id="password_hint" style="width:415px">
           <option value="none" >비밀 번호 질문 선택</option>
             <? while($rows = mysql_fetch_array($password_question)) {?>
             <option value="<?= $rows[PK_CODE] ?>">
             <?= $rows[CODE_NAME]?>
             </option>
             <? } ?>
         </select> 
        </td>
      </tr>
      <tr>
        <td class="detail_name">비밀번호 답변</td>
        <td class="detail_value"><input type="text" name="password_hint_value" id="textfield8" class="input_box" size="20" maxlength="20"/></td>
      </tr>
      <tr>
        <td height="30" colspan="2" align="center" valign="middle" bgcolor="FFFFFF">
         <a href="javascript:searchPassword();"><img src="/image/member_info/btn_searchPassword.gif" align="absmiddle"></a>        </td>
        </tr>
    </table>
   </span>


2. javascript 함수 내에서 아래와 같이 display속성을 변경하도록 한다.
    ( 졸간단한데 왜 만날 까먹징.... 헉 )



   $.ajax({
   type : "POST",
   url : "./member_join_logic.php",
   async: false,
   dataType : "text",
   data : params,
   beforeSend : function(xmlHttpRequest){
   },
   success :  function(msg) {  
    
    var data = eval("(" + msg + ")");
    if(data){
     
     alert("실명인증에 성공하였습니다. 비밀번호 답변을 입력해주세요");
     
     
     document.getElementById("password_hint_area").style.display = "block";
     form.password_hint_value.focus();
     
    }else{
     alert("일치하는 회원정보가 없습니다.");
    }
    },
    error : function(xmlHttpRequest, textStatus, errorThrown){
     alert("회원 실명인증 중 오류가 발생하였습니다. [" + textStatus + "]"); 
    }
   });

시간 되면 display속성에 대해서도 추가 정리를 해야겠다.

에고 어여 코딩하러 가자 고고고씽

반응형
반응형
PHP 에서 JQuery 를 이용하여 Ajax를 이용할때 아래와 같은 방법으로 하는것이 가장 이상적이다.

내가 테스트 한 환경은 다음과 같다

WAS : euc-kr
DB : Mysql euc-kr
환경이다.


1. Jquery 를 이용하여 Ajax호출한다.
   ( 단 한글데이터의 경우 encodeURIComponent를 이용하여 UTF-8 로 인코딩 시켜야 한다. )


  params = "mode=getMember";
  params += "&user_id=" + form.pass_id.value;
  params += "&name=" + encodeURIComponent(form.pass_name.value); // (1) UTF-8로 인코딩한다.
  params += "&reg_num1=" + form.pass_regnum1.value;
  params += "&reg_num2=" + form.pass_regnum2.value;
  
  $.ajax({
   type : "POST",
   url : "./member_join_logic.php",
   async: false,
   dataType : "text",
   data : params,
   beforeSend : function(xmlHttpRequest){
   },
   success :  function(msg) {  
    
    var data = eval("(" + msg + ")");

    if(data){
     alert(data[0].NAME); // (4) 결과값을 출력한다.
    }else{
     alert("일치하는 회원정보가 없습니다.");
    }
    },
    error : function(xmlHttpRequest, textStatus, errorThrown){
     alert("회원 실명인증 중 오류가 발생하였습니다. [" + textStatus + "]"); 
    }
   });



2. Mysql Data를 조회한다.
   ( 조회시 한글 파라미터 값은 별도로 euc-kr로 다시 인코딩 시켜서 맵핑시킨다. )


3. 결과값을 요청한 페이지로 json_encode 함수를 이용하여 리턴시킨다.


   $SQL  = " SELECT * FROM testDB WHERE 1=1 ";
   if($user_id){ $SQL .= " AND user_id ='".$user_id."' "; }
   if($name){ $SQL .= " AND name ='".decode_cp949($name)."' "; } // (2) EUC-KR로 인코딩하여 DB에 맵핑한다.
   if($reg_num1){ $SQL .= " AND reg_num1 ='".$reg_num1."' "; }
   if($reg_num2){ $SQL .= " AND reg_num2 = sha1('".$reg_num2."') "; }
   
   $result = mysql_query($SQL);

   
   
     while ($row = mysql_fetch_assoc($result)) {         
          for ($i=0; $i < mysql_num_fields($result); $i++) {
              $info = mysql_fetch_field($result, $i);
      $row[$info->name] = decode_utf8($row[$info->name]); // (3) 결과값을 다시 UTF-8로 인코딩한다.
          }
          $rows[] = $row;
       }
     
       echo json_encode($rows); // JSON 으로 리턴한다.


[ 참조 ]
위 예제에서 사용한 인코딩 함수는 아래와 같다.

  /**
 * UTF-8 => CP949 로 디코딩 Function
 */
 function decode_cp949($data){
  return iconv("UTF-8", "CP949", rawurldecode($data)); 
 }
 
 /**
 * CP949 => UTF-8 로 디코딩 Function
 */
 function decode_utf8($data){
  return iconv("CP949", "UTF-8", rawurldecode($data)); 
 }



4. 최초 요청받은 페이지에서는 받은 값을 출력한다.

위 과정처럼 하면 한글 데이터도 정상적으로 DB와 통신 가능하다.

이제 삽질은 제발 그만하자 흑흑흑....

이상 JQuery를 이용하여 PHP에서 ajax통신시 한글의 문제점 해결방법이다.

반응형

'Program > PHP' 카테고리의 다른 글

[ PHP 파라미터 출력하여 알아보는 방법 ]  (0) 2011.05.30
[ PHP 에서 DB결과 처음포인터 위치하기 ]  (0) 2010.08.28
[ PHP E-mail 전송 ]  (6) 2010.07.03
PHP Excel Download Module  (21) 2010.06.22
[ PHP5 공통모듈 ]  (0) 2010.06.10
반응형
PHP 에서 E-mail 전송을 지원해주는 여러 모듈들이 즐비하다.

많기도 참 많다.

근데!! 중요한건 이런 모듈들을 사용하기에는 너무 어렵고 복잡하다.

우연히 phpschool.net에서 좋은 소스를 발견하여 필요한 것만 사용하였다.

하지만 template을 이용한 방법은 추가되지 않았다.

그래서 이번기회에 다운받은 소스를 업그레이드 하여

나만의 모듈을 만들었다.

첨부한다. 필요한 사람들은 제발 댓글 달고 가져 가길 바란다.

smtp 주소까지 모두 적을 수 있으니,, ㅋㅋㅋ 아주 좋은 모듈 이다.




반응형

'Program > PHP' 카테고리의 다른 글

[ PHP 에서 DB결과 처음포인터 위치하기 ]  (0) 2010.08.28
[ JQuery Ajax + PHP 한글 처리문제 해결방법 ]  (0) 2010.07.20
PHP Excel Download Module  (21) 2010.06.22
[ PHP5 공통모듈 ]  (0) 2010.06.10
PHP - HttpRequest ( POST 방식 )  (0) 2010.06.09
반응형

PHP 에서 Excel Download 방법은 몇가지가 있다.

머 JSP 도 그리 차이는 없지만 젤 편한 방법이 MIME TYPE을 변경하는 일이다.


[1] MIME TYPE 변경방법

 header("Content-type: application/vnd.ms-excel; charset=UTF-8");

위와 같이 vnc.ms-excel MIME Type 을 사용하여 변경하는 방법 이 있지만, office 2007이 나온 뒤로는 그닥 좋은 방법으로 평가받지 못하는 것이 현실이다. 그 이유는 매번 파일을 열때마다 아래 그림과 같은 에러가 발생하기 때문이다.

==> 에러 그림


이런 이유로 이번 회사에서 사내 프로젝트시 excel file 제작은 인터넷을 검색하던중 MS-Excel Stream Handler 모듈을 발견하게 되었다.

[2] MS-Excel Stream Handler Module 다운로드 방법

예제 모듈 다운로드 사이트 :
http://www.phpclasses.org/package/1919-PHP-Stream-wrapper-to-read-and-write-MS-Excel-files.html

위 예제 사이트에 들어가서 회원가입 후 로그인 하면 MS 예제 파일을 다운받을 수 있다.

예제 파일은 현재 한글 처리가 안되어있을 뿐더라 header값에 값이 잘못 설정되어있다.

[ 다운받은 원본 ]


 require_once "excel.php";
$export_file = "xlsfile://tmp/example.xls";
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
header ("Content-type: application/x-msexcel");
header ("Content-Disposition: attachment; filename=\"" . basename($export_file) . "\"" );
header ("Content-Description: PHP/INTERBASE Generated Data" );
readfile($export_file);
exit;

header ("Cache-Control: no-cache, must-revalidate");  ==> 요기 부분이 문제의 line이다.

테스트 결과 firefox 와 크롬에서는 다운로드가 잘되는데 IE에서는 경로를 못찾는 문제가 생긴다.

그래서 저부분을 php.net에 있는 내용데로 바꾸어주었다.

header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");

저부분이 왜 저렇게 돼는지는 아직 원인을 모른다. 그래서 위키디피아에 검색해 보니 이런 글이 있다.

 IE에서는 Cache-Control:no-cache로 응답이 온 경우 local cache에 리소스를 저장하지 않으므로 해당 resource는 항상 일반 Request(Condtional-GET 하지 않음)로 요청하게 된다. 하지만 Firefox에서는 Cache-control:no-cache인 경우에도 page navigation(back/forward)를 위해 local cache에 저장한다. 이 경우 저장시에 브라우저가 만기일을 1970-01-01 09:00:00로 설정하며, 응답 헤더에 Last-Modified나 Etag가 존재할 경우에는 Condtional-GET이 발생하며, 없을 경우에는 일반 request를 하도록 되어 있다. 따라서 정말로 no-cache 한 동작을 하기 위해서는 응답 헤더에 Cache-control:no-cache를 추가할 뿐만 아니라 Last-modified와 Etag를 제거해야 한다.
                                                                        [위키디피아 발췌글]

추가적으로 한글 문제를 해결하기 위해 charset를 추가한다.

header ("Content-charset=euc-kr");

이제 바로 사용가능하도록 수정이 완료되었으니 최종 본을 살펴보자


  27 header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
 28 header ("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT");
 29 header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 30 header ("Pragma: public");
 31 header ("Content-type: application/x-msexcel");
 32 header ("Content-Disposition: attachment; filename=\"" . basename($export_file) . "\"" );
 33 header ("Content-Description: PHP/INTERBASE Generated Data" );
 34 header ("Content-charset=euc-kr");
 35 ob_clean();
 36 flush();
 37 readfile($export_file);
 38 exit;


이렇게 변경하니 다운로드가 원활하게 됐다.


매번 다운받아 헤더값 을 다시 수정하기도  귀찮고 하니 한글이랑 IE에서 잘되는 샘플  파일을 첨부하도록 하겠다.

받아가는 놈들은 고맙다고 제발 댓글 달고 조회수좀 팍팍 올려주길 바란다.~~~


이상 성랑이의 PHP Excel 다운로드 강좌였음 ㅋㅋㅋ ^^

끝~~~~~~~~~~




반응형

+ Recent posts