영원한사랑

인터넷정보 +1252
#!/usr/bin/php
<?php

function myallfile($dir, $ext = '')
{
        $file_arr = array();
        if (is_dir($dir))
        {
                if ($dh = opendir($dir))
                {
                        while (($file = readdir($dh)) !== false)
                        {
                                $type = filetype($dir . $file);

                                if($type == 'file')
                                {
                                        if($ext != '')
                                        {
                                                $ext = strtolower($ext);
                                                $temp = explode('.',$file);
                                                if(strtolower($temp[count($temp)-1]) == $ext) $file_arr[] = $dir.$file;
                                        }
                                        else    $file_arr[] = $dir.$file;
                                }
                                else if($type == 'dir' && ($file != '.' && $file != '..'))
                                {

                                        $temp = myallfile($dir.$file.'/', $ext);
                                        if(is_array($temp))
                                        {
                                                $file_arr = array_merge($file_arr, $temp);
                                        }
                                }
                        }
                        closedir($dh);
                }
                return $file_arr;
        }
        return 0;
}
function rename_filename($str)
{
        $dir    = dirname($str);
        $oldname = basename($str);
        $newname = iconv("euc-kr", "utf-8", $oldname);
        if ($oldname != $newname)
        {
                rename("$dir/$oldname", "$dir/$newname");

                echo "$dir/$oldname";
                echo " ";
                echo "$dir/$newname";
                echo "\n";
        }
}

$path_root = '/data1/webhome/';//홈페이지 경로
$path = 'webdata/oldimage/File1/';//홈페이지 경로 아래 파일리스트 가져올 디렉토리
$php_arr = myallfile($path_root.$path);

for($i = 0 ; $i < count($php_arr) ; $i++)
{
        rename_filename($php_arr[$i]);
}
?>

언제나와 마찬가지로...
속도 테스트입니다.

이번에는 친구에게 변수 읽기 속도에 대해 '이게 빠르다던데?' 라는 소리를 들어
시작한 테스트입니다.

$str['test'];
$str[test];

이 두 경우의 속도 차이입니다.

$str['test'] = "This is STRING
";
$str[test] = "This is STRING
";

이렇게 나눠서 시행했으며...
for문으로 페이지에 천 번 출력할 때까지 걸린 시간을 쟀습니다.

전자를 1번 후자를 2번으로 칭하겠습니다.

1. for($i=0; $i < 1000; $i++) echo $str['test'];

2. for($i=0; $i < 1000; $i++) echo $str[test];


1번의 경우 0.0004초
2번의 경우 0.0019초

ㅡ,.ㅡ;;
이건 뭐.. 보기에도 확연히 차이가 나서 의미가 없네요.

$str[test] 이런 식의 코딩 패턴이 익숙한 저로선 충격적인 일입니다..

뭐... 그래도 대규모 프로그래밍 아니면 아무래도 좋은 문제겠죠..?

에휴...
(변수 수정 언제 다 해..)

데모버전 : http://bizzaru.bicharu.com/bicharu_webhard/

다운로드는 데모 버전 안에 있습니다.

웹하드가 급하게 필요해서 하나 만들었습니다.
여기에 나와있는 공개용 소스를 많이 이용했습니다.
도움을 주신 분들게 감사합니다.

혹시 제가 사용한 것중에 사용을 금하는게 있으면 알려주시면 감사하겠습니다.


1. apm , activex(업로드 모듈) 입니다.
2. 최대한 원도우 탐색기와 업비슷하게 만들려고 노력했습니다.
3. 마우스 우클릭됩니다.
전체에서 마우스 우클릭, 혹은 파일에서 우클릭 각각 나옵니다.
선택 및 해제는 TD 필드 마우스 클릭하면 됩니다.

4. 개인용으로 만든거라, 보안이나,기타 퍼포먼스 등등 검증이 약합니다.

5. 잘못된게 있거나 더 좋은 알고리즘이 있으시면 의견 부탁드립니다.

* 설명
  - 웹 게시판에 음성 첨부를 위한 모듈입니다.

 
* 특징
  - 음성 전송 부분만 Active-X로 구성되어 있습니다.
  - 따로 파일 서버가 필요없습니다. 서버를 사용합니다.  (upload.php 참고)
  - Active-X 와 별개로 UI 작업을 자유롭게 하는 것이 효율적이라고 생각하여,
    UI 는 Active-X 에서 제거했습니다.  자바스크립트나 html 등으로 치장하셔야 합니다.
        . Active-X 폼 (화면)을 보이지 않게 하시는 편이 좋을 듯 합니다.
    - 코덱은 ADPCM 을 사용하였습니다.
    - 음성 데이터를 메모리에 보관하였다가 서버로 전송합니다.
        . 백신이나 보안 등의 문제로 Active-X 에서 파일을 접근하지 못할 것을 피해가기 위함
 
 
* 사용법
  - 압축을 풀고 Reg.bat 배트맨 파일을 실행하세요.
  - Active-X 가 등록 되면, 테스트 사이트 (http://210.216.14.132/voice)
    또는 자신이 본 모듈을 설치한 사이트에 접속하세요.
  - 녹음을 누르시고 녹음 하시고, 녹음이 끝나면 중지를 클릭하세요.
  - 재생을 누르면 녹음된 것을 확인할 수 있습니다.  이때 음질이 떨어진 상태로 들립니다.
      아직은 클라이언트에 데이터가 존재합니다.
  - 확인이 끝나시면 업로드를 클릭합니다.
      이제 서버로 데이터가 전송됩니다.
  - 업로드된 화일 확인을 클릭하시면 서버에 올라간 파일이 실행됩니다.
  - 테스트 종료하시고 Active-X 가 필요 없으시면 UnReg.bat 배트맨 파일을 호출하세요
 
 
* 기타
  - 첨부된 ocx 파일에는 인증서가 없습니다.  비스타 등에서는 설치하실 때 문제가 될 수 있습니다.
  - 본 모듈은 사용상에 아무런 제약점이 없습니다.

* 첨부파일 참고.

* 설명
  - 웹 상에서 대용량 파일을 업로드 하기 위한 모듈입니다.


* 특징
  - 파일 업로드 부분만 Active-X로 구성되어 있습니다.
  - Active-X 와 별개로 UI 작업을 자유롭게 하는 것이 효율적이라고 생각하여,
    UI 는 Active-X 에서 제거했습니다. 자바스크립트나 html 등으로 치장하셔야 합니다.
    . Active-X 폼 (화면)을 보이지 않게 하시는 편이 좋을 듯 합니다.
  - 파일 서버는 현재 윈도우즈 용만 제공합니다. 
    . Kylix 를 통해서 리눅스용 데몬을 공개할 예정입니다.
    . http://www.codeway.co.kr/board/bbs/tb.php/Delphi_PDS/141 에 가시면
      서버와 클라이언트의 소스가 있으니 직접 변경하셔도 됩니다.


* 사용법
  - FileShot.zip 파일을 다운 받으세요.
  - 압축을 풀고 Reg.bat 배트맨 파일을 실행하세요.
  - Active-X 가 등록 되면, http://210.216.14.132/fileshot
    또는 자신이 본 모듈을 설치한 사이트에 접속하세요.
  - 서버에서 Server.exe를 실행하세요.
    . 파일서버를 웹 서비스 폴더 밖에 두시는 것이 보안에 좋습니다.
    . 웹 서비스 폴더 안에 파일서버를 두시면, 해킹 가능한 스크립트 등을 올릴 수가 있습니다.
    . 웹 서비스 폴더 밖에 파일이 업로드 되고, php 등을 통해서 인증된 사용자만이 파일에 접근할 수 있도록 하는 것이 좋습니다.
  - [업로드] 를 클릭 하시고 업로드 하실 파일을 선택하세요.
  - 업로드를 중지하시고 싶을 때는 [중지] 를 클릭하세요.
  - 상태 창에는 현재 상태와 업로드의 진행률을 표시하여 줍니다.
  - 테스트 종료하시고 Active-X 가 필요 없으시면 UnReg.bat 배트맨 파일을 호출하세요


* 기타
  - 첨부된 ocx 파일에는 인증서가 없습니다. 비스타 등에서는 설치하실 때 문제가 될 수 있습니다.
  - 서버에 파일은 랜덤한 숫자로 저장이 됩니다.  DB 등을 이용하여 올린 실제 파일 이름을 매칭 시켜두셔야 합니다.
  - 본 모듈은 사용상에 아무런 제약 점이 없습니다.

* 압축파일을 다운받으세요.

http://oxtag.com/html/ex/selectbox/selectbox/selectbox20070510.html

<title>셀렉트박스 꾸미기</title>
<script>
//셀렉트박스 꾸미기 v1.2
//================================================ JS
var zindex = 10000;
select_count = new Array();
ev_click     = new Array();

function insert_select ( sn,w,f,b,g,c,img,event) {
ev_click[sn]    = event;
select_count[sn] = 0;
zindex--;
document.write("<input type=hidden name="+sn+" id="+sn+" value=''>");
document.write("    <table border='0' cellspacing='1' cellpadding='1' width='"+w+"'  style='table-layout:fixed;width:"+w+";' bgcolor='"+b+"' onclick='select_click(\""+sn+"\");' >");
document.write("    <tr>");
document.write("        <td bgcolor='"+g+"'>");
document.write("            <input type='text' id='"+sn+"_select_name' name='"+sn+"_select_name' style='border:none;cursor:hand;width:100%;font-size:"+f+"pt;' onselectstart=\"return false\" readonly> ");
document.write("        </td>");
if(img != "") {
document.write("    <td width=18 bgcolor='"+g+"' align=center valign=bottom style='cursor:hand'><img src='"+img+"' align='absmiddle'></td>");        
} else {
document.write("    <td width=18 bgcolor='"+g+"' align=center valign=bottom style='cursor:hand'>▽</td>");
}
document.write("    </tr>");
document.write("    </table>");

document.write("<div id='"+sn+"_select_div' name='"+sn+"_select_div'  style='display:none;z-index:"+zindex+";position:absolute;cursor:hand'  onmouseover='"+sn+"_select_div.style.display=\"\";' onmouseout='"+sn+"_select_div.style.display=\"none\";'>");
document.write("        <table border='0' cellspacing='1' cellpadding='1' bgcolor='"+b+"' width="+w+" onmouseover='"+sn+"_select_div.style.display=\"\";'>");
document.write("        <tr><td bgcolor='"+g+"' style='line-height:1.3em;' id='"+sn+"_select_span'></td></tr>");
document.write("        </table>");
document.write("    </div>");
}

function insert_select_option(sn,f,b,g,c,v,vv,chk)     {    
select_count[sn] ++;    
option_html = "<span style='width:100%;font-size:"+f+"pt' onclick='"+sn+"_select_name.value=\""+vv+"\";"+sn+".value=\""+v+"\";"+sn+"_select_div.style.display=\"none\";"+ev_click[sn]+";' onmouseover='this.style.background=\""+c+"\"' onmouseout='this.style.background=\""+g+"\"'>"+vv+"</span><br>";

if(select_count[sn] == 1 || chk == "Y" ) {
document.getElementById( sn+"_select_name" ).value = vv
document.getElementById( sn).value = v
}
document.getElementById( sn+"_select_span").innerHTML += option_html;
}

function  select_click(sn)     {    
if ( document.getElementById( sn+"_select_div").style.display == "none") {
document.getElementById( sn+"_select_div").style.display = "";
} else {
document.getElementById( sn+"_select_div").style.display = "none";
}
}
////================================================ JS
</script>


<table>
<tr>
<td>

<script>
////================================================ 사용
//insert_select(저장변수명,가로,폰트크기,보드색,배경색,선택색,화살표이미지);
insert_select("test3","70","8","F6D8B0","FFFFFF","F6D8B0","");

//insert_select_option(저장변수명,폰트크기,보드색,배경색,선택색,value,view_value,초기선택여부:(Y선택);
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","1","1번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","2","2번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","3","3번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","4","4번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","5","5번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","6","6번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","7","7번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","8","8번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","9","9번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","10","10번");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","11","11번","Y");
insert_select_option("test3","8","F6D8B0","FFFFFF","F6D8B0","12","13번");
////================================================ 사용
</script>    

</td>
<td>

<input type="button" onclick="alert(document.all.test3.value);" value="테스트">

</td>
</tr>
</table>

웹표준에 맞게 코딩했으며 이미지를 포샵처리해서 일일이 비교 작업해서 만든것이니
정확합니다
테스트된 브라우져는 익스 파이어폭스 오페라 네스케이프등 4개의 브라우져에서
이상 없이 출력되는 것을 확인했습니다

5픽셀 라운드 처리된 것이며 2중 테두리를 가진 테이블입니다
바깥 테두리 바깥 배경 안쪽 테두리 안쪽 배경을 적절히 조절해서 사용하시면 됩니다

자바 스크립트로 만들면 편하겠지만 시간이 없어서 거기까진 아직 손을 대지 않았습니다
필요하신 분은 자바스크립트로 만들어 지정된  div 에서 쓸수 있게 하면 될 것입니다

단점은 지정된 라운드를 쓰기 때문에 더 둥근 테이블이나 바깥과 안쪽의 경계선이
5픽셀 이상 벌어지는 지원이 되지 않습니다

주의 하실것은 내용 들어가는 부분을 적절히 줄바꿈 태그로 지정된 넓이 만큼
벗어나지 않도록 해야 합니다  줄바꿈이 되지 않으면 우측 경계부분이 깨집니다



