<?php
 function adult($jumin,$tmpsex){ 
    
$last_jumin = (($tmpsex==3) || ($tmpsex==4)) ? 20 19

    
$jumin_adult substr($jumin,0,5
);
    
$last_jumin .= $jumin_adult

    
// 86400(1일)*365(1년)*20(년)+(86400(1일)*2(2일)) 오차 감안하여 2일정도 +시킴;
    
$adult_age date("Ymd",(time()-86400*365*20+(86400*2
))); 
    return array(
$last_jumin,$adult_age
); 
 }

 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

오래 전에 만들어 두었던 주민번호 체크 소스입니다. 참고로 2000년 이후 주민번호는 올바로 동작하지 않습니다.

 <?php
 function jumin_chk($data) {
    
$chk 0
    
$add '234567892345';
    for(
$i=0$i<12$i++){
        
$chk $chk+($data[$i]*$add[$i]);
    }
    
$sex = (($data[6] > 4) || ($data[6] == 0)) ? true false;
    
$month = (($data[2].$data[3] <= 0) || ($data[2].$data[3] > 12)) ? true false;
    
$day = (($data[4].$data[5] <= 0) || ($data[4].$data[5] > 31)) ? true false;

    if((((
11-($chk%11))%10)<>$data[12])||($day === true)||($month === true)||($sex === true)) {
        return 
true;
    }
 }

 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

 <?php
 function string_cut($string$length, $lan='utf-8'){ 
    $string str_replace("&nbsp;",' ',$string); 
    $tmp substr($string,0,$length);
    if(
$tmp strlen($string
)) {
        
$count_tmp = ($lan === 'utf-8') ? 2
;
        
$i=0
;
        while(
$i $length
) {
            
$i += (ord(substr($string,$i,1)) > 127) ? $count_tmp 1
;
        }
        
$tmp substr($string,0,$i
);
    }
    return 
str_replace('  ',' &nbsp;',$tmp
);
 }

 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

 <?php 
 
function getRealIpAddr(){    
    if(!empty(
$_SERVER['HTTP_CLIENT_IP']) && getenv('HTTP_CLIENT_IP')){    
        return 
$_SERVER['HTTP_CLIENT_IP'];    
    }   
    elseif(!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']) && getenv('HTTP_X_FORWARDED_FOR')){    
        return 
$_SERVER['HTTP_X_FORWARDED_FOR'];    
    }   
    elseif(!empty(
$_SERVER['REMOTE_HOST']) && getenv('REMOTE_HOST')){    
        return 
$_SERVER['REMOTE_HOST'];    
    }   
    elseif(!empty(
$_SERVER['REMOTE_ADDR']) && getenv('REMOTE_ADDR')){    
        return 
$_SERVER['REMOTE_ADDR'];    
    }    
    return 
false;    
 }

 // ipv6 체크 함수
 function is_ipv6() {
    
$ip getRealIpAddr();
    if (!
preg_match("/^([0-9a-f\.\/:]+)$/",strtolower($ip))) {
        return 
false;
    }

    if (
substr_count($ip,":") < 2) {
        return 
false;
    }

    
$part preg_split("/[:\/]/"$ip);
    foreach (
$part as $i) {
        if (
strlen($i) > 4) {
            return 
false;
        }
    }

    return 
true;
 }

 if(
is_ipv6() === true){
    echo 
"ipv6 입니다.";
 } else {
    echo 
"ipv4 입니다.";
 } 
 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

preg_match 함수를 이용해서 모바일로 접속했는지 여부를 확인할 수 있습니다.