첫번째 링크는 소스 적용된 테이블의 모양을 보실수 있습니다





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko" lang="ko">
<head>
<style type="text/css">
body {
    font: 14px Arial, Helvetica, sans-serif;
    color: #000;
    background-color: yellow;
}
/*
 사용법:

┏━━━━━━━━━━━━  높이와 넓이  ━━━━━━━━━━━━━┓
┃넓이  : 테이블을 감싸줄 DIV에서 조절                                            ┃
┃높이  : .CONTENTS에서 높이와 마진을 조절                                  ┃
┗━━━━━━━━━━━━  높이와 넓이  ━━━━━━━━━━━━━┛

┏━━━━━━━━━━━━ 바깥쪽 테이블 ━━━━━━━━━━━━━┓
┃테두리 색 :                                                                                ┃
┃ .rt1에서 .rt6까지는 border-right border-left의 색을 조절                  ┃
┃ .rt7 은 background-color로 라인의 색을 맞춰줌                                ┃
┃                                                                                                ┃
┃배경색    :                                                                                  ┃
┃.rt1에서 .rt6까지 background-color로 맞춤                                      ┃
┗━━━━━━━━━━━━ 바깥쪽 테이블 ━━━━━━━━━━━━━┛

┏━━━━━━━━━━━━━ 안쪽 테이블 ━━━━━━━━━━━━━┓
┃테두리 색 :                                                                                ┃
┃.rt1in1 에서 .rt2in4 까지는 border-right border-left의 색을 조절          ┃
┃.rt2in5 는 background-color로 라인의 색을 맞춰줌                            ┃
┃                                                                                                ┃
┃배경색    :                                                                                  ┃
┃.rt1in1 에서 .rt2in4 까지 background-color로 맞춤                            ┃
┗━━━━━━━━━━━━━ 안쪽 테이블 ━━━━━━━━━━━━━┛

*/

/* 바깥쪽  테이블: 시작 */
.rt1{
    background-color: #fdfdfd;
    border-right: 1px solid #ccc;
    border-left: 1px solid #ccc;
    margin  : 0px  0px 0px 0px;
    padding : 0px;
    overflow: hidden;
    height  : 4px;
}
.rt2{
    background-color: #fdfdfd;
    border-right: 1px solid #ccc;
    border-left: 1px solid #ccc;
    margin  : 0px  1px 0px 1px;
    padding : 0px;
    overflow: hidden;
    height  : 2px;
}
.rt3{
    background-color: #fdfdfd;
    border-right: 1px solid #ccc;
    border-left: 1px solid #ccc;
    margin  : 0px  2px 0px 2px;
    padding : 0px;
    overflow: hidden;
    height  : 1px;
}
.rt4{
    background-color: #fdfdfd;
    border-right: 1px solid #ccc;
    border-left: 1px solid #ccc;
    margin  : 0px  3px 0px 3px;
    padding : 0px;
    overflow: hidden;
    height  : 1px;
}
.rt5{
    background-color: #fdfdfd;
    border-right: 1px solid #ccc;
    border-left: 1px solid #ccc;
    margin  : 0px  4px 0px 4px;
    padding : 0px;
    overflow: hidden;
    height  : 1px;
}
.rt6{
    background-color: #fdfdfd;
    border-right: 2px solid #ccc;
    border-left: 2px solid #ccc;
    margin  : 0px  5px 0px 5px;
    padding : 0px;
    overflow: hidden;
    height  : 1px;
}
.rt7{/* 상하단 라인 */
    background-color: #ccc;
    margin  : 0px  7px 0px 7px;
    padding : 0px;
    overflow: hidden;
    height  : 1px;
}
.rtoutLRline{/* 좌우 라인 */
    background-color: #fdfdfd;
    border-right: 1px solid #ccc;
    border-left: 1px solid #ccc;
    margin  : 0px  0px 0px 0px;
    padding : 0px;
    overflow: hidden;
}

/* 바깥쪽  테이블: 끝 */


/* 안쪽 테이블: 시작 */
.rt2in5{/* 상하단 라인 */
    background-color: #000;
    margin  : 0px  8px 0px 8px;
    padding : 0px;
    overflow: hidden;
    height  : 1px;
}
.rt2in4{
    background-color: #F2F2F2;
    border-right: 2px solid #000;
    border-left: 2px solid #000;
    margin  : 0px  6px 0px 6px;
    padding : 0px;
    overflow: hidden;
    height  : 1px;
}
.rt1in3{
    background-color: #F2F2F2;
    border-right: 1px solid #000;
    border-left: 1px solid #000;
    margin  : 0px  6px 0px 6px;
    padding : 0px;
    overflow: hidden;
    height  : 1px;
}
.rt1in2{
    background-color: #F2F2F2;
    border-right: 1px solid #000;
    border-left: 1px solid #000;
    margin  : 0px  5px 0px 5px;
    padding : 0px;
    overflow: hidden;
    height  : 2px;
}
.rt1in1{
    background-color: #F2F2F2;
    border-right: 1px solid #000;
    border-left: 1px solid #000;
    margin  : 0px  4px 0px 4px;
    padding : 0px;
    overflow: hidden;
    height  : 1px;
}

.rtinLRline{/* 좌우 라인 */
    background-color: #F2F2F2;
    border-right: 1px solid #000;
    border-left: 1px solid #000;
    margin  : 0px  4px 0px 4px;
    padding : 0px;
    overflow: hidden;
}

/* 안쪽 테이블: 끝 */


/* 내용 테이블 */
.CONTENTS{
    margin  : 0px  0px 0px 0px;
    padding : 5px  10px 5px 10px;
    height  : 100px;

}
</style>

</head>
<body>

css 처리한 라운드
<div style="margin : 0px 10px 0px 0px; width: 250px;">
    <div class="rt7"></div>
    <div class="rt6"></div><div class="rt5"></div> 
    <div class="rt4"></div><div class="rt3"></div> 
    <div class="rt2">
          <div class="rt2in5"></div><div class="rt2in4"></div>
    </div>
    <div class="rt1">
          <div class="rt1in3"></div><div class="rt1in2"></div>
          <div class="rt1in1"></div>
    </div>
    <div class="rtoutLRline">
    <div class="rtinLRline">

          <div class="CONTENTS">
          내용을 이곳에 넣으시면 됩니다 ^_____________________^*
          </div>

    </div>
    </div>
    <div class="rt1">
          <div class="rt1in1"></div><div class="rt1in2"></div>
          <div class="rt1in3"></div>
    </div>
    <div class="rt2">
          <div class="rt2in4"></div><div class="rt2in5"></div>
    </div>
    <div class="rt3"></div><div class="rt4"></div>
    <div class="rt5"></div><div class="rt6"></div>
    <div class="rt7"></div>
</div>
</body>
</html>

// 월의 몇째 주인지
function getWeekNum($timestamp) {
    $w = date('w', mktime(0,0,0, date('n',$timestamp), 1, date('Y',$timestamp)));
    return ceil(($w + date('j',$timestamp)) / 7);
}


// 월의 총 주
$총주수 = getWeekNum(strtotime('last day', $timestamp));






 $_SERVER["HTTP_ACCEPT_LANGUAGE"]



사용법 :


if ( preg_match('/ko/', $HTTP_ACCEPT_LANGUAGE) )
     header("Location: /korean/");
     exit;
}
else {
     header("Location: /english/");
     exit;
}

if($_GET["page"]) $page = $_GET["page"]; // 현재 페이지 구하기
else $page = 1;

$total = 980; // 총 게시물 수
$pg_scale = 10; // 한페이지에 출력 될 목록 수
$pg_group = 20; // 보여질 페이지 수 ([1][2][3]이런거)
$pg_select = ($page - 1) * $pg_scale;
$pg_total = ceil($total / $pg_scale); // 총 페이지 수 구하기
$pg_half = floor($pg_group/2);

echo "<a href='?page=1'>처음</a> "; // 첫 페이지
$pg_half3 = $page>($pg_total-5) ? 10-($pg_total-$page) : $pg_half;
for($i=0;$i<$pg_half3;$i++) {
    $j = $page - $pg_half3 + $i;
    if($j > 0) {
        echo " <a href='?page=$j'>$j</a> "; // 현재 페이지의 앞페이지들
    }
}
echo " <b>$page</b> "; // 현재 페이지
$pg_half2 = $page<5 ? 10-$page : $pg_half;
for($i=0;$i<$pg_half2;$i++) {
    $j = $page + $i + 1;
    if($j <= $pg_total) {
        echo " <a href='?page=$j'>$j</a> "; // 현재 페이지의 뒷페이지들
    }
}
echo " <a href='?page=$pg_total'>끝</a>"; // 끝 페이지

첨부파일 참고!


안녕하세요?
'Eisemheim'(구 eitech)입니다.
갑작스럽게 개명을 한건 그냥 그러고 싶었습니다 -_-;;

우선 soap하면 생소하신분들도 있을테고 RPC에 관심이 많으신분들은
한번쯤은 써보셨으리라 생각됩니다.
또한 sms나 mms문자전송을 서비스하시는분들은 다들 사용해보셨을겁니다.
(왜냐구요? 저도 sms/mms때문에 soap에 빠졌거든요 -_-;;)
그럼 서론으로 들어가자면..

1. 왜 soap에대해 글을 올리느냐?!

xml전문을 이용한 서버간의 통신입니다.
이미 phpschool에도 soap으로 통신을 시도한분들이 몇분 계시더군요..
저도 처음에는 그걸보고 시작했습니다만,
약간 자료가 부족한듯해서..
(강좌가 부실하다는 뜻이 아닙니다 -_-;;)

2. 그럼 왜 xml전문을통해 서버간에 통신을 해야하느냐?

말이 서버간의 통신이지..
soap의 발단은 이렇습니다.
웹프로그램과 일반 소켓 프로그램간의 호환성때문입니다.
xml은 웹에서나 소켓에서나 파싱라이브러리가 있어서 쓰게 됬다고 합니다.
(그렇게 자료를 읽었습니다..)

서론이 길면 읽지도 않을테니..
본론으로 들어가겠습니다.


준비물이 필요합니다.
nusoap 라이브러리, Mail Mime, PEAR(?)
이거 3개면 됩니다.

nusoap라이브러리는 soap통신을 하기위한 클레스입니다.
그리고 Mail Mime은 이름에서도 알수가 있듯이
Mail과 관련된 함수 입니다. e-mail보낼때 파일첨부하려면
멀티파트로 보내잖아요? soap도 파일을 전송할때 멀티파트로 보냅니다.
PEAR(?) 이건..뭐.. 저도 뭔지 모릅니다 -_-;;
그냥 인클루드 에러나서 찾아보니 있더군요..;;
(PHP실력이 그다지 좋은게 아니라..)


그럼 준비는 끝났고,
서버 구성을 한번해보겠습니다.

[soapServer.php]

일단 기본적인 soap라이브러리를 인클루드 합니다.
include_once("soapLib/nusoap.php");
include_once("soapLib/nusoapmime.php");


$server = new nusoapservermime();
soap서버를 생성합니다.
여기서 soapserver로 생성하시면 파일전송이 안됩니다 -_-;;

$server->configureWSDL('getfile', 'urn:getfile');
WSDL설정을 합니다.
WSDL이 뭐냐 하면요..
Web Services Description Language의 약어로
SOAP 메시지 집합 및 해당 메시지가 교환되는 방법을 설명하는 XML 문서입니다.
wsdl을 함수 명으로 했습니다.
그리고 urn도 함수명으로 했구요

$server->register('getfile', array("fileName"=>"xsd:String"), array("return"=>"xsd:String"), 'namespace', 'namespac#getfile');
함수를 등록합니다.
soap을 정확히 설명드리자면,
서버쪽에 정의 되어있는 함수/클레스를 실행시키는겁니다.
API라고 해야하나요? 아무튼 그렇습니다.

getfile는 함수 명입니다.
그리고 두번자 인자는 배열이어야 합니다.
fileName는 클라이언트 쪽에서 보내는 첫번째 인자, 그리고 xsd:String은
클라이언트쪽에서 저희쪽으로 보내는 값의 형태입니다.
php에서는 별 상관 없다 느껴지겠지만
php 외에는 민감하게 반응합니다.
그리고 세번재 인자는 반환되는 값입니다.
함수에서 return을 생각하시면됩니다.
반환되는것도 어떤형태인지 정해주시면 됩니다.
namespace, namespace#getfile << 이건 저도 아직정확히 개념을 못잡았습니다 -_-;;


$server->service($HTTP_RAW_POST_DATA);
이건..!!
왠지 예전에 POST로 받을때랑 비슷하지죠?
XFORM이라는건대요 php.net가보면 자세히 나와있습니다.
간단하게 설명드리자면 xml로 form값을대체해서 전송하는 어쩌고저쩌고...
아무튼, 받은 XML을 클레스에 넣습니다.

그럼!! soap서버 셋팅은 끝났습니다!!
뭐이리 간단하냐구요?

nusoap.php를 열어보십시오..
눈돌아갑니다 -_-;;

그럼 정리를 하면.

include_once("soapLib/nusoap.php");
include_once("soapLib/nusoapmime.php");

$server = new nusoapservermime();
$server->configureWSDL('getfile', 'urn:getfile');
$server->register('getfile', array("fileName"=>"xsd:String"), array("return"=>"xsd:String"), 'namespace', 'namespac#getfile');
$server->service($HTTP_RAW_POST_DATA);

요렇게 되겠네요.
여기서 끝이냐구요?
당연히 아니죠 -_-;;

function getfile($fileName){
  global $server;
  $server->getAttachments($HTTP_ROW_POST_DATA);
  foreach($server->requestAttachments as $value){
    $responseData[] = $value;
  }
 
  foreach($responseData as $key => $value){
    $fp = fopen("data/".$responseData[$key]['filename'], "a+");
    fwrite($fp, $responseData[$key]['data']);
    fclose($fp);
  }
 
  return "success";
}

register에서 정의한 함수명으로 함수를 하나 만드시고 받는값과 리턴값을 정의한대로
함수를 만드시면 됩니다. 위의 함수에서 궂이 설명이 필요한부분은

$server->getAttachments($HTTP_ROW_POST_DATA);
  foreach($server->requestAttachments as $value){
    $responseData[] = $value;
  }
이부분이죠.
이건 Mail Mime으로 받은 xml과 그 밑에 첨부된 파일들을 쪼개는겁니다.
그리고 foreach로 돌면서 파일을 배열에 넣는거죠.

생각외로 간단하군요 -_-;;
그럼, 서버 구축은 끝입니다.
(벌써?)

그럼 확인해보시면 됩니다.
전 url이 이렇게 되네요

http://eisemheim.com/_sample/soap/soapServer.php

접속하셔서 저랑 비슷한 화면이 나오는지 보시고
안나온다면 다시처음부터 차근차근..
그래도 안나오면 개별면담 요청하세요 -_-;;




이번에는 클라이언트를 구축해보겠습니다.

[soapClient.php]

require_once("soapLib/nusoap.php");
require_once("soapLib/nusoapmime.php");
역시나 nusoap라이브러리를 인클루드 합니다.

$client = new soapclientmime('http://eisemheim.com/_sample/soap/soapServer.php?wsdl', true);
클라이언트 객체를 생성합니다.
인자값으로 soap서버의 wsdl주소를 주면 됩니다.
wsdl주소는 어디냐구요?
soap서버 구축해놓은 파일명뒤에 ?wsdl붙이시면 거기가 wsdl주소입니다.

$client->setHTTPEncoding('deflate, gzip');
HTTP규격에 맞는 인코딩을 선언합니다.


$fp = fopen("test.mp3","rb");
while(!feof($fp)){
  $file .= fgets($fp);
}
리드 바이너리로 첨부할 파일을 읽어주세요

$cid = $client->addAttachment($file,"받아라.mp3");
척보시면 알겠지만 Attachment를 추가합니다.
Attachment가 뭐냐구요? mime 파트를 추가한다고 생각하시면 됩니다.
첫번째 인자값은 파일 자채이고, 두번째는 파일명입니다.

$result = $client->call('getfile',array("fileName"=>"받아라.mp3"));
call~! 서버를 불러주세요~

getfile라는 함수를 실행시켜주시고, 첫번째 인수로 fileName라는 변수에 '받아라.mp3'라는 값을 보냅니다.

그럼 클라이언트도 끝났네요~

require_once("soapLib/nusoap.php");
require_once("soapLib/nusoapmime.php");
$client = new soapclientmime('http://eisemheim.com/_sample/soap/soapServer.php?wsdl', true);
$client->setHTTPEncoding('deflate, gzip');
$fp = fopen("test.mp3","rb");
while(!feof($fp)){
  $file .= fgets($fp);
}
$cid = $client->addAttachment($file,"받아라.mp3");
$result = $client->call('getfile',array("fileName"=>"받아라.mp3"));

이러면 끝난겁니다 -_-;;

헌대...
이렇게 해놓으면 결과를 모르잖아요?
echo '

Request

' . htmlspecialchars($client->request, ENT_QUOTES) . '
';
echo '

Response

' . htmlspecialchars($client->response, ENT_QUOTES) . '
';
echo '

Debug

' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '
';

디버그입니다.

자채 테스트를 해본결과 30mb까지 전송해봤습니다.
단, php.ini 에서 max_execution_time = 0; 으로 설정하셔야합니다.
인내심만 있으면 무재한으로 갈듯합니다 -_-;;

첨부파일 보시고 참고하세요.

그럼.. 이만.. -_-/




PS. http://eisemheim.com/_sample/soap/soapServer.php << 이쪽으로 파일 전송하시면 혼납니다 -┏


기능 :
1. 데이터 로딩중 표시.
2. 데이터처리 건수 표시
3. 소요시간 표시

Special Thanks : BL님





<?
#### 로딩부분 첫번째 단락 ####

function mtime()
{
    $time = explode( " ", microtime());
    $usec = (double)$time[0];
    $sec = (double)$time[1];

    return $sec + $usec;
}

$t_start = mtime();

// 로딩중입니다 표시 header start
$loading_html = "
<div id='delay' name='delay' style='position:absolute; left:0;top:0;z-index:1;display:none;width:100%;height:100%'>
<table border='0' cellpadding='0' cellspacing='0' width='100%' height='100%'>
<tr><td align='center'>로딩중입니다.<br><span id='countBox'></span><br><span id='countData'></span><br><img src='./imgs/nowloading.gif'></td></tr>
</table>
</div>
<script language='javascript'>
<!--
document.all.delay.style.display = '';