예제 (ex #1
 <?php
 // HTTP_USER_AGENT 로 체크해보면 다음과 같은 결과를 보여줍니다.
 // 결과: Mozilla/5.0 (Linux; U; Android 2.2; ko-k... 

 
// 모바일 목록
 $mobilechk '/(iPod|iPhone|Android|BlackBerry|SymbianOS|SCH-M\d+|Opera Mini|Windows CE|Nokia|SonyEricsson|webOS|PalmOS)/i'


 
// 모바일 접속인지 PC로 접속했는지 체크합니다.
 
if(preg_match($mobilechk$_SERVER['HTTP_USER_AGENT'
])) {
    echo 
'모바일 접속입니다.'
;
 } else { 
    echo 
'PC 접속입니다.'

 } 
 ?>

다음 3G로 접속하여 ip 를 확인해 보겠습니다. 참고로 저는 LG U+ 3G로 접속합니다.

예제 (ex #2

 <?php
 
function getRealIpAddr
(){   
    if(!empty(
$_SERVER['HTTP_CLIENT_IP']) &&
     
getenv('HTTP_CLIENT_IP'
)){   
        return 
$_SERVER['HTTP_CLIENT_IP'
];   
    }  
    elseif(!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']) &&
     
getenv('HTTP_X_FORWARDED_FOR'
)){   
        return 
$_SERVER['HTTP_X_FORWARDED_FOR'
];   
    }  
    elseif(!empty(
$_SERVER['REMOTE_HOST']) &&
     
getenv('REMOTE_HOST'
)){   
        return 
$_SERVER['REMOTE_HOST'
];   
    }  
    elseif(!empty(
$_SERVER['REMOTE_ADDR']) &&
     
getenv('REMOTE_ADDR'
)){   
        return 
$_SERVER['REMOTE_ADDR'
];   
    }   
    return 
false
;   
 }  
 echo 
getRealIpAddr
(); // 결과: 61.43.181.52 
 ?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

다음 소스로 국내 ip만 허용하거나, 아니면, 중국 ip를 차단시키거나 할 수 있습니다. 물론 완벽 차단은 어려울 수 있지만 어느 정도 효과는 있습니다. 이 소스는 geoip소스를 기초로 작성되었습니다.

먼저, 디비를 만들도록 합니다. 적절히 수정해서 디비를 만들도록 합니다. 여기서 필수 필드는 einterip 필드입니다.

 <?php
 $conn 
mysql_connect('localhost''디비 유저''디비 패스워드'
);
 if (!
$conn
) {
    die(
'연결 실패: ' mysql_error
());
 }
 echo 
'mysql 연결 성공!<br />'
;

 // 서버 접속이 종료되었는지 확인합니다.
 if (!mysql_ping($conn
)) {
    echo 
'서버 접속이 종료되었습니다.'
;
    exit;
 } 

 // 디비를 선택합니다.
 $selected mysql_select_db('디비 이름'$conn
);
 if (!
$selected
) {
    die (
'디비 연결실패 : ' mysql_error
());
 }

 $createtb 
"CREATE TABLE geoipcountry (
            sip char(15) NOT NULL, // 시작 ip
            eip char(15) NOT NULL, // 종료 ip
            sinterip int(10) unsigned NOT NULL, // 시작 ip 정수
            einterip int(10) unsigned NOT NULL, // 종료 ip 정수
            scountry char(3) NOT NULL, // 언어 최대 3자리 ex. US, KO
            bcountry char(50) NOT NULL, // 언어 최대 50자리 ex. KOREA, CHINA
            PRIMARY KEY  (einterip)
            KEY idx (sinterip,einterip)
        )
 "
;

 mysql_query($createtb
);


 // 서버 연결 종료
 if (is_resource($conn
)) {
     
mysql_close($conn
);
 }
 ?>

다음 코드로 GeoIPCountryWhois.csv 파일을 디비에 insert 해 줍니다.
(관련글: 2011/08/20 - [다운로드] - 전세계 ip 대역, 국내 ip 대역)

 <?php 
 $conn 
mysql_connect('localhost''디비 유저''디비 패스워드'
); 
 if (!
$conn
) { 
    die(
'연결 실패: ' mysql_error
()); 
 } 
 echo 
'mysql 연결 성공!<br />'


 
// 서버 접속이 종료되었는지 확인합니다. 
 
if (!mysql_ping($conn
)) { 
    echo 
'서버 접속이 종료되었습니다.'

    exit; 
 }  

 
// 디비를 선택합니다. 
 
$selected mysql_select_db('디비 이름'$conn
); 
 if (!
$selected
) { 
    die (
'디비 연결실패 : ' mysql_error
()); 
 } 

 $row 1
 
$handle fopen("GeoIPCountryWhois.csv""r"
); 
 while ((
$data fgetcsv($handle1000",")) !== false
) { 
    
$num count($data
); 
    echo 
"$row<br />\n"

    
$row
++; 

    
$sql false

    
$sql "INSERT INTO geoipcountry VALUES ("


    for (
$c=0$c $num$c
++) { 
        
$sql .= "'" $data[$c] . "'"

        if(
$c+!== $num
){ 
            
$sql .= ", "

        }
        
set_time_limit(0
);
    } 
    
$sql .= ");"
;  
 
 fclose($handle
);

 // 서버 연결 종료
 if (is_resource($conn
)) {
     
mysql_close($conn
);
 }
 ?> 

입력이 완료되었으면, 다음 코드로 원하지 않는 국가 ip를 차단해 줍니다.

 <?php 
 $conn 
mysql_connect('localhost''디비 유저''디비 패스워드'
); 
 if (!
$conn
) { 
    die(
'연결 실패: ' mysql_error
()); 
 } 
 echo 
'mysql 연결 성공!<br />'


 
// 서버 접속이 종료되었는지 확인합니다. 
 
if (!mysql_ping($conn
)) { 
    echo 
'서버 접속이 종료되었습니다.'

    exit; 
 }  

 
// 디비를 선택합니다. 
 
$selected mysql_select_db('디비 이름'$conn
); 
 if (!
$selected
) { 
    die (
'디비 연결실패 : ' mysql_error
()); 
 }  

 function getRealIpAddr(){  
    if(!empty(
$_SERVER['HTTP_CLIENT_IP']) && getenv('HTTP_CLIENT_IP'
)){  
        return 
$_SERVER['HTTP_CLIENT_IP'
];  
    } 
    elseif(!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']) && getenv('HTTP_X_FORWARDED_FOR'
)){  
        return 
$_SERVER['HTTP_X_FORWARDED_FOR'
];  
    } 
    elseif(!empty(
$_SERVER['REMOTE_HOST']) && getenv('REMOTE_HOST'
)){  
        return 
$_SERVER['REMOTE_HOST'
];  
    } 
    elseif(!empty(
$_SERVER['REMOTE_ADDR']) && getenv('REMOTE_ADDR'
)){  
        return 
$_SERVER['REMOTE_ADDR'
];  
    }  
    return 
false
;  
 } 


 $ip false
;
 $ip getRealIpAddr
();

 // inet_aton 함수는 ip를 정수로 변환하는 함수임.
 // ex. #1
 $sql  "SELECT scountry,bcountry FROM geoipcountry WHERE einterip
    >= inet_aton('
$ip')"
;

 // ex. #2
 $sql  "SELECT scountry,bcountry FROM geoipcountry WHERE sinterip 
    <= inet_aton('
$ip') AND  einterip >= inet_aton('$ip')"
;

 if(
$result mysql_query($sql
)){
    
$row mysql_fetch_array($result
);
 } 

 // 중국 ip 차단
 if($row['scountry'] === "CN"){
    exit(
"죄송합니다. " . $row['bcountry'] .
      " ip는 접근이 차단되었습니다."
);
 }

 // 서버 연결 종료
 if (is_resource($conn
)) {
     
mysql_close($conn
);
 }
 ?> 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

프록시의 익명성을 이용하면 인터넷에서 악의적인 리플이나 불법적인 행동을 하는 이를 원천 봉쇄가 어려울 수 있습니다. 사용자PC에서 프록시 서버를 경유해 특정 웹사이트로 접근하면 프록시 서버에 의해 사용자의 리얼ip를 숨길 수 있기 때문입니다.

그런데, 웹사이트에 접근할 때, 여러 가지 헤더정보를 넘겨 주게 되는데, 거기에 원 사용자 ip도 같이 넘겨 받게 됩니다. 그 메소드가 "X-Forwarded-For"이고, php에서는 "HTTP_X_FORWARDED_FOR" 변수에 담겨 지게 됩니다.

그러므로 HTTP_X_FORWARDED_FOR 변수로 비교 체크하여 불량 ip를 어느 정도 봉쇄할 수도 있지 않을까 싶습니다.

 <?php 
 
function getRealIpAddr(){ 
    if(!empty(
$_SERVER['HTTP_CLIENT_IP']) && getenv('HTTP_CLIENT_IP')){ 
        return 
$_SERVER['HTTP_CLIENT_IP']; 
    }
    elseif(!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']) && getenv('HTTP_X_FORWARDED_FOR')){ 
        return 
$_SERVER['HTTP_X_FORWARDED_FOR']; 
    }
    elseif(!empty(
$_SERVER['REMOTE_HOST']) && getenv('REMOTE_HOST')){ 
        return 
$_SERVER['REMOTE_HOST']; 
    }
    elseif(!empty(
$_SERVER['REMOTE_ADDR']) && getenv('REMOTE_ADDR')){ 
        return 
$_SERVER['REMOTE_ADDR']; 
    } 
    return 
false
 }


 if(
$ip getRealIpAddr()){
     echo 
$ip;
 }
 
?>

참고: http://hackersnews.org/hn/read.cgi?board=hn_sangsik&nnew=2&y_number=83
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요


 <?php
 
// $info[$i]["address"]: 서버 ip(또는 도메인)을 작성.
 // $info[$i]["port"]: 테스트할 포트를 작성.

 // 서버가 응답을 한다면 "Server Up" 메시지가 나오겠지만,
 // 응답이 없으면 "Server Down" 메시지가 나오게 됩니다.
 // 포트번호에 대한 구체적 정보는 아래 링크를 참조해 주세요.


 // 야후 80포트 Down 여부 확인.
 
$info[1]["address"]="yahoo.co.kr"

 
$info[1]["port"]="80"
;

 
// MS FTP 서버 Down 여부 확인.
 
$info[2]["address"]="ftp.microsoft.com"

 
$info[2]["port"]="21"


 
// 개인PC Down 여부, ip 주소로 테스트합니다. 
 // 본인의 ip주소로 테스트해 볼 수 있습니다.
 
$info[3]["address"]="207.46.133.140"

 
$info[3]["port"]="139"



 
// 확인할 ip 수
 
$infocount 3

 
// 지연시간, 기본 5초
 
$timeout 5


 for (
$i=1$i<=$infocount$i
++){ 
      
$fp = @fsockopen($info[$i]["address"], $info[$i]["port"], $errno$errstr$timeout
);
      if (
$fp
) { 
           echo 
"<br />Server Up: ".$info[$i]["address"]." [".$info[$i]["port"]. "]"
;
      } else {
           echo 
"<br /><font color='red'>Server Down: " $info[$i]["address"] . " [" $info[$i]["port"] . "]</font>"

      }
 }
 
?>

예제 (ex #1

 <?php 
 // 해당 ip Down 여부 확인.
 
$info["address"]="207.46.133.14"

 
$info["port"]="139"


 $fp = @fsockopen ($info["address"], $info["port"],
                    
$errno$errstr5
); 
 if (
$fp
) {  
      echo 
"해당 ip주소로 글 등록이 가능합니다."

 } else { 
      echo "실재 존재하는 ip주소가 아니므로 글등록 거부합니다. 스팸은 사양입니다."

 }
 
?>


게이트웨이나 일반 공유기 사용자일 경우 다음과 같이 임의대로 조회해서 테스트해줘도 되며, 만약 열려진 포트가 있다면 진행을 멈추게 됩니다.

예제(ex #2

제목

 <?php
 $port 
'7 9 13 17 19 20 21 23 25 42 47 50 51 53 80 88 102 110 119 
 135 139 143 389 443 445 464 515 548 554 554 563 593 636 993 1067 
 1068 1270 1433 1723 1755 1801 2101 2103 2105 2107 2393 2394 2701 
 2702 2703 2704 2725 2869 3268 3269 3389 5000 5722 6001 6002 6004 
 42424 51515'

 
$portarr split(" "$port
);

 // 테스트할 ip 
 
$ip = "125.185.168.129";



 foreach(
$portarr as $v
){
      if(
$fp = @fsockopen ($ip, $v$errno$errstr2
)){
           echo 
"Server Up : 125.185.168.129 [" $v "]<br />"
;
           break;
      } else {
           echo 
"<font color='red'>Server Down : 
                   125.185.168.129 ["
.$v."]</font><br />"
;
      }
 }
 /*
 결과:
 Server Down : 125.185.168.129 [7]
 Server Down : 125.185.168.129 [9]
 Server Down : 125.185.168.129 [13]
 Server Down : 125.185.168.129 [17]
 Server Down : 125.185.168.129 [19]
 Server Down : 125.185.168.129 [20]
 Server Up : 125.185.168.129 [21]
 */
 ?>


일반적인 핑 테스트 요청은 다음 링크에서 사용해 볼 수 있지만, 필요하다면 아래 링크에서 소스를 다운받아 사용할 수도 있습니다. 단, system함수 사용이 가능하여야 합니다.

  참고: http://www.theworldsend.net/

 핑테스트: http://www.theworldsend.net/php-ping.php

포트번호 참고: 2011/07/19 - 프로토콜 및 번호 포트


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

 <?php
 
// 이메일 발송
 // toname, toemail = 받는 사람
 // fromname, fromemail = 보내는 사람
 // title = 제목
 // content = 본문내용
 // charset = 언어, 기본값: euc-kr
 // mode = TEXT/HTML
 // att = 첨부파일, 예제: $_FILES['userfile']['tmp_name']
 // 파일이 여러 개일 경우
 // 하나의 파일에 대한 정보를 :로 구분해서 묶어 주어 ,로 구분해 줍니다.
 // $_FILES['userfile']['tmp_name']:$_FILES['userfile']['name']:MIMETYPE
 //  tmp_name[0]:name[0]:mime[0],tmp_name[1]:name[1]:mime[1]
 
function email(
    $toname
,$toemail,$fromname,$fromemail,$title,$content,
    $charset
='euc-kr',$att='',$mode='TEXT/HTML'
 
){
       
       
$Arrayfile explode(',',$att
);


       
// 받는 사람
       
$recipient $toname." <".$toemail.">\r\n"
;


       
// 기본 헤더 코드
       
$header .= "Return-path: <".$fromemail.">\r\n"
;
       
$header .= "From: ".$fromname."<".$fromemail.">\r\n"
;
 
       
// 에러발생시 반송될 주소
       
$header .= "Reply-To:".$fromname."<".$fromemail.">\r\n"
;
       
$header .= "MIME-Version: 1.0\r\n"
;
       
$header .= "X-Sender: <".$fromemail.">\r\n"
;
       
$header .= "X-Mailer: PHP\r\n"
;


       
// 첨부파일이 없다면...
       
if(empty($att
)){

             
// 내용 첨부
             
$header .= "Content-Type: ".$mode.
                          "; charset="
.$charset."\r\n"
;
             
$body $content."\r\n\r\n"
;
       }
       
// 첨부파일이 있다면...
       
else{

            for(
$i=0$i<count($Arrayfile); $i
++){
                  list(
$upfile[$i],$filename[$i],$mimetype[$i])
                    = 
explode(':',$Arrayfile[$i
]);

                  
// 파일열기
                  
$fp[$i] = @fopen($upfile[$i],"r"
);
                  
$file[$i] = @fread($fp[$i],@filesize($upfile[$i
]));
                  @
fclose($fp[$i
]);

                  
// 파일 타입
                  
if(empty($mimetype[$i
])){
                        
$mime[$i] = "application/octet-stream"
;
                  } else {
                        
$mime[$i] = $mimetype[$i
];
                  }
             }


             
$boundary "--".uniqid("gmForm editor"
);
             
$header .= "Content-type: MULTIPART/MIXED;
                          BOUNDARY=\"$boundary\""
;
             
$body "This is a multi-part message in MIME format.\r\n\r\n"
;
             
$body .= "--$boundary\r\n"
;


             
// 내용 첨부
             
$body .= "Content-Type: ".$mode."; charset=".$lang."\r\n"
;
             
$body .= "Content-Transfer-Encoding: base64\r\n\r\n"
;
             
$body .= chunk_split(base64_encode($content))."\r\n\r\n"
;


             for(
$i=0$i<count($Arrayfile); $i
++){
   
                   
// 파일 첨부
                  
$body .= "--$boundary\r\n"
;
                  
$body .= "Content-Type: $mime[$i];
                             name=\"$filename[$i]\"\r\n"
;
                  
$body .= "Content-Transfer-Encoding: base64\r\n\r\n\r\n"
;
                  
$body .=
                        
chunk_split(base64_encode($file[$i]))."\r\n"
;
             }
             
$body .= "\r\n--$boundary--\r\n"
;
      }


      return @
mail($recipient,$title,$body,$header
);

 }
 
?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

 <?php
 
function alink($data
) {
 
 
// http 
 
$data preg_replace("/http:\/\/([0-9a-z-.\/@~?&=_]+)/i""<a href=\"http://\\1\" target='_blank'>http://\\1</a>"$data
);

 
// ftp 
 
$data preg_replace("/ftp:\/\/([0-9a-z-.\/@~?&=_]+)/i""<a href=\"ftp://\\1\" target='_blank'>ftp://\\1</a>"$data
);

 
// email
 
$data preg_replace("/([_0-9a-z-]+(\.[_0-9a-z-]+)*)@([0-9a-z-]+(\.[0-9a-z-]+)*)/i""<a href=\"mailto:\\1@\\3\">\\1@\\3</a>"$data
);

 return 
$data
;

 }
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

 <?php 
 
//  썸네일 생성함수 
 // $mime       = 1, gif 
 //               2, jpg 
 //               3, png 
 //               4, bmp 
 // $tmpfile    = 실제 존재하는 그림파일 경로 
 // $src        = 썸네일 생성할 경로 
 // $tmpsize    = 기본값, 100 
 
function thumbWrite($mime,$tmpfile,$src,$tmpsize
){ 
    if(!
file_exists($tmpfile
)){ 
        return 
false

    } 
    if(!
file_exists($src
)){ 
        return 
false

    } 
    if(!
is_int($tmpsize) || ($tmpsize 100
)){ 
         
$tmpsize 100

    } 


    
$size getimagesize($tmpfile,&$sizes
); 


    if(
$size[0] >= $size[1
]) { 
         
$x $tmpsize

         
$y = (($tmpsize $size[1])/$size[0
]); 
    } else { 
         
$y $tmpsize

         
$x = (($tmpsize $size[0])/$size[1
]); 
    } 




    if(
function_exists('imagecreatefromgif') && ($mime === 1
)) { 
        
$tmpsrc =    imagecreatefromgif($tmpfile
); 
        
$thumb  =    imagecreatetruecolor($x,$y
); 
                    
imagecopyresized(
                      $thumb,
$tmpsrc,0,0,0,0,$x,$y,
                     
imagesx($tmpsrc),imagesy($tmpsrc
)
                    ); 
                     
imagegif($thumb,$src
); 
    } elseif(
function_exists('imagecreatefromjpeg') && ($mime === 2
)) { 
        
$tmpsrc =    imagecreatefromjpeg($tmpfile
); 
        
$thumb  =    imagecreatetruecolor($x,$y
); 
                    
imagecopyresized(
                     
$thumb,$tmpsrc,0,0,0,0,$x,$y,
                      imagesx
($tmpsrc),imagesy($tmpsrc
)
                     ); 
                     
imagejpeg($thumb,$src
); 
    } elseif(
function_exists('imagecreatefrompng') && ($mime === 3
)) { 
        
$tmpsrc =    imagecreatefrompng($tmpfile
); 
        
$thumb  =    imagecreatetruecolor($x,$y
); 
                    
imagecopyresized(
                       $thumb
,$tmpsrc,0,0,0,0,$x,$y,
                       imagesx
($tmpsrc),imagesy($tmpsrc
)
                     ); 
                    
imagepng($thumb,$src
); 
    } elseif(
function_exists('imagecreatefromwbmp') && ($mime === 4
)) { 
        
$tmpsrc =    imagecreatefromwbmp($tmpfile
); 
        
$thumb  =    imagecreatetruecolor($x,$y
); 
                    
imagecopyresized(
                     
$thumb,$tmpsrc,0,0,0,0,$x,$y,
                      imagesx
($tmpsrc),imagesy($tmpsrc
)
                     ); 
                     
imagewbmp($thumb,$src
); 
    } 


    
imagedestroy($thumb
); 
    
imagedestroy($tmpsrc
); 
 } 
 
?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

이번 난수 생성기는 특수문자 하나를 포함하여 보안성을 높였습니다.

 <?php  
 
function makeRand($len=6
) { 
    if(!
ereg("^(0|[1-9]+$)"$len) || ($len 6
)) { 
        
$len 6

    } 
    
srand((float) microtime() * 10000000
); 
    
$schar array_rand($specialchar = array('@','#','%','&','*','+'
)); 


    
$rand_keys array_merge(range('A''Z'), range('z''a'), range(19
)); 
    
shuffle($rand_keys
); 


    
$data false
;
    for(
$i=0$i<$len$i
++){ 
        if(
$i === $schar
){ 
            
$data .= $specialchar[$schar
]; 
        } else { 
            
$data .= $rand_keys[$i
]; 
        } 
    } 


    return 
$data

 }  
 
$rand makeRand
(); 
 echo 
$rand
// 결과: nk%ma3N 


 // <input type='text' name='rand' value='aDx*c6n'> 
 // 난수 nk%ma3N, 사용자 aDx*c6n  
 
if($rand !== $_POST['rand'
]){ 
    exit(
'입력하신 난수와 생성한 난수가 틀립니다. 정상적인 방법으로 접근해 주세요.'
); 
 } 
 
?> 



관련글: 2011/06/11 - [phP 함수 레퍼런스/함수 활용] - 난수 생성기
           2011/06/13 - [phP 함수 레퍼런스/배열 함수] - 배열을 임의의 순서로 섞는 shuffle 함수
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

php에서는 다양한 난수를 만들어 낼 수 있습니다. 물론 다양하다는 말 즉은 개발자들 약간의 수고로움이 있어야 가능한 일입니다.

초기에 난수 생성기를 사용할때, 보통 srand()로 난수를 초기화하고, rand()로 정수 난수를 생성하였지만, 기존의 방식은 많이 느리다는 단점에  mt_rand()로 대체하길 권고하는데, 이는 확실히 특성을 가진 난수 생성기를 이용합니다. 이것은 평균적인 libc 제공의 난수 생성기에 비해 4배 정도 빠르게 동작합니다.

또한 PHP 4.2.0부터 srand()나 mt_srand()를 이용하여 난수 생성 초기화 필요없이 바로 randmt_rand 로 난수를 만들어 낼 수 있고, PHP 5.2.1 이후 부터 동일한 값을 생성하지 않는다고 메뉴얼에 나와 있습니다. 그래도 안정성을 위해 mt_srand 로 초기화하길 권합니다.


int
mt_rand ( int $min , int $max ) (PHP 4, PHP 5)

mt_rand 난수 생성기는 사용법이 rand 함수와 동일하며, 선택적인 min , max 인수 없이 호출하면, mt_rand()는 0과 mt_getrandmax() 사이의 모조 난수를 반환합니다. 예를 들어, 5와 15(포함)사이의 난수를 원할 경우에는, mt_rand(5, 15)로 사용합니다.

mt_getrandmax() 함수는 mt_rand()를 호출했을 때 반환될 수 있는 가장 큰 값, 2147483647 값을 가지기 때문에 mt_rand(0, mt_getrandmax()); 로 범위 지정이 가능합니다.

예제 (ex #1

  <?php
 
// seed with microseconds
 
function make_seed
(){
      list(
$usec$sec) = explode(' 'microtime
());
      return (float) 
$sec + ((float) $usec 100000
);
 } 

 
mt_srand(make_seed
());
 
$randval mt_rand(0,mt_getrandmax
()); 


 echo 
$randval
// 결과: 2003708190 




 
$randval mt_rand
(); 


 echo 
$randval
// 결과: 1765245802
 
?>

예제 (ex #2

 <?php
 
echo mt_rand() . "\n"
;
 echo 
mt_rand() . "\n"
;


 echo 
mt_rand(515
);
 
?> 


다음은 난수 발생기는 아니지만, 배열에서 하나 이상의 임의 원소를 가져 옵니다. 첫 번째 인자는 입력할 배열이고, 두 번째 인자는 가져올 배열의 갯수를 지정합니다.

예제 (ex #3
 <?php
 mt_srand
((float) microtime() * 10000000
);
 
$input = array("Neo""Morpheus""Trinity""Cypher""Tank"
); 

 
$rand_keys array_rand($input2
); 


 echo 
$input[$rand_keys[0]] . "\n"


 echo 
$input[$rand_keys[1]] . "\n"


 
// 결과: Neo Cypher
 
?>

다음과 같은 난수 발생기는 완벽하게 자동등록봇으로부터의 차단은 불가하지만 숫자로만 이루어진 기존 방식 보다는 보안성이 조금 개선된다 생각하시면 됩니다.

 <?php 
 
function makeRand($len=6
) {
    if(!
is_int($len) || ($len 6
)) {
        
$len 6
;
    }
    
$arr array_merge(range('A''Z'), range('z''a'), range(19
));


    
$rand false

    for(
$i=0$i<$len$i
++) { 
       
$rand .= $arr[mt_rand(0,count($arr)-1
)]; 
    } 
    return 
$rand
;
 } 
 
$rand makeRand
();
 echo 
$rand
// 결과: nkma3N


 // <input type='text' name='rand' value='aDxc6n'>
 // 난수 nkma3N, 사용자 aDxc6n 
 
if($rand !== $_POST['rand'
]){
    exit(
'입력하신 난수와 생성한 난수가 틀립니다. 정상적인 방법으로 접근해 주세요.'
);
 }
 
?>


관련글: 2011/06/13 - [phP 함수 레퍼런스/배열 함수] - 난수 생성기 #2

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

Update : 2015.11.17


 <?php 

 // $total_count 게시물 수 
 // $page list.php?page=1   // $limit 한 화면에 뿌려질 글 수  // $link [1] [2] [3] [4]...   
function pageList($total_count=0$page=1$limit=10$link=10) {     $total_page = @ceil$total_count $limit );     if($page <= 1)     {         $page 1;     }     else if($total_page $page)     {         $page $total_page;     }
    
$start_limit = ($page-1) * $limit;
    if(
$total_count $limit)     {         $end_limit $total_count;     }     elseif($page === $total_page)     {         $end_limit $total_count - ($limit * ($total_page 1) );     }     else     {         $end_limit $limit;     }
    
$prev $page 1;     $next $page 1;
    if(
$total_count <= 0)     {         $prev 0;         $next 0;     }
    
$start = ((@ceil($page/$link)-1) * $link) + 1;     $end $start $link -1;     if($end $total_page)     {         $end $total_page;     }
    foreach(
range($start$end) as $val)
{         $row[] = $val    }
    return array(
        'total_page' => $total_page,
        'page' => $page,
        'prev' => $prev,
        'next' => $next,
        'list' => $row
    );
 }

// example.
$total 1223457890 $list pageList$total$_GET['page'] ); foreach($list['list'] as $w) {     echo "<a href='list.php?page=".$w."'>".$w."</a> "; } ?> <br/> <form method="get"> <a href="list.php?page=<?php echo $list['prev']; ?>">prev</a>
<input type='number' name='page'  value="<?php echo $list['page'?>" size="4" onclick="this.select()"/>/
<input value="<?php echo $list['total_page']; ?>" size="4" disabled/>
<input type="submit" value="GO"/> <a href="list.php?page=<?php echo $list['next']; ?>">next</a>
</form>  

결과 화면:


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

[펌]괜찮은 소스가 있어 올려 봅니다.

 <?php
 
function file_size($size
) {
      
$sizes = array(" Bytes"" KB"" MB"" GB"" TB"" PB"" EB"" ZB"" YB"
);
      if (
$size == 0
) {
           return(
'n/a'
);
      } else {
           return (
round($size/pow(1024, ($i floor(log($size1024)))), 2) . $sizes[$i
]);
      }
 }

 
 
$filesize filesize("test_move.avi"); 
// 파일크기: 123520000
 
$size file_size($filesize
);

 echo 
$size
// 결과: 117.8 MB
 
?>

출처: http://kr2.php.net/manual/en/function.filesize.php
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요