var min_inc = 0;
var sec_inc = -1;
function countUp(){
    if (sec_inc == 59) min_inc++;
    sec_inc = (sec_inc + 1) % 60;
    var min_no = min_inc;

    if (sec_inc >= 10)
        var sec_no = sec_inc;
    else var sec_no = '0' + sec_inc;

    if (min_no != 0)
    {
        min_no_val = min_no+\"분 \";
    }else {
        min_no_val = \"\";
    }

    document.getElementById('countBox').innerHTML = \"소요시간 : \" + min_no_val + sec_no+\"초\";
   
    setTimeout(\"countUp()\", 1000);
}
    setTimeout(\"countUp()\", 1000);
//-->
</script> ";
echo $loading_html;
flush();

// 로딩중입니다 표시 header end
#### 로딩부분 첫번째 단락 ####
?>



<?
**** 데이터 처리부분 시작****

#### 로딩부분 두번째 단락 ####
    $count_data++;
    if (($count_data % 10) == 0) {
        print "<script>document.getElementById('countData').innerHTML = \"처리건수 : \" + $count_data+\"건 \"; </script><br>\n";
        flush();
    }

#### 로딩부분 두번째 단락 ####

**** 데이터 처리부분 종료****
?>


<?
#### 로딩부분 세번째 단락 ####

$t_end = mtime();
$t_gap = sprintf("%2.3f" ,$t_end - $t_start);

$count_data = number_format($count_data);
?>

<!-- // 로딩중입니다 표시 tail start -->
<script language="javascript">
<!--
document.getElementById('delay').style.display = "none";
//-->
</script>
<!-- // 로딩중입니다 표시 tail end -->

<?
### 안내문출력
echo ("<script>alert!!('데이터를 추가하였습니다.\\n\\n총소요시간 : $t_gap 초\\n총건수 : $count_data 건');</script>")
;
#### 로딩부분 세번째 단락 ####
?>


------------------------------------------------------------------------------


다른거..


<script type="text/javascript">
<!--
function setProgress(nPercent){
    var DIV = document.getElementById('IDS_DIV_PROGRESS')
    DIV.childNodes[0].style.width = nPercent + "%";
    DIV.childNodes[1].innerHTML = nPercent + "%";
}
function setProgressMsg(str){
    var DIV = document.getElementById('IDS_DIV_PROGRESS_TEXT')
    DIV.innerHTML = str;
}
//-->
</script>
<table cellspacing="2" bgcolor="#FFFFFF" cellpadding="2" width="200" class="cssProgress" ID="IDS_PROGRESS_FRAME" style="display:none;">
<tr>
    <td>
        <div style="border:#000080 1px solid;position: relative;padding:1px" id="IDS_DIV_PROGRESS"><div style="width:0%;" class="cssProgressBar"></div><div style="text-align:center;;top:0px;width:100%;position:absolute;color:#000000;padding-top:2px">0%</div></div>
        <div style="padding-top:2px" id="IDS_DIV_PROGRESS_TEXT"></div>
        </div>
    </td>
</tr>
</table>
<iframe name="fraExecute"></iframe>
------------------------------------
IFRMA 소스
------------------------------------
<?php
    function displayTime($nSec){return sprintf("%02d:%02d:%02d",  Round($nSec / 3600, 1), Round(($nSec / 60) % 60, 1), Round($nSec % 60));}

    $tmBegin = time();
    $nRows = 데이터 총 데이터 수;
    $nIndex =0; // 레코드 순번
?>
<script>
    parent.document.getElementById('IDS_PROGRESS_FRAME').style.display='';
    parent.setProgress(0);
    parent.setProgressMsg('서버로 부터 상품 정보 갱신 중... 몇분의 시간이 소요될 수 있습니다.<br>0/<?=number_format($nRows)?> 건, 경과: 00:00:00');
</script>
<?php
    flush();
    while($Row = $Ora->Assoc()):
        $nIndex++;
        $nDiff=time()-$tmBegin;
        $sTerm = displayTime( ($nDiff / $nIndex) *$nRows );
        $nCurrPercent = (INT)(($nIndex / $nRows ) * 100);
?>
<script>
    parent.setProgress(<?=$nCurrPercent?>);
    parent.setProgressMsg('서버로 부터 상품 정보 갱신 중... 몇분의 시간이 소요될 수 있습니다.<br><?=$nIndex?>/<?=number_format($nRows)?> 건, 경과: <?=$sTerm?>');
</script>;
<?
        flush();
    endwhile;
?>

페이징

인터넷정보2007. 10. 11. 22:09

<?php
$page = $_REQUEST["page"];
if(!$page) $page = 1;

$total_num = 151;  // 전체 레코드수
$pagesize = 10; // 페이지 당 뿌릴 레코드 수
$pagePerBlock = 10; // [1] ~ [10] 까지 한번에 10개씩
$search = "&search=문자"; //GET 방식으로 추가 문자열을 넣는다
function handlePage($total_num,$pagesize,$pagePerBlock,$page,$search){ // 전체레코드,  페이지당 레코드수(10) , 블럭당페이지수(10), 현재페이지

    $totalNumOfPage = ceil($total_num/$pagesize); //16page
    $totalNumOfBlock = ceil($totalNumOfPage/$pagePerBlock); //2block
    $currentBlock = ceil($page/$pagePerBlock); // 1page
       
    $startPage = ($currentBlock-1)*$pagePerBlock+1;  // 1page
    $endPage = $startPage+$pagePerBlock -1; // 10page
    if($endPage > $totalNumOfPage) $endPage = $totalNumOfPage;
   
    //NEXT,PREV 존재 여부
    $isNext = false;
    $isPrev = false;
   
    if($currentBlock < $totalNumOfBlock)    $isNext = true;
    if($currentBlock > 1)                    $isPrev = true;
   
    if($totalNumOfBlock == 1){
        $isNext = false;
        $isPrev = false;
    } 
   
    if($isPrev){
        $goPrevPage = $startPage-$pagePerBlock; // 11page
        echo "<a href=\"$PHP_SELF?page=$goPrevPage$search\">◀</a>";       
    }else{
        echo "◀";
    }
    for($i=$startPage;$i<=$endPage;$i++){
        if($page==$i){
            echo "<b>[".$i."]</b>";
        }else{
            echo "<a href=\"$PHP_SELF?page=$i$search\">[".$i."]</a>";
        }
    }
    if($isNext){
        $goNextPage = $startPage+$pagePerBlock; // 11page
        echo "<a href=\"$PHP_SELF?page=$goNextPage$search\">▶</a>";
    }else{
        echo "▶";
    }
}

handlePage($total_num,$pagesize,$pagePerBlock,$page,$search);
?>

/*=========================
함수 사용법
mail_fsend(받는사람,제목,메세지,추가해더,첨부할 파일)
참고 : 첨부할 파일은 메일이 발송되는 서버안에서의 파일임
참고 : 업로드와 연계해서 사용할 경우 알아서 업로드된 파일을 첨부해서 메일을 보냅니다.

언제나 '공대여자는 예쁘다'는 마음가짐이 있어야 사용하실 수 있습니다.
==========================*/
function mail_fsend($tos,$subject,$message='',$addtion_header='',$files=array()){
//첨부파일 가능용
/*
추천 해더설정
$addtion_header['content_type']  ='text/html';
$addtion_header['char_set']='UTF-8'; or $addtion_header['char_set']='EUC-KR';
*/
// $files: 는 서버내의 파일을 지목할 때 사용
    //============================================== 기초 설정
    $boundary = "----=b".md5(uniqid(time()));
    
    $content_type= $addtion_header['content_type'];    //기본내용형식 : 일반 text
    if(empty($content_type)) $content_type='text/plain';            //기본문자셋 : utf-8    
    $char_set = $addtion_header['char_set'];
    if(empty($char_set)) $char_set='UTF-8';            //기본문자셋 : utf-8
    //=====================================================to 설정
    if(is_string($tos)){
        $to = $tos;
    }else if(is_array($tos)){
        $to = implode(', ',$tos);
    }
    //=====================================================subject 설정
    if(empty($subject)){
    $subject = 'No title '.date('Y-m-d H:i:s');
    }
    //$subject = '=?EUC-KR?B?'.base64_encode($subject).'?=';
    $subject = '=?'.$char_set.'?B?'.base64_encode($subject).'?=';     
    //=====================================================해더 설정
    $headers=array();
$headers['mime_version']='MIME-Version: 1.0';
//$headers['content_type']="Content-type: multipart/alternative; boundary=\"{$boundary}\"";
$headers['content_type']="Content-type: multipart/mixed; boundary=\"{$boundary}\"";


    if(!empty($addtion_header['from'])){        $headers[]= "From: ".$addtion_header['from'];    }
    else{        $headers[]= "From: webmaster@{$_SERVER['SERVER_NAME';]}";    }    
    if(!empty($addtion_header['cc'])){        $headers[]= "cc: ".$addtion_header['cc'];    }
    if(!empty($addtion_header['bcc'])){        $headers[]= "Bcc: ".$addtion_header['bcc'];    }            

    if(!empty($headers)){        $header = implode("\r\n",$headers)."\r\n";    }
    else{        $header ='';    }
    //======================================================== 메세지 인코딩
    $msg_content_type = "Content-type: {$content_type}; charset={$char_set}";
    
    $msg = '';
    $msg .= mail_fsend_enc_msg($boundary,$message,$msg_content_type); //본문 메세지 처리
    //======================================================== 첨부파일 인코딩
    if(!is_array($files)){$files=array($files);}//강제로 배열로 만든다.
    for($i =0,$m=count($files);$i<$m;$i++){
        $msg .= mail_fsend_enc_file($boundary,$files[$i]); //첨부파일 처리
    }
    //======================================================== 업로드 되는 첨부파일 인코딩    
    if(!empty($_FILES)){
        foreach($_FILES as $key=> $value){            $t = $key; break;        }
        $t_files = $_FILES[$t]['tmp_name'];
        $t_filenames = $_FILES[$t]['name'];
        $t_error = $_FILES[$t]['error'];
        if(!is_array($t_files)){$t_files=array($t_files);}
        if(!is_array($t_filenames)){$t_filenames=array($t_filenames);}
        if(!is_array($t_error)){$t_error=array($t_error);}
        for($i =0,$m=count($t_files);$i<$m;$i++){
            if($t_error[$i]==0){
                $msg .= mail_fsend_enc_file($boundary,$t_files[$i],$t_filenames[$i]); //첨부파일 처리
            }
        }    
    }
    //========================================================= 메세지 닫기
    $msg .='--'.$boundary."--";
    //===================================================== 메일 보내기
    //===================================================== 릴레이션 설정이 필요한 경우는 알아서...
    $result = mail ($to,$subject,$msg,$header);
    return $result;    
}
function mail_fsend_enc_msg($boundary,$msg='',$content_type='Content-type: text/plain; charset=utf-8'){
//본문문자열 인코딩
    $re_str = '';
    $re_str = '--'.$boundary."\r\n"; //바운드리 설정
    $re_str .= $content_type."\r\n";
    $re_str .= 'Content-Transfer-Encoding: base64'."\r\n"."\r\n";    
    // RFC 2045 에 맞게 $data를 형식화
    $new_msg = chunk_split(base64_encode($msg));
    $re_str .=$new_msg."\r\n";
    return $re_str;
}
function mail_fsend_enc_file($boundary,$file,$filename=''){
//첨부파일 인코딩
    $content_type = 'Content-Type: application/octet-stream; charset=UTF8';
    $re_str = '';
    $re_str = '--'.$boundary."\r\n"; //바운드리 설정
    $re_str .= $content_type."\r\n";
    $re_str .= 'Content-Transfer-Encoding: base64'."\r\n";    
    if(strlen($filename)==0){        $filename = basename($file);    }
    $re_str .= "Content-Disposition: attachment; filename=\"".'=?UTF-8?B?'.base64_encode($filename).'?='."\""."\r\n"."\r\n";        
    
    // RFC 2045 에 맞게 $data를 형식화    
    $fp = @fopen($file, "r");
    if($fp) {    $msg = fread($fp, filesize($file));    fclose($fp);    }    
    
    $new_msg = chunk_split(base64_encode($msg));
    $re_str .=$new_msg."\r\n";
    
    return $re_str;
}
//-----------------------------------------------------------------------
함수 사용법

---------------------=---------------------------
솔찍히 이건 함수를 사용하시라는게 아니라 참고하시라고 올려놓는 겁니다.


메일의 경우 여러 규격이 있지만 그중에서 가장 많이 사용되는 규격중에서
첨부파일을 처리하는 방법은 RFC 2045 입니다.
그 규격은 multipart/mixed 와 boundary , base64_encode 가 요점입니다.

==========================================
멀티파트로 보낼 경우 기본적 구조

  # 해더
Content-type: multipart/mixed; boundary="123456"  를 선언

  # 본문

--123456 (\r\n 으로 줄바꿈)
Content-type: text/plain; charset=utf-8(\r\n)
Content-Transfer-Encoding: base64(\r\n)
(\r\n)
 chunk_split(base64_encode(메세지));(\r\n)
--123456 (\r\n 으로 줄바꿈)
Content-type: application/octet-stream; charset=utf-8(\r\n)
Content-Transfer-Encoding: base64(\r\n)
Content-Disposition: attachment; filename=파일이름(\r\n)
(\r\n)
 chunk_split(base64_encode(메일내용));(\r\n)
--123456--


-> 설명
#해더에서 Content-type 를  multipart/mixed 로 선언
바운더리로 사용할 123456 를 선언

#본문에서
'--123456' 으로 바운더리를 적어서 그부분이 하나의 파트라는 것을 표시
바로밑에 content-type 등을 적고 \r\n으로 줄바꿈
본메세지와는 \r\n으로 한줄이 더 생기도록 함
본메세지는  chunk_split(base64_encode($msg));(\r\n) 로 삽입
(chunk_split : RFC 2045형식에 맞도록 문자열을 줄바꿈 해줍니다.)
(base64_encode : 메일의 기본은 64 인코딩입니다.)
이로 일반 메세지 부분은 끝

또다시 '--123456' 으로 바운더리를 적어서 그부분이 하나의 파트라는 것을 표시
파일을 첨부할 경우
Content-type: application/octet-stream; charset=utf-8(\r\n)
Content-Transfer-Encoding: base64(\r\n)
Content-Disposition: attachment; filename=파일이름(\r\n)
(\r\n)
라고 삽입
본메세지는 파일안의 내용으로
chunk_split(base64_encode(파일안의 내용));(\r\n) 를 삽입

마지막으로
'--123456--' 으로 끝이라고 표시

====================-=============
설명이 이상한것 같은데
어쨌든 중요한건 해더에 선언하는 content-type과
부분을 나누는 boundary 입니다.

이것만 기억하면 간단하게 첨부파일 메일 보내기는 성공하실 수 있습니다.

$alphabet = 'A-Za-z';
$hangul_jamo = '\x{1100}-\x{11ff}';
$hangul_compatibility_jamo = '\x{3130}-\x{318f}';
$hangul_syllables = '\x{ac00}-\x{d7af}';

$cnt = preg_match_all('/['.$alphabet.$hangul_jamo.$hangul_compatibility_jamo.$hangul_syllables.']+/u', $utf8text, $matches);

print_r($matches);

memdb.inc 

<?
//////////////////////////////////////////////////////////////////////////////////////
//
// MEM_DB  메모리 점유형 DB
//
// MEM DB v0.5
//  제작자 : 이현구(닉 : ent24)
//
//
// 현재 기능
// sql_create      데이터 베이스 생성
//  사용법 : sql_create("테이블명","필드1,필드2");
//  ex) sql_create("a","b,c");
//  리턴값 : 없음

// sql_select      데이터 선택
//  사용법 : sql_select("테이블명","추출필드1,추출필드1","조건(현재는 = 만 사용가능함 중복 검색시 and/or 가능)","정렬(desc) 기본 asc");
//  ex) : sql_select("a","b,c","b=10 and c=10","desc");
//  리턴값 : Array[레코드번호][필드명]

// sql_select_limit    데이터 선택된 데이터 개수 반환
//  사용법 : sql_select_limit("테이블명");
//  ex) : echo sql_select_limit("a");
// 리턴값 : INT

// sql_insert      데이터 삽입
//  사용법 : sql_insert("테이블명","첫필드 데이터1,두번째 필드 데이터2");  //필드는 순서대로 입력
//  ex) : sql_select_limit("a","10,20");
//  리턴값 : 없음

// sql_drop       데이터 테이블 삭제
//  사용법 : sql_drop("테이블명");
//  ex) : sql_drop("a");
//  리턴값 : 없음

//
//////////////////////////////////////////////////////////////////////////////////////


class Mem_SQL
{
 //기본
 var $Mem_db_TABLE_BASE_LIMIT_Num;
 function Mem_SQL()
 {
  $this->Mem_db_TABLE_BASE_LIMIT_Num=4;
 }

 //테이블생성
 function sql_create($TB_name,$Fild_name_s)
 {
  //필드명 정의
  $Fild_name=split(",",$Fild_name_s);
  //필드명개수
  $Fild_count=count($Fild_name);

  //테이블의정보저장
  $this->{$TB_name}[fild_limit]=$Fild_count;
  $this->{$TB_name}[filds]=$Fild_name_s;
  $this->{$TB_name}[limit]=0;
  $this->{$TB_name}[select_limit]=0;
 }
 //테이블 레코드 개수 반환
 function sql_select_limit($TB_name)
 {
  return $this->{$TB_name}[select_limit];
 }
 //선택
 function sql_select($TB_name,$Fild_name_s,$Fild_search_s,$Fild_sort)
 {
  //전달 데이터 정의
  $Result_data=Array();

  //필드명 정의
  $Fild_name=split(",",$Fild_name_s);
  //필드명개수
  $Fild_count=count($Fild_name);

  //필드 개수 체크
  $Table_count=count($this->{$TB_name});

  //검색필드
  $Fild_search_ary=$this->Search_query_data($Fild_search_s);
  $Fild_search_count=count($Fild_search_ary[1]);

  //해당 쿼리 개수 체크
  $Check_fild_count=0;

  //데이터 삽입
  for($rof=$this->Mem_db_TABLE_BASE_LIMIT_Num;$rof<$Table_count;$rof++)
  {

   $Insert_check=0;
   if($Fild_search_s)
   {
    for($rof_serach=0;$rof_serach<$Fild_search_count;$rof_serach++)
    {
     $cut_pos=strpos($Fild_search_ary[1][$rof_serach],"=");


     $search_Fild_name=trim(substr($Fild_search_ary[1][$rof_serach],0,$cut_pos));
     $search_Fild_data=substr($Fild_search_ary[1][$rof_serach],$cut_pos+1);


     $Insert_check_mem=0;
     if($this->{$TB_name}[$rof][ $search_Fild_name ]==$search_Fild_data)  $Insert_check_mem=1;

     if($Fild_search_ary[0][$rof_serach-1])
     {
      if($Fild_search_ary[0][$rof_serach-1]=="and") $Insert_check=$Insert_check*$Insert_check_mem;
      if($Fild_search_ary[0][$rof_serach-1]=="or") $Insert_check=$Insert_check+$Insert_check_mem;
     }

     $Insert_check=$Insert_check+$Insert_check_mem;
    }
   }
   else
    $Insert_check=1;

   if($Insert_check)
   {
    for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
    {
     $Result_data[$Check_fild_count][$rof_fild]=$this->{$TB_name}[$rof][ $Fild_name[$rof_fild] ];
     $Result_data[$Check_fild_count][$Fild_name[$rof_fild]]=$this->{$TB_name}[$rof][ $Fild_name[$rof_fild] ];
    }
    $Check_fild_count++;
   }
  }


  //데이터 정렬
  $this->{$TB_name}[select_limit]=$Check_fild_count;
  if($Fild_sort)
  {
   $Fild_sort_set_ary=explode(" ",$Fild_sort);

   $Fild_sort_name=$Fild_sort_set_ary[0];

   if($Fild_sort_set_ary[1]=="desc")
   {


    for($rof1=1;$rof1<$Check_fild_count;$rof2=$rof1, $rof1=$rof1*3+1);

    do
    {
     for($rof3=0;$rof3<$rof2;$rof3++)
     {
      for($rof1=$rof3+$rof2;$rof1<$Check_fild_count;$rof1+=$rof2)
      {
       for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
        $tmp_data_ary[$Fild_name[$rof_fild]]=$Result_data[$rof1][$Fild_name[$rof_fild]];

       for($rof4=$rof1-$rof2, $tmp_data=$Result_data[$rof1][$Fild_sort_name];$rof4>=$rof3 && $Result_data[$rof4][$Fild_sort_name]<$tmp_data;$rof4-=$rof2)
       {

        for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
         $Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$Result_data[$rof4][$Fild_name[$rof_fild]];

       }

       for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
        $Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$tmp_data_ary[$Fild_name[$rof_fild]];

      }
     }
     $rof2=($rof2-1)/3;

    }while($rof2>=1);

   }
   else
   {

    for($rof1=1;$rof1<$Check_fild_count;$rof2=$rof1, $rof1=$rof1*3+1);

    do
    {
     for($rof3=0;$rof3<$rof2;$rof3++)
     {
      for($rof1=$rof3+$rof2;$rof1<$Check_fild_count;$rof1+=$rof2)
      {
       for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
        $tmp_data_ary[$Fild_name[$rof_fild]]=$Result_data[$rof1][$Fild_name[$rof_fild]];

       for($rof4=$rof1-$rof2, $tmp_data=$Result_data[$rof1][$Fild_sort_name];$rof4>=$rof3 && $Result_data[$rof4][$Fild_sort_name]>$tmp_data;$rof4-=$rof2)
       {

        for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
         $Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$Result_data[$rof4][$Fild_name[$rof_fild]];

       }

       for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
        $Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$tmp_data_ary[$Fild_name[$rof_fild]];

      }
     }
     $rof2=($rof2-1)/3;

    }while($rof2>=1);

   }
  }


  return $Result_data;
 }
 //삽입
 function sql_insert($TB_name,$Fild_data_s)
 {
  //필드 이름 삽입
  $Fild_name_s=$this->{$TB_name}[filds];
  //필드명 정의
  $Fild_name=split(",",$Fild_name_s);
  //필드개수
  $Fild_count=$this->{$TB_name}[fild_limit];

  //다음필드 배열수
  $Next_count=count($this->{$TB_name});

  //필드 명체크
  $Fild_data=split(",",$Fild_data_s);

  //삽입
  for($rof=0;$rof<$Fild_count;$rof++)
   $this->{$TB_name}[$Next_count][$Fild_name[$rof]]=$Fild_data[$rof];

  //현재 배열 개수저장
  $this->{$TB_name}[limit]=$Next_count-$this->Mem_db_TABLE_BASE_LIMIT_Num;

  //전달값
  return $Next_count;
 }
 //삽입
 function sql_drop($TB_name)
 {
  $this->{$TB_name}="";

 }

 //조건문 해석기
 function Search_query_data($querys)
 {
  $String_data=array();

  $querys_org=$querys;
  $Query_Operators_string=array(" and "," or ");

  $Query_counts=0;
  for($rof=0;$rof<count($Query_Operators_string);$rof++)
  {
   $Search_counts=count(explode($Query_Operators_string[$rof],$querys));
   if($Search_counts>1)
    $Query_counts+=$Search_counts-1;
  }

 
  for($rof_chk=0;$rof_chk<$Query_counts;$rof_chk++)
  {
   $Max_nums=100000;
   $Cut_values=0;
   for($rof=0;$rof<count($Query_Operators_string);$rof++)
   {
    $chk_counts_value=strpos($querys,$Query_Operators_string[$rof]);
    if($Max_nums>$chk_counts_value&&$chk_counts_value!==false)
    {
     $Cut_values=strlen($Query_Operators_string[$rof]);
     $Max_nums=$chk_counts_value;
     $String_data[0][$rof_chk]=$Query_Operators_string[$rof];
     break;
    }
   }
   $querys=substr($querys,$Max_nums+$Cut_values);
  }


  for($rof=0;$rof<count($String_data[0]);$rof++)
  {
   $start_point=strpos($querys_org,$String_data[0][$rof]);

   $datas_str_more=substr($querys_org,0,$start_point-1);
   $querys_org=substr($querys_org,$start_point+strlen($String_data[0][$rof]));
   $String_data[1][$rof]=$datas_str_more;
  }
  $String_data[1][$rof]=$querys_org;

  return $String_data;
 }
}

?>


----------------------------------------------------------------------------------


memdb.php


<?
$memdb=new Mem_SQL;

//  사용법 : sql_create("테이블명","필드1,필드2");
$memdb->sql_create("test","counts,names");

//  사용법 : sql_insert("테이블명","첫필드 데이터1,두번째 필드 데이터2");  //필드는 순서대로 입력
$memdb->sql_insert("test","10,자료3");
$memdb->sql_insert("test","20,자료2");
$memdb->sql_insert("test","30,자료1");
$memdb->sql_insert("test","40,자료4");

//  사용법 : sql_select("테이블명","추출필드1,추출필드1","조건(현재는 = 만 사용가능함 중복 검색시 and/or 가능)","정렬(desc) 기본 asc");
$item_data=$memdb->sql_select("test","counts,names","","names");

//  사용법 : sql_select_limit("테이블명");
$item_count=$memdb->sql_select_limit("test");

//  사용법 : sql_drop("테이블명");
$memdb->sql_drop("test");

//출력
for($i=0;$i<$item_count;$i++)
{
 echo $item_data[$i][counts]."-".$item_data[$i][names]."<br>";
}
?>


---------------------------------------------------------------------------------


php 프로세스 간의 db 공유가 가능하도록 기능을 추가할 계획이 없다면,
sqlite::memory: 도 좋은 방법입니다.

<?php

$db = new PDO('sqlite::memory:');
$db->exec('CREATE TABLE a (b, c)');
$db->exec('INSERT INTO a VALUES (1,2)');
$stmt = $db->query('SELECT * FROM a');
$data = $stmt->fetchAll();

print_r($data);

?>
역시 단점은 한 프로세스가 끝나면 데이터가 소실되기 때문에,
어디에 써야 할지를 모르겠다는 것이죠.

자바스크립트로 fopen 이나 fclose...


예:
--------------------------------------------------------

//runtime_example.js
// <scr'+'ipt 로 짜개서 넣는 이유는 IE4등 초기 브라우저에서는  <script 라는 단어만 있으면 무조건 스크립트화일로 간주하여서 브라우저가 다운되기 때문입니다.
 
var langcode = navigator.systemLanguage;
var str = <scr'+'ipt language="javascript" src=" data_' + langcode +
'.js"></scr'+'ipt>';
document.writeln(str);
--------------------------------------------------------

//runtime_example.html - 실행되지 않는다.
<html>
<head>
<script language="javascript" src="runtime_example.js"></script>
</head>
<body>
<script language="javascript" >
// Body javascript
// 여기서 data_xx.js를 사용한다.
</script>
</body>
</html>
--------------------------------------------------------
이것은 실행되지 않읍니다. "data_xx.js" 화일을 완전히 load하기도 전에 Body javascript가 실행되기 때문입니다.

그런데 IE에서는 방법이 있읍니다.
--------------------------------------------------------

//runtime_example.html - 완벽하게 실행되는 예
<html>
<head>
<script language="JScript.Encode" src="runtime_example.js"></script>
</head>
<body>
<script language="javascript" >
// Body javascript
// 여기서 data_xx.js를 사용한다.
</script>
</body>
</html>
--------------------------------------------------------
language에  "javascript" 대신  "JScript.Encode"로 바꾸면 data_xx.js 화일이 완전히 load된 다음에 Body javascript가 실행됩니다.

즉 Run-time으로 원하는 자바스크립트 화일을 마음대로 불러 쓸 수 있다는 것!!!!!

Run-time 이로 원하는 자바스크립트 화일을 오픈하는 것이 가능하면 다수의 PHP나 ASP화일을 쓸 필요가 없이 *단 하나의 HTML*화일로 프로그래밍이 가능하게 됩니다.







-------------------------------------------------------------------------------------


다른 방법..


function include_script(type, defer, src) {
    var script = document.createElement("script");
    script.type = type, script.defer = defer;
    script.src = src;
    script.charset = 'euc-kr';
    document.getElementsByTagName('head')[0].appendChild(script);
    return script;
}

/* 예제 */

include_script("text/javascript", true, http://sadserver.naver.com/mbanner?showme=js_in&where=nexearch&query=%B3%D7%C0%CC%B9%F6+%B1%B3%C5%EB);

 

function setColor(obj, color) {
  obj.setAttribute('backup', obj.getAttribute('backgroundColor'));
  obj.setAttribute('backgroundColor', color);
  obj.onmouseout = new Function("this.setAttribute('backgroundColor', this.getAttribute('backup'));");
}


<tr onmouseover="setColor(this, 'color')">

<?php
$year    = $_GET['year'];
$month    = $_GET['month'];
$day    = $_GET['day'];
if(!$year)    $year    = date("Y", time());
if(!$month)    $month    = date("m", time());
if(!$day)    $day    = date("d", time());
?>
<table border='1' width='100%' align='center'>
<tr>
<td width='14%' align='center'>
sun
</td>
<td width='14%' align='center'>
mon
</td>
<td width='14%' align='center'>
tue
</td>
<td width='14%' align='center'>
wed
</td>
<td width='14%' align='center'>
the
</td>
<td width='14%' align='center'>
fri
</td>
<td width='14%' align='center'>
sat
</td>
</tr>
<?php
$startStamp    = mktime(0,0,0,$month,1,$year);
$startCal    = getdate($startStamp);
$startWday    = $startCal['wday'];
for($i=0,$w=1;$i<50;$i++)
{
    if($i==0 || $i%7 == 0)
    {
        echo "<tr>";
    }
    echo "<td>";
    if($i==$startWday)
    {
        $flag = "on";
    }
    if($w > 27)
    {
        if(checkdate ($month,$w,$year))
        {
            $flag = "on";
        }
        else
        {
            $flag = "off";
        }
    }
    if($flag == "on")
    {
        echo $w. "</td>";
        $w++;    
    }
    else
    {
        echo " </td>";
    }
    if($i%7 == 6 && $i!=0)
    {
        echo "</tr>";
        if($flag == "off")
            break;
    }

}
?>
</table>

기존 qmail 의 pop3d 데몬을 다른 걸로 변경하기 위해
daemontools 이용하여 사용하려 했으나 ㅠㅠ
php 가 메모리에 적재되지 않고 실행이 되지 않더군요 되면 좋았을텐데 ㅠㅠ;
할수없이 php 로 pop3 데몬을 만들었습니다.

주 목적은 파일기반의 메일서버를 디비기반의 메일서버로 변경하여,
pop3 에서 사용자가 메일을 긁어가버리면 실시간 동기화가 되지 않기에.....
php 로 pop3 데몬을 작성하여 웹메일과 완전 동기화를 시키는 목적입니다.

http://wiki.jinoos.com 사이트의 소스를 많이 참조하였습니다.

socket_close 앞에 socket_shutdown 을 사용한것은 커넥션이 즉각 끊어지지 않아서 명시적으로 쓴것입니다.

user ,pass , quit 외에 나머지 명령어는 스스로 ^^;

list
stat
retr
dele
noop
apop
의 명령어가 있습닌다.





아래부터 소스.......

#!/usr/local/php/bin/php -q
<?
$cSock = array();
$cInfo = array();
$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($sSock, 0, 110);

socket_listen($sSock);

$err = '-ERR ';
$errsyntax = '-ERR syntax error';
while (true) {
        $sockArr = array_merge(array($sSock), $cSock);
        if (socket_select($sockArr, $tWrite = null, $tExcept = null, 0) > 0) {
                foreach ($sockArr as $sock) {
                        // 서버소켓에 이벤트가 발생할 경우
                        if ($sock == $sSock) {
                        $tSock = socket_accept($sSock);
                        socket_getpeername($tSock, $ip, $port);
                        $cSock[$tSock] = $tSock;
                        $cInfo[$tSock] = array('ip'=>$ip, 'port'=>$port);
                        msg($tSock, "+OK <".$port.".".time()."@abc.co.kr>");
                        }
                      // 서버소켓의 이벤트가 아닐 경우
                        else {
                        $buf = socket_read($sock, 4096);
                                if (!$buf) {
                                exceptSocket(&$cSock, &$cInfo, $sock);
                                }
                                else {
                                        // 개행 문자가 들어오기전까지 받아둔다.
                                        $buffer[$sock]['buf'] .= $buf;
                                        if (ereg("\n|\r|\r\n", $buffer[$sock]['buf'])) {
                                                $thisSockInfo = $cInfo[$sock];
                                                $cmd = trim(substr($buffer[$sock]['buf'], 0, 5));
                                                $tmp = trim(substr($buffer[$sock]['buf'], 5));
                                                $buffer[$sock]['buf'] = null;
                                                switch (strtolower($cmd)) {
                                                case 'user':
                                                        if ($tmp) { $buffer[$sock]['login_id'] = $tmp; msg($sock, '+OK'); }
                                                        else { msg($sock, $errsyntax); }
                                                break;
                                                case 'pass':
                                                        if ($tmp) {
                                                                if ($buffer[$sock]['login_id']) {
                                                                        if (login_check($buffer[$sock]['login_id'], $tmp) =
= true) {
                                                                        $buffer[$sock]['pass'] = $tmp;
                                                                        msg($sock, '+OK');
                                                                        }
                                                                        else {
                                                                        msg($sock, $err.'authorization failed');
                                                                        @socket_shutdown($sock);
                                                                        @socket_close($sock);
                                                                        }
                                                                }
                                                                else {
                                                                        msg($sock, $err.'USER first');
                                                                }
                                                        }
                                                        else { msg($sock, $errsyntax); }
                                                break;
                                                case 'list':
                                                break;
                                                case 'stat':
                                                break;
                                                case 'retr':
                                                break;
                                                case 'dele':
                                                break;
                                                case 'noop':
                                                break;
                                                case 'apop':
                                                break;
                                                case 'quit':
                                                msg($sock, '+OK');
                                                @socket_shutdown($sock);
                                                @socket_close($sock);
                                                exceptSocket(&$cSock, &$cInfo, $sock);
                                                break;
                                                default:
                                                msg($sock, $err.'syntax error');
                                                break;
                                                }
                                                // switch
                                        }
                                        // 개행 문자가 들어올때까지 받아둔다.
                                }
                                // buf 가 있을 경우
                        }
                        // 소켓이 서버 소켓이 아닐 경우
                }
                // foreach
        }
        // 이벤트가 발생한 경우
usleep(500000);
}
// while end
function msg($fd = '', $str) {
// $str = str_replace("\r\n", "", $str);
// $str = str_replace("\n", "", $str);
if ($fd)
socket_write($fd, $str . chr(13). chr(10));
else
echo $str . chr(13) . chr(10);
}

function exceptSocket(&$sockSet, &$infoSet, $sock) {
unset($sockSet[$sock]);
unset($infoSet[$sock]);
// array_merge 함수에서 erro 발생을 막기 위한 처리
if (sizeof($sockSet) == 0) {
$sockSet = array();
$infoSet = array();
}
}
function login_check($u_id, $pass) {
        $connect = mysql_connect("localhost", "xxx", "xxxxx") or Die();
        @mysql_select_db("db", $connect);
        $query = "select passwd from member_table where user = '$u_id'";
        $result = mysql_query($query, $connect);
        $rowpass = mysql_result($result, 0);
        mysql_close($connect);
        if ($rowpass == $pass) return true;
        else return false;
}
?>


/************************************************************************/
* 위 코드를 이용하여 생긴 서버 장애 및 데이터 손실은 본인에게 책임이 없음을 알려드립니다. *
* 불안하시면 직접 만들어 쓰시길 권해드립니다. *
/************************************************************************/

페이징 함수

인터넷정보2007. 10. 11. 22:05

/**
 * 페이징 함수
 *
 * @author Woo,Yeon-geun <cjdma@cjdma.com>
 *
 * @param int $total;
 * @param int $now;
 * @param int $page;
 * @param int $scale;
 * @param int $block_scale;
 *
 * @return int  $prev  이전 페이지
 * @return int  $page  현재 페이지
 * @return int  $next  다음페이지
 * @return int  $first 시작할 때의 글번호
 * @return array $range 출력하려는 페이지들
 */
function OBS_pubPaging($param)
{
    $total      = $param['total'];
    $now        = $param['now'];
    // 현재페이지 (없으면 1)
    $page        = $param['page']        ? $param['page']        :  1;
    // 한 페이지에 출력하는 row수
    $scale      = $param['scale']      ? $param['scale']      : 20;
    // 한 페이지에 화면에 출력하는 페이지수 ([prev] 1.2.3.4.5 [next] <- 이 때는 block_scale '5')
    $block_scale = $param['block_scale'] ? $param['block_scale'] : 10;

    // $now(현재글번호)가 들어올 경우 $now값을 가지고 몇번째 페이지인지 알아내기 (공식 : floor(($now - 1) / $scale) * $scale)
    if($now) {
        $page = $now ? floor(($now - 1) / $scale) : $page;
    }

    // 전체 페이지 수
    $pages = ceil($total / $scale);

    // 현재페이지에서의 첫글번호, 끝글번호
    $begin_page = $block_scale * ($page - 1);
    $end_page  = $block_scale *  $page;

    // 첫번째블럭번호, 마지막블럭번호 (5,6,7,8,9 <- 여기서 $begin=5, $end=9)
    $begin = floor($page / $block_scale) * $block_scale;
    $end  = $begin + $block_scale;

    // 출력될 때의 글번호 10,9,8,7... <- 여기서 first는 '10'
    $first = $total - ($scale * ($page - 1));

    // 내부적으로 시작값이 '0'인 변수를 '1'로 맞추기...
    $begin++;

    // 블럭내 끝  record($end)가 전체값($total)을 넘을 수 없으므로...
    if($end > $pages) { $end = $pages; }
    if($end == 0)    { $end = 1; }

    // prev 5.6.7.8.9 next - 이 경우에 array(5,6,7,8,9)
    $range = range($begin, $end);
    // prev(이전페이지)출력 - $page가    1이 아닐 때
    if($page != 1)
        { $prev = $page - 1; }
    // next(다음페이지)출력 - $page가 $end가 아닐 때
    if($page != $pages && $end != 1)
        { $next = $page + 1; }

    $return['prev']  = $prev;
    $return['page']  = $page;
    $return['next']  = $next;
    $return['range'] = $range;
    $return['first'] = $first;

    return $return;
} // function
-------------------------------------------------------------------------------
사용예...


[ 로직부분 ]
$url  = 'OpenBBS.com/bbs_list.php';
$total = 98; // 전체 글 수
$page  = 1;  // 현재 페이지
$scale = 10; // 한페이지에 나타낼 글의 수
$block_scale = // 하단에 나타낼 페이지 수 ( prev 1.2.3.4.5 next ) <- 이럴 경우 $block_scale은 5

// 변수들을 하나로 묶어서
$param = compact('url', 'total', 'page', 'scale', 'block_scale');
// 페이징 함수에 넣는거죠~ ^^
$pub['paging'] = @OBS_pubPaging($param);
// 리턴된 값은 파씽~
$smarty->assign('pub', $pub);


[ 화면 ]
<!-- 페이징 : B -->
<div id="paging">
{if $pub.paging.prev}
    <a href="{$url.bbs_list}&page={$pub.paging.prev}">prev</a>
{/if}

{foreach from=$pub.paging.range key=key item=value}
    {if $value != $pub.paging.page}
        [<a href="{$url.bbs_list}&page={$value}">{$value}</a>]
    {else}
        [{$value}]
    {/if}
{/foreach}

{if $pub.paging.next}
    <a href="{$url.bbs_list}&page={$pub.paging.next}">next</a>
{/if}
</div>
<!-- 페이징 : E -->

미리보기 : http://oxtag.com/html/ex/select20070412.html


<script type="text/javascript" language="javascript">
<!--
function selectChg(val) {
document.getElementById('test').value = val;
}
//-->
</script>

<select id = "test" name = "test">
<option value="한국" selected="selected">한국</option>
<option value="일본">일본</option>
<option value="중국">중국</option>
<option value="호주">호주</option>
</select>

<a href="javascript:selectChg('한국');">한국</a>
<a href="javascript:selectChg('일본');">일본</a>
<a href="javascript:selectChg('중국');">중국</a>
<a href="javascript:selectChg('호주');">호주</a>


또는..

<SCRIPT LANGUAGE="JavaScript">
<!--
function selectChg(val) {
document.getElementById('test').options[val].selected = true;
}
//-->
</SCRIPT>

<select id = "test" name = "test">
<option value="한국" selected="selected">한국</option>
<option value="일본">일본</option>
<option value="중국">중국</option>
<option value="호주">호주</option>
</select>

<a href="javascript:selectChg('0');">한국</a>
<a href="javascript:selectChg('1');">일본</a>
<a href="javascript:selectChg('2');">중국</a>
<a href="javascript:selectChg('3');">호주</a>

또는

<SCRIPT LANGUAGE="JavaScript">
<!--
function selectChg(val) {
var f = document.getElementById('test');
for (i=0; i<f.options.length; i++) {
  if (f.options[i].value == val) { f.options[i].selected = true; }
}
}
//-->
</SCRIPT>

<select id = "test" name = "test">
<option value="한국" selected="selected">한국</option>
<option value="일본">일본</option>
<option value="중국">중국</option>
<option value="호주">호주</option>
</select>

<a href="javascript:selectChg('한국');">한국</a>
<a href="javascript:selectChg('일본');">일본</a>
<a href="javascript:selectChg('중국');">중국</a>
<a href="javascript:selectChg('호주');">호주</a>

또는

<SCRIPT LANGUAGE="JavaScript">
<!--
function selectChg(val) {
var f = document.getElementById('test');
for (i=0; i<f.options.length; i++) {
  if (f[i].value == val) { f.selectedIndex = i; break;}
}
}
//-->
</SCRIPT>

<select id = "test" name = "test">
<option value="한국" selected="selected">한국</option>
<option value="일본">일본</option>
<option value="중국">중국</option>
<option value="호주">호주</option>
</select>

<a href="javascript:selectChg('한국');">한국</a>
<a href="javascript:selectChg('일본');">일본</a>
<a href="javascript:selectChg('중국');">중국</a>
<a href="javascript:selectChg('호주');">호주</a>

<style>
.rtop, .rbottom{display:block; background: #FFFFFF;}
.rtop *, .rbottom *{display: block; height: 1px; overflow: hidden; background: pink;}
.r1{margin: 0 5px}
.r2{margin: 0 3px}
.r3{margin: 0 2px}
.r4{margin: 0 1px; height: 2px}
</style>


<table style="width:300;font-size:9pt;color:#FF00FF;">
<tr>
<td>

<div id="container" style="background: pink;">
<b class="rtop">
  <b class="r1"></b> <b class="r2"></b> <b class="r3"></b> <b class="r4"></b>
</b>
  그냥 바라만 보다<br><br>
  편지를 띄웠다. <br><br>
  투명한 가을 햇살속으로 <br><br>
  친구이고 싶은 한 사람에게... <br><br>
  오후 커피가 향기로우면 그 향기로움으로... <br><br>
  비가오면 그 빗소리로...<br><br>
  좋은 영화의 감동으로 눈물이 날땐 그 순수함으로... <br><br>
  꽃빛이 고와서 눈이 부실때는 그 아름다움으로... <br><br>
  친구가 되고 싶었다.
<b class="rbottom">
  <b class="r4"></b> <b class="r3"></b> <b class="r2"></b> <b class="r1"></b>
</b>
</div>

</td>
</tr>
</table>

php5에서 소켓이 지원되지만 이하 버전에서
호스팅계정을 사용시 대부분php4인듯 하더군요.

뭐 현란한 기술은 없습니다만,
필요하신분께 도움이 되었으면 합니다.


함수는 첨부파일 참고.


사용방법

$http = new HttpEx("http://www.phpschool.com/index.php");
헤더만 요청시
if($http->Open()){
    $http->SendRequestHeader();
    echo $http->getResponseHeader()."

";//전체응답헤더
    echo $http->getResponseHeader("Server")."

";//특정헤더
    $http->Close();
}


내용요청
if($http->Open()){
    echo $http->SendRequestBody();
    $http->Close();
}

쿠키값 가져오기
if($http->Open()){
    $http->getResponseHeader();
    echo $http->getCookie();//전체쿠키
    echo $http->getCookie("특정값");//특정값
    $http->Close();
}


그외 : http://scripts.incutio.com/httpclient/

레이어로 바코드 그리기 입니다.

소스는... 첨부파일 참조......

사용법........만 설명...


사용방법 :
바코드를 그릴 페이지에 아래의 스타일 시트를 선언해주셔야 합니다.
  <style type="text/css">
  .space { background:#FFFFFF;float:left;margin:0;padding:0;cursor:default; }
  .bar { background:#000000;float:left;margin:0;padding:0;cursor:default; }
  .bartext { clear:both;font-family:Fixedsys,Arial;font-size:12px;cursor:default; }
  </style>

barcode.js 파일을 불러들입니다.


<script type="text/javascript" src="barcode.js"></script>

바코드를 그릴 라인에서 아래와 같이 써줍니다.
<script type="text/javascript">barcode("1234567890", 40);</script>
<script type="text/javascript">barcode("i-swear.com", 40);</script>


사용예시
기본 : 바의 넓이 1px, 굵은바의 넓이 2px, 색상 검정
barcode(문자열, 바코드의 세로길이); // 필수 예시1
barcode(문자열, 바코드의 세로길이, 바의 넓이, 굵은바의 넓이); // 예시 2
barcode(문자열, 바코드의 세로길이, 바의 넓이, 굵은바의 넓이, 스페이스의 넓이, 굵은 스페이스의 넓이) // 예시 3
barcode(문자열, 바코드의 세로길이, 바의 넓이, 굵은바의 넓이, 스페이스의 넓이, 굵은 스페이스의 넓이, 바코드의 색상, 바코드 문자열의 색상) // 예시 4

ps. 문자열은 소문자로 넣어도 대문자로 변환됩니다..
    레이어는 absolute 이기 때문에 바코드를 연달아 출력하려면 br 태그로 띄워주세연

http://oxtag.com/html/ex/Entities.html

HTML 4.01 엔티티(Entities)

 

문자 개체 레퍼런스는 줄여서 개체(entities)라고 합니다. 개체(entities)는 문서의 인코딩 기능으로 표현할 수 없거나 키보드로 쉽게 입력할 수 없는 문자를 입력하는 방법을 제공합니다. 개체는 대문자와 소문자를 구별하며 &이름; 형태를 취합니다. 개체의 예로는 copyright 심볼을 나타내기 위한 &copy;와 그리스 문자 "알파"(alpha)를 나타내기 위한 &Alpha;가 있습니다.

개체 이외에도 숫자형 문자 레퍼런스(numeric character references)를 사용할 수 있습니다. 개체가 유니코드 문자만 나타낼 수 있는 반면에 숫자형 문자 레퍼런스는 모든 문자를 나타낼 수 있습니다. 숫자형 문자 레퍼런스는 10진수 또는 16진수 형태를 취할 수 있지만 브라우저는 10진수 형태를 더 강력히 지원합니다. 10진수 레퍼런스는 &#숫자; 형태를 취합니다. 반면에 16진수 변수는 대소문자를 구분하는 &#x숫자; 형태를 취합니다. 숫자형 문자 레퍼런스의 예로는 copyright 심볼을 나타내기 위한 &#169;와  &#xA9;가 있으며 그리스 문자 "알파"(alpha)를 나타내기 위한 &#913;&#x391;이 있으며 아라비아 문자 "알레프"(ALEF)을 나타내기 위한 &#1575; 또는 &#x627;이 있습니다.

아래의 문서들은 HTML 4.01의 문자 개체 레퍼런스 표와 숫자형 문자 레퍼런스 표(10진수 형태와 16진수 형태)를 보여줍니다. 사용자가 브라우저 호환성을 점검할 수 있도록 모든 문자 레퍼런스를 보여줍니다..

 

 

 

Latin-1 엔티티(Entities)

아래 표는 Latin-1(ISO-8859-1)의 8비트 문자를 위한 문자 개체 레퍼런스, 10진수 문자 레퍼런스, 16진수 문자 레퍼런스입니다. 또한 사용중인 브라우저에서 어떻게 나타나는 지를 보여줍니다. 문자와 관련된 자세한 정보는 유니코드 협회(Unicode Consortium)의 홈페이지에서 볼 수 있습니다.

브라우저는 10진수 문자 레퍼런스를 가장 잘 지원합니다. 단, 엑센트가 표시된 문자(10진수 192-214, 216-246, 248-255)는 잘 지원되지 않을 수 있습니다.

맥킨토시 브라우저는 14개의 Latin-1 문자를 정확하지 않게 출력할 수 있습니다. 이러한 문자들은 10진수 166, 178, 179, 185, 188, 189, 190, 208, 215, 221, 222, 240, 253, 254입니다. 참조: ISO-8859-1 and the Mac platform


문자 개체 10진수 16진수 브라우저 출력결과
개체 10진수 16진수
띄어쓰기 공간 &nbsp; &#160; &#xA0;     &#xA0;
상하반전 느낌표 &iexcl; &#161; &#xA1; ¡ ¡ &#xA1;
센트(cent) &cent; &#162; &#xA2; ¢ ¢ &#xA2;
파운드(pound) &pound; &#163; &#xA3; £ £ &#xA3;
통화(currency) &curren; &#164; &#xA4; ¤ ¤ &#xA4;
엔화(yen) &yen; &#165; &#xA5; ¥ ¥ &#xA5;
끊어진 세로 막대기 &brvbar; &#166; &#xA6; ¦ ¦ &#xA6;
섹션(section) 부호 &sect; &#167; &#xA7; § § &#xA7;
분음부호(diaeresis) &uml; &#168; &#xA8; ¨ ¨ &#xA8;
저작권(copyright) 부호 &copy; &#169; &#xA9; © © &#xA9;
여성 표시자 &ordf; &#170; &#xAA; ª ª &#xAA;
이중 꺽음 좌측 인용부호 &laquo; &#171; &#xAB; « « &#xAB;
부호 아님 &not; &#172; &#xAC; ¬ ¬ &#xAC;
하이픈 &shy; &#173; &#xAD; ­ ­ &#xAD;
등록 부호 &reg; &#174; &#xAE; ® ® &#xAE;
윗 줄 &macr; &#175; &#xAF; ¯ ¯ &#xAF;
도(degree) &deg; &#176; &#xB0; ° ° &#xB0;
플러스 마이너스 부호 &plusmn; &#177; &#xB1; ± ± &#xB1;
윗첨자 2 &sup2; &#178; &#xB2; ² ² &#xB2;
윗첨자 3 &sup3; &#179; &#xB3; ³ ³ &#xB3;
고음 악센트 &acute; &#180; &#xB4; ´ ´ &#xB4;
마이크로 &micro; &#181; &#xB5; µ µ &#xB5;
단락 표시 &para; &#182; &#xB6; &#xB6;
중간점 &middot; &#183; &#xB7; · · &#xB7;
갈고리형 부호 &cedil; &#184; &#xB8; ¸ ¸ &#xB8;
윗첨자 1 &sup1; &#185; &#xB9; ¹ ¹ &#xB9;
남성 표시자 &ordm; &#186; &#xBA; º º &#xBA;
이중 꺽음 우측 인용부호 &raquo; &#187; &#xBB; » » &#xBB;
1/4 &frac14; &#188; &#xBC; ¼ ¼ &#xBC;
1/2 &frac12; &#189; &#xBD; ½ ½ &#xBD;
3/4 &frac34; &#190; &#xBE; ¾ ¾ &#xBE;
상하반전 물음표 &iquest; &#191; &#xBF; ¿ ¿ &#xBF;
라틴 대문자 A (저음 악센트) &Agrave; &#192; &#xC0; À À &#xC0;
라틴 대문자 A (고음 악센트) &Aacute; &#193; &#xC1; Á Á &#xC1;
라틴 대문자 A (곡절 악센트) &Acirc; &#194; &#xC2; Â Â &#xC2;
라틴 대문자 A (틸데 악센트) &Atilde; &#195; &#xC3; Ã Ã &#xC3;
라틴 대문자 A (분음 부호) &Auml; &#196; &#xC4; Ä Ä &#xC4;
라틴 대문자 A (원 부호) &Aring; &#197; &#xC5; Å Å &#xC5;
라틴 대문자 AE &AElig; &#198; &#xC6; Æ Æ &#xC6;
라틴 대문자 C &Ccedil; &#199; &#xC7; Ç Ç &#xC7;
라틴 대문자 E (저음 악센트) &Egrave; &#200; &#xC8; È È &#xC8;
라틴 대문자 E (고음 악센트) &Eacute; &#201; &#xC9; É É &#xC9;
라틴 대문자 E (곡절 악센트) &Ecirc; &#202; &#xCA; Ê Ê &#xCA;
라틴 대문자 E (분음 부호) &Euml; &#203; &#xCB; Ë Ë &#xCB;
라틴 대문자 I (저음 악센트) &Igrave; &#204; &#xCC; Ì Ì &#xCC;
라틴 대문자 I (고음 악센트) &Iacute; &#205; &#xCD; Í Í &#xCD;
라틴 대문자 I (곡절 악센트) &Icirc; &#206; &#xCE; Î Î &#xCE;
라틴 대문자 I (분음 부호) &Iuml; &#207; &#xCF; Ï Ï &#xCF;
라틴 대문자 ETH &ETH; &#208; &#xD0; Ð Ð &#xD0;
라틴 대문자 N (틸데 악센트) &Ntilde; &#209; &#xD1; Ñ Ñ &#xD1;
라틴 대문자 O (저음 악센트) &Ograve; &#210; &#xD2; Ò Ò &#xD2;
라틴 대문자 O (고음 악센트) &Oacute; &#211; &#xD3; Ó Ó &#xD3;
라틴 대문자 O (곡절 악센트) &Ocirc; &#212; &#xD4; Ô Ô &#xD4;
라틴 대문자 O (틸데 악센트) &Otilde; &#213; &#xD5; Õ Õ &#xD5;
라틴 대문자 O (분음 부호) &Ouml; &#214; &#xD6; Ö Ö &#xD6;
곱셈 부호 &times; &#215; &#xD7; × × &#xD7;
라틴 대문자 O (슬래쉬) &Oslash; &#216; &#xD8; Ø Ø &#xD8;
라틴 대문자 U 저음 악센트 &Ugrave; &#217; &#xD9; Ù Ù &#xD9;
라틴 대문자 U (고음 악센트) &Uacute; &#218; &#xDA; Ú Ú &#xDA;
라틴 대문자 U (곡절 악센트) &Ucirc; &#219; &#xDB; Û Û &#xDB;
라틴 대문자 U (분음 부호) &Uuml; &#220; &#xDC; Ü Ü &#xDC;
라틴 대문자 Y (고음 악센트) &Yacute; &#221; &#xDD; Ý Ý &#xDD;
라틴 대문자 THORN &THORN; &#222; &#xDE; Þ Þ &#xDE;
라틴 소문자 ess-zed &szlig; &#223; &#xDF; ß ß &#xDF;
라틴 소문자 a (저음 악센트) &agrave; &#224; &#xE0; à à &#xE0;
라틴 소문자 a (고음 악센트) &aacute; &#225; &#xE1; á á &#xE1;
라틴 소문자 a (곡절 악센트) &acirc; &#226; &#xE2; â â &#xE2;
라틴 소문자 a (틸데 악센트) &atilde; &#227; &#xE3; ã ã &#xE3;
라틴 소문자 a (분음 부호) &auml; &#228; &#xE4; ä ä &#xE4;
라틴 소문자 a (원 부호) &aring; &#229; &#xE5; å å &#xE5;
라틴 소문자 ae &aelig; &#230; &#xE6; æ æ &#xE6;
라틴 소문자 c (갈고리형 부호) &ccedil; &#231; &#xE7; ç ç &#xE7;
라틴 소문자 e (저음 악센트) &egrave; &#232; &#xE8; è è &#xE8;
라틴 소문자 e (고음 악센트) &eacute; &#233; &#xE9; é é &#xE9;
라틴 소문자 e (곡절 악센트) &ecirc; &#234; &#xEA; ê ê &#xEA;
라틴 소문자 e (분음 부호) &euml; &#235; &#xEB; ë ë &#xEB;
라틴 소문자 i (저음 악센트) &igrave; &#236; &#xEC; ì ì &#xEC;
라틴 소문자 i (고음 악센트) &iacute; &#237; &#xED; í í &#xED;
라틴 소문자 i (곡절 악센트) &icirc; &#238; &#xEE; î î &#xEE;
라틴 소문자 i (분음 부호) &iuml; &#239; &#xEF; ï ï &#xEF;
라틴 소문자 eth &eth; &#240; &#xF0; ð ð &#xF0;
라틴 소문자 n (틸데 악센트) &ntilde; &#241; &#xF1; ñ ñ &#xF1;
라틴 소문자 o (저음 악센트) &ograve; &#242; &#xF2; ò ò &#xF2;
라틴 소문자 o (고음 악센트) &oacute; &#243; &#xF3; ó ó &#xF3;
라틴 소문자 o (곡절 악센트) &ocirc; &#244; &#xF4; ô ô &#xF4;
라틴 소문자 o (틸데 악센트) &otilde; &#245; &#xF5; õ õ &#xF5;
라틴 소문자 o (분음 부호) &ouml; &#246; &#xF6; ö ö &#xF6;
나눗셈 부호 &divide; &#247; &#xF7; ÷ ÷ &#xF7;
라틴 소문자 o (슬래쉬) &oslash; &#248; &#xF8; ø ø &#xF8;
라틴 소문자 u (저음 악센트) &ugrave; &#249; &#xF9; ù ù &#xF9;
라틴 소문자 u (고음 악센트) &uacute; &#250; &#xFA; ú ú &#xFA;
라틴 소문자 u (곡절 악센트) &ucirc; &#251; &#xFB; û û &#xFB;
라틴 소문자 u (분음 부호) &uuml; &#252; &#xFC; ü ü &#xFC;
라틴 소문자 y (고음 악센트) &yacute; &#253; &#xFD; ý ý &#xFD;
라틴 소문자 thorn &thorn; &#254; &#xFE; þ þ &#xFE;
라틴 소문자 y (분음 부호) &yuml; &#255; &#xFF; ÿ ÿ &#xFF;

 

 

심볼 및 그리스 문자 엔티티(Entities)

아래 표는 심볼 및 그리스 문자 개체 레퍼런스, 10진수 문자 레퍼런스, 16진수 문자 레퍼런스를 보여줍니다. 또한 지금 사용중인 브라우저에서의 출력 결과를 보여줍니다. 문자와 관련된 자세한 정보는 유니코드 협회(Unicode Consortium)의 홈페이지에서 볼 수 있습니다.

이러한 개체들은 브라우저에 잘 나타나지 않습니다. 그러나 최신 브라우저에서는 문자 개체 레퍼런스와 10진수 개체 레퍼런스의 일부를 지원합니다.


문자 개체 10진수 16진수 브라우저 출력결과
Entity Decimal Hex
라틴 소문자 f ( 함수, 플로린 ) &fnof; &#402; &#x192; ƒ ƒ &#x192;
그리스어 대문자 알파 &Alpha; &#913; &#x391; Α Α &#x391;
그리스어 대문자 베타 &Beta; &#914; &#x392; Β Β &#x392;
그리스어 대문자 감마 &Gamma; &#915; &#x393; Γ Γ &#x393;
그리스어 대문자 델타 &Delta; &#916; &#x394; Δ Δ &#x394;
그리스어 대문자 엡실론 &Epsilon; &#917; &#x395; Ε Ε &#x395;
그리스어 대문자 제타 &Zeta; &#918; &#x396; Ζ Ζ &#x396;
그리스어 대문자 에타 &Eta; &#919; &#x397; Η Η &#x397;
그리스어 대문자 세타 &Theta; &#920; &#x398; Θ Θ &#x398;
그리스어 대문자 아이오타 &Iota; &#921; &#x399; Ι Ι &#x399;
그리스어 대문자 카파 &Kappa; &#922; &#x39A; Κ Κ &#x39A;
그리스어 대문자 람다 &Lambda; &#923; &#x39B; Λ Λ &#x39B;
그리스어 대문자 뮤 &Mu; &#924; &#x39C; Μ Μ &#x39C;
그리스어 대문자 뉴 &Nu; &#925; &#x39D; Ν Ν &#x39D;
그리스어 대문자 키 &Xi; &#926; &#x39E; Ξ Ξ &#x39E;
그리스어 대문자 오미크론 &Omicron; &#927; &#x39F; Ο Ο &#x39F;
그리스어 대문자 피 &Pi; &#928; &#x3A0; Π Π &#x3A0;
그리스어 대문자 로 &Rho; &#929; &#x3A1; Ρ Ρ &#x3A1;
그리스어 대문자 시그마 &Sigma; &#931; &#x3A3; Σ Σ &#x3A3;
그리스어 대문자 타우 &Tau; &#932; &#x3A4; Τ Τ &#x3A4;
그리스어 대문자 입실론 &Upsilon; &#933; &#x3A5; Υ Υ &#x3A5;
그리스어 대문자 파이 &Phi; &#934; &#x3A6; Φ Φ &#x3A6;
그리스어 대문자 카이 &Chi; &#935; &#x3A7; Χ Χ &#x3A7;
그리스어 대문자 프사이 &Psi; &#936; &#x3A8; Ψ Ψ &#x3A8;
그리스어 대문자 오메가 &Omega; &#937; &#x3A9; Ω Ω &#x3A9;
그리스어 소문자 알파 &alpha; &#945; &#x3B1; α α &#x3B1;
그리스어 소문자 베타 &beta; &#946; &#x3B2; β β &#x3B2;
그리스어 소문자 감마 &gamma; &#947; &#x3B3; γ γ &#x3B3;
그리스어 소문자 델타 &delta; &#948; &#x3B4; δ δ &#x3B4;
그리스어 소문자 엡실론 &epsilon; &#949; &#x3B5; ε ε &#x3B5;
그리스어 소문자 제타 &zeta; &#950; &#x3B6; ζ ζ &#x3B6;
그리스어 소문자 에타 &eta; &#951; &#x3B7; η η &#x3B7;
그리스어 소문자 세타 &theta; &#952; &#x3B8; θ θ &#x3B8;
그리스어 소문자 아이오타 &iota; &#953; &#x3B9; ι ι &#x3B9;
그리스어 소문자 카파 &kappa; &#954; &#x3BA; κ κ &#x3BA;
그리스어 소문자 람다 &lambda; &#955; &#x3BB; λ λ &#x3BB;
그리스어 소문자 뮤 &mu; &#956; &#x3BC; μ μ &#x3BC;
그리스어 소문자 뉴 &nu; &#957; &#x3BD; ν ν &#x3BD;
그리스어 소문자 키 &xi; &#958; &#x3BE; ξ ξ &#x3BE;
그리스어 소문자 오미크론 &omicron; &#959; &#x3BF; ο ο &#x3BF;
그리스어 소문자 파이 &pi; &#960; &#x3C0; π π &#x3C0;
그리스어 소문자 로 &rho; &#961; &#x3C1; ρ ρ &#x3C1;
그리스어 소문자 시그마 (단어 끝) &sigmaf; &#962; &#x3C2; ς ς &#x3C2;
그리스어 소문자 시그마 &sigma; &#963; &#x3C3; σ σ &#x3C3;
그리스어 소문자 타우 &tau; &#964; &#x3C4; τ τ &#x3C4;
그리스어 소문자 입실론 &upsilon; &#965; &#x3C5; υ υ &#x3C5;
그리스어 소문자 파이 &phi; &#966; &#x3C6; φ φ &#x3C6;
그리스어 소문자 키 &chi; &#967; &#x3C7; χ χ &#x3C7;
그리스어 소문자 프사이 &psi; &#968; &#x3C8; ψ ψ &#x3C8;
그리스어 소문자 오메가 &omega; &#969; &#x3C9; ω ω &#x3C9;
그리스어 소문자 세타 심볼 &thetasym; &#977; &#x3D1; ϑ ϑ &#x3D1;
그리스어 웁실론 고리형 심볼 &upsih; &#978; &#x3D2; ϒ ϒ &#x3D2;
그리스어 파이 심볼 &piv; &#982; &#x3D6; ϖ ϖ &#x3D6;
불렛(bullet) = 검정색 작은 원 &bull; &#8226; &#x2022; &#x2022;
수평점 &hellip; &#8230; &#x2026; &#x2026;
프라임 (분, 피트) &prime; &#8242; &#x2032; &#x2032;
이중 프라임 (초, 인치) &Prime; &#8243; &#x2033; &#x2033;
윗 선 &oline; &#8254; &#x203E; &#x203E;
슬래쉬 (분수) &frasl; &#8260; &#x2044; &#x2044;
대문자 서체 P &weierp; &#8472; &#x2118; &#x2118;
대문자 블랙활자 I &image; &#8465; &#x2111; &#x2111;
대문자 블랙활자 R &real; &#8476; &#x211C; &#x211C;
트레이드 마크 (trade mark) &trade; &#8482; &#x2122; &#x2122;
알레프(alef) 심볼 &alefsym; &#8501; &#x2135; &#x2135;
좌향 화살표 &larr; &#8592; &#x2190; &#x2190;
상향 화살표 &uarr; &#8593; &#x2191; &#x2191;
우향 화살표 &rarr; &#8594; &#x2192; &#x2192;
하향 화살표 &darr; &#8595; &#x2193; &#x2193;
좌우향 화살표 &harr; &#8596; &#x2194; &#x2194;
꺽인 화살표 &crarr; &#8629; &#x21B5; &#x21B5;
큰 좌향 화살표 &lArr; &#8656; &#x21D0; &#x21D0;
큰 상향 화살표 &uArr; &#8657; &#x21D1; &#x21D1;
큰 우향 화살표 &rArr; &#8658; &#x21D2; &#x21D2;
큰 하향 화살표 &dArr; &#8659; &#x21D3; &#x21D3;
큰 좌우향 화살표 &hArr; &#8660; &#x21D4; &#x21D4;
전체에게 &forall; &#8704; &#x2200; &#x2200;
부분적 차이 &part; &#8706; &#x2202; &#x2202;
그곳에 있음 &exist; &#8707; &#x2203; &#x2203;
비었음 &empty; &#8709; &#x2205; &#x2205;
나블라(nabla) &nabla; &#8711; &#x2207; &#x2207;
~ 에 속함 &isin; &#8712; &#x2208; &#x2208;
~ 에 속하지 않음 &notin; &#8713; &#x2209; &#x2209;
포함함 &ni; &#8715; &#x220B; &#x220B;
프로덕트 &prod; &#8719; &#x220F; &#x220F;
합계 &sum; &#8721; &#x2211; &#x2211;
뺄셈 부호 &minus; &#8722; &#x2212; &#x2212;
애스터리스크(asterisk) &lowast; &#8727; &#x2217; &#x2217;
제곱근(square root) &radic; &#8730; &#x221A; &#x221A;
~ 에 비례 &prop; &#8733; &#x221D; &#x221D;
무한 &infin; &#8734; &#x221E; &#x221E;
각도 &ang; &#8736; &#x2220; &#x2220;
논리 부호 and &and; &#8743; &#x2227; &#x2227;
논리 부호 or &or; &#8744; &#x2228; &#x2228;
교집(cap) &cap; &#8745; &#x2229; &#x2229;
합집(cup) &cup; &#8746; &#x222A; &#x222A;
인테그랄(integral) &int; &#8747; &#x222B; &#x222B;
그러므로 &there4; &#8756; &#x2234; &#x2234;
틸데 연산자 &sim; &#8764; &#x223C; &#x223C;
대략 같음 &cong; &#8773; &#x2245; &#x2245;
거의 같음 &asymp; &#8776; &#x2248; &#x2248;
같지 않음 &ne; &#8800; &#x2260; &#x2260;
동일함 &equiv; &#8801; &#x2261; &#x2261;
적거나 같음 &le; &#8804; &#x2264; &#x2264;
크거나 같음 &ge; &#8805; &#x2265; &#x2265;
~ 의 부분집합 &sub; &#8834; &#x2282; &#x2282;
~ 의 상위집합 &sup; &#8835; &#x2283; &#x2283;
~ 의 부분집합이 아님 &nsub; &#8836; &#x2284; &#x2284;
부분집합이거나 같음 &sube; &#8838; &#x2286; &#x2286;
상위집합이거나 같음 &supe; &#8839; &#x2287; &#x2287;
원형 덧셈부호(circled plus) &oplus; &#8853; &#x2295; &#x2295;
원형 곱셉부호(circled times) &otimes; &#8855; &#x2297; &#x2297;
수직 &perp; &#8869; &#x22A5; &#x22A5;
점 연산자 &sdot; &#8901; &#x22C5; &#x22C5;
레프트 실링(left ceiling) &lceil; &#8968; &#x2308; &#x2308;
라이트 실링(right ceiling) &rceil; &#8969; &#x2309; &#x2309;
레프트 플로어(left floor) = APL downstile &lfloor; &#8970; &#x230A; &#x230A;
라이트 플로어(right floor) &rfloor; &#8971; &#x230B; &#x230B;
좌측 꺽인 괄호 &lang; &#9001; &#x2329; &#x2329;
우측 꺽인 괄호 &rang; &#9002; &#x232A; &#x232A;
마름모 &loz; &#9674; &#x25CA; &#x25CA;
블랙 스페이드 &spades; &#9824; &#x2660; &#x2660;
블랙 클럽 &clubs; &#9827; &#x2663; &#x2663;
블랙 하트 &hearts; &#9829; &#x2665; &#x2665;
블랙 다이아몬드 &diams; &#9830; &#x2666; &#x2666;

 

 

 

특수 엔티티(Entities)

아래 표는 문장부호와 국제공통문자에 대한 문자 개체 레퍼런스, 10진수 문자 레퍼런스, 16진수 문자 레퍼런스입니다. 또한 지금 사용중인 브라우저에서의 출력 결과를 보여줍니다. 문자와 관련된 자세한 정보는 유니코드 협회(Unicode Consortium)의 홈페이지에서 볼 수 있습니다.

이러한 개체들은 HTML 2.0 버전의 &quot;, &amp;, &lt;, &gt;를 제외하고는 브라우저에 잘 나타나지 않습니다. 그러나 최신 브라우저에서는 문자 개체 레퍼런스와 10진수 개체 레퍼런스의 일부를 지원합니다.


문자 개체 10진수 16진수 브라우저 출력결과
개체 10진수 16진수
인용부호 (프로그램 인용부호) &quot; &#34; &#x22; " " &#x22;
앰퍼샌드 (ampersand) &amp; &#38; &#x26; & & &#x26;
부등호(작음) &lt; &#60; &#x3C; < < &#x3C;
부등호(큼) &gt; &#62; &#x3E; > > &#x3E;
라틴 대문자 OE &OElig; &#338; &#x152; Œ Œ &#x152;
라틴 소문자 oe &oelig; &#339; &#x153; œ œ &#x153;
라틴 대문자 S (캐론 악센트) &Scaron; &#352; &#x160; Š Š &#x160;
라틴 소문자 s (캐론 악센트) &scaron; &#353; &#x161; š š &#x161;
라틴 대문자 Y (분음부호) &Yuml; &#376; &#x178; ÿ Ÿ &#x178;
곡절 악센트 &circ; &#710; &#x2C6; ˆ ˆ &#x2C6;
틸데 악센트 &tilde; &#732; &#x2DC; ˜ ˜ &#x2DC;
엔 스페이스 &ensp; &#8194; &#x2002; &#x2002;
엠 스페이스 &emsp; &#8195; &#x2003; &#x2003;
씬 스페이스 &thinsp; &#8201; &#x2009; &#x2009;
비결합자 &zwnj; &#8204; &#x200C; &#x200C;
결합자 &zwj; &#8205; &#x200D; &#x200D;
우향 표시 &lrm; &#8206; &#x200E; &#x200E;
좌향 표시 &rlm; &#8207; &#x200F; &#x200F;
엔 대시 &ndash; &#8211; &#x2013; &#x2013;
엠 대시 &mdash; &#8212; &#x2014; &#x2014;
작은 따옴표 (좌) &lsquo; &#8216; &#x2018; &#x2018;
작은 따옴표 (우) &rsquo; &#8217; &#x2019; &#x2019;
낮은 인용부호 (소) &sbquo; &#8218; &#x201A; &#x201A;
큰 따옴표 (좌) &ldquo; &#8220; &#x201C; &#x201C;
큰 따옴표 (우) &rdquo; &#8221; &#x201D; &#x201D;
낮은 인용부호 (대) &bdquo; &#8222; &#x201E; &#x201E;
대거(dagger) &dagger; &#8224; &#x2020; &#x2020;
이중 대거(double dagger) &Dagger; &#8225; &#x2021; &#x2021;
퍼밀 부호 (per mille sign) &permil; &#8240; &#x2030; &#x2030;
좌측 꺽음 인용부호 &lsaquo; &#8249; &#x2039; &#x2039;
우측 꺽음 인용부호 &rsaquo; &#8250; &#x203A; &#x203A;
유로화 &euro; &#8364; &#x20AC; &#x20AC;

 

역시 아파치 웹서버 환경설정 파일인 "httpd.conf" 파일을 찾아서 메모장으로 열고, 다음 소스를 추가한 후 아파치 웹서버를 재실행 하시면 됩니다.

<Directory />
    Options FollowSymLinks
    AllowOverride None

    <IfModule mod_setenvif.c>
    SetEnvIF Referer "http://daum.net" pass  // 도메인명을 코딩합니다. (즉, 설정한 도메인명과 현재 접속한 도메인명이 같을 경우 pass 를 반환합니다.)

    <FilesMatch ".(gif|jpg|png|bmp|zip|tar|rar|alz|a00|ace|jpg|jpeg|txt|GIF|JPG|BMP|ZIP|TAR|RAR|ALZ|A00|ACE|TXT|mp3|MP3|mpeg|MPEG|wav|WAV|asf|ASF|wmv|WMV|swf|SWF|exe|EXE)$"> // or (.(*)$)
// 무단 링크 방지할 파일 확장자를 코딩합니다.
        Order deny,allow
        deny from all
        allow from env=pass // pass 값이 존재할 경우 링크를 허용합니다.
    </FilesMatch>
    </IfModule>
</Directory>



httpd.conf

# 도메인 aaa.com
<Directory "디렉토리 지정">
Options FollowSymLinks
AllowOverride None

#링크를 허용할 주소.
SetEnvIfNoCase Referer ^http://aaa.com
SetEnvIfNoCase Referer ^http://aaa.com goout

#이미지의 경우 클릭시 새창에서 X로 보이는것을 방지하기위해.레퍼렐이 존재하지 않는 요청.
SetEnvIfNoCase Referer ^$ goout

#파일 확장자 지정.
<Files ~ ".(gif|jpe?g|png|bmp|zip|tar|rar|alz|a00|ace|txt|mp3|mpe?g|wav|asf|wma|wmv|swf|exe)$">
Order deny,allow
deny from all
allow from env=goout

#무단링크시 보일 이미지 지정.지정안하고 주석처리하시면 기본 403포빈 에러뜸.
ErrorDocument 403 http://주소/이미지.gif
</Files>
</Directory>

insertAdjacentHTML


<script>
function insertMyText()
{
   var obj = document.getElementById("objTxtDiv");
   obj.insertAdjacentHTML("BeforeEnd", "<P>" + objText.value + "</P>");
}
</script>

<input type="text" id=objText value="이곳에 적절한 텍스트를 입력하세요!">
<input type="button" onclick="insertMyText()" value="삽입"></p>

<div id=objTxtDiv> </div>


인수/파라메터
sLoc
필수적인 요소이며, HTML 문자열을 삽입할 위치를 나타내는 문자열이다.
beforeBegin HTML 문자열 sText를 개체의 바로 전에 삽입한다.
afterBegin HTML 문자열 sText를 개체가 시작되고 모든 다른 내용들 전에 삽입한다.
beforeEnd HTML 문자열 sText를 개체가 종료되기 전에 모든 다른 내용들 다음에 삽입한다.
afterEnd HTML 문자열 sText를 개체가 종료된 바로 다음에 삽입한다.
sText

필수적인 요소이며, 삽입될 지정된 HTML 문자열이다. 문자열은 텍스트와 HTML 태그를 혼합할 수 있다. HTML 문자열이 유효하지 않으면 이 메서드는 실패할 것이다.

반환값

반환값은 없다.

특기

텍스트가 HTML 태그를 포함하고 있으면, 이 메서드는 파스(parse)하고 택스트를 삽입한 상태로 양식화 한다.

문서가 로딩되는 동안에는 삽입할 수 없다.
이 메서드를 사용하기 위해서는 onload가 발생될 떄까지 기다려야 한다.

insertAdjacentHTML 메서드를 스크립트를 삽입하는데 사용할 때, script 엘레멘트의 defer 애트리부트를 설정하여야 한다.


<P>select 태그 예제
  <SELECT>
    <OPTGROUP LABEL="select1">  //option 을 그룹지움
      <OPTION value="option1-1">option1-1</OPTION>
      <OPTION value="option1-2">option1-2</OPTION>
      <OPTION value="option1-3">option1-3</OPTION>
      <OPTION value="option1-4">option1-4</OPTION>
    </OPTGROUP>
    <OPTGROUP LABEL="select2">
      <OPTION value="option2-1">option2-1</OPTION>
      <OPTION value="option2-2">option2-2</OPTION>
      <OPTION value="option2-3">option2-3</OPTION>
    </OPTGROUP>
    <OPTGROUP LABEL="select3">
      <OPTION value="option3-1">option3-1</OPTION>
      <OPTION value="option3-2">option3-2</OPTION>
      <OPTION value="option3-3">option3-3</OPTION>
      <OPTION value="option3-4">option3-4</OPTION>
      <OPTION value="option3-5">option3-5</OPTION>
      <OPTION value="option3-6">option3-6</OPTION>
    </OPTGROUP>
  </SELECT>
</P>

get_defined_constants --  모든 상수와 그 값의 연관 배열을 반환합니다.


get_defined_vars --  모든 정의된 변수의 배열을 반환합니다.


get_defined_functions --  Returns an array of all defined functions


get_loaded_extensions --  적재된 모든 모듈명을 배열로 반환합니다.



ex>

$arr = get_defined_vars();

print_r($arr);