태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
   情  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
'php'에 해당하는 글(4)
2008.11.16   PHP 지정된 파일의 mime 타입 알아내기
2008.10.28   PHP 전송 값 중에 역슬러쉬 문제
2008.07.26   PHP에서 Form값 전달받기 (1)
2008.07.25   PHP 기초문법 및 변수


PHP 지정된 파일의 mime 타입 알아내기

mime_content_type

(PHP 4 >= 4.3.0, PHP 5)

string mime_content_type (string filename)
지정된 파일의 Mime Content Type을 반환합니다. 반환된 문자열은 text/plain 또는 application/octet-stream과 같은 MIME포멧입니다.

mime_content_type()을 사용한 예제소스

<?php
    echo mime_content_type('php.gif') . "\n";
    echo mime_content_type('test.php');
?>

결과는 다음과 같습니다.

image/gif
text/plain

아래는 사용자 코멘트

파일이름에 '+'문자가 포함되어 있으면 다음과 같은 경고를 내보내는 것 같습니다.(php 4.3)
    Warning: mime_magic: invalid mode 01002354664

모든 파일에 대해서 옳바른 Mime타입을 반환하지 않는 다는 것에 주의하세요. 예를들어 '.wmv'나 '.wma'는 바르게 인식 되지 않습니다.

제 MS windows환경에서는 다음과 같이 해야 mime_content_type함수를 사용할 수 있었습니다.
php.ini파일을 열고 mime_magic.debug라는 항목을 Off에서 On으로 변경
    [mime_magic]
    mime_magic.debug = On
    mime_magic.magicfile = "c:\php\extras\magic.mime"

이 함수는 windows에서도 동작합니다. 하지만 다음과 같은 사항을 php.ini파일을 열고 확인해보세요.
다음 라인이 주석해제 되어있는지 확인(다음 라인을 찾아서 앞에 세미콜론이 있다면 제거합니다.)
    extension=php_mime_magic.dll
php.ini파일의 아무 위치에 다음과 같은 라인을 확인하고 없으면 작성합니다.
    mime_magic.magicfile = "C:\php경로\magic.mime"

Linux 환경에서 mime_content_type를 사용할 수 없는 경우 때문에 다음과 같은 대체 함수를 사용합니다.
<?php
if (!function_exists('mime_content_type')) //해당 함수를 사용할 수 없다면
{
   function mime_content_type($f)  //이 대체함수를 사용
   {
      $f = escapeshellarg($f); 
      return trim( `file -bi $f` );
   }
}
?>

다음과 같은 대체 함수는 보안상 상당히 좋지않습니다. 왜냐하면, 업로드된 파일의 Mime 타입을 체크하여 실행파일이나 기타 원하지 않는 파일을 제거하고자 할 때 다음과 같은 mime_content_type체크 방법은 상당히 허술하기 때문입니다. '바이러스.exe.txt'와 같이 실행파일을 다른 파일로 속여서 업로드 한 뒤, 그 파일을 서버에서 실행할 수 도 있으며, php나 기타 코드 파일을 이미지파일로 속여서 업로드하여 코드를 실행 할 수 있기 때문입니다.
<?php
function mime_content_type_($filename)
{
    $mime = array
    (
        '.3dmf' => 'x-world/x-3dmf',
        '.a' => 'application/octet-stream',
        '.aab' => 'application/x-authorware-bin',
        //기타 자신이 원하는 확장자와 mime타입 기술
        '.xwd' => 'image/x-xwd',
        '.xyz' => 'chemical/x-pdb',
        '.z' => 'application/x-compressed',
        '.zip' => 'application/x-zip-compressed',
        '.zoo' => 'application/octet-stream',
        '.zsh' => 'text/x-script.zsh',
   );
   return $mime[strrchr($filename, '.')];
}
?>

출처 : php매뉴얼

번역 : thankee

신고
Tag : php

name    password    homepage
 hidden


PHP 전송 값 중에 역슬러쉬 문제

폼에 데이터를 입력하고 PHP에서 입력을 받게 될 경우, 역슬러쉬가 붙어 버리는 문제가 있습니다.

send.html
<form action="receive.php" method="post">
    <input type="text" name="data" />
    <input type="submit" />
</form>

receive.php
<?php
    echo $_POST['data'];
?>

위의 소스를 실행해서 폼에 다음과 같은 데이터를 입력합니다.

1

위의 데이터를 입력하면 출력값은 다음과 같습니다.

2

이상하게 역슬러쉬가 붙어버렸습니다. 이 문제의 원인은 php.ini에서 magic_quotes_gpcOn으로 되어 있을 경우, PHP의 모든 GPC데이터(Get/Post/Cookie)는 자동으로 특정 문자에 역슬러쉬를 자동으로 부여해버립니다. 이는 데이터베이스에 데이터를 입력할 경우 수동으로 역슬러쉬를 붙이지 않고 자동으로 역슬러쉬가 붙기를 희망하는 사용자를 위해 만들어진 기능이라고 하더라구요.

만약 이 자동으로 역슬러쉬를 붙이는 기능을 원하지 않으면 php.ini를 열고 magic_quotes_gpcOn(기본 값)에서 Off로 변경하면 됩니다. 이 기능과 함께 다음과 같은 부가 함수도 제공합니다.

string stripslashes(string)와 string addslashes(string)라는 함수로서 각각 슬러쉬를 제거하거나 슬러쉬를 붙여버리는 함수입니다. stripslashes()는 PHP에서 GPC데이터에 붙인 역슬러쉬만을 제거하는 기능을 가지고 있습니다. addslashes()는 반대로 특정 문자열에 역슬러쉬를 붙여버리며 stripslashes()로 원상복귀 가능합니다.

receive.php를 다음과 같이 수정한 후 출력해봅시다.

receive.php
<?php
    $a = addslashes($_POST['data']);
    $b = stripslashes($_POST['data']);
    $c = $_POST['data'];
    echo "addslahses : $a <br />stripslashes : $b <br /> nomal text : $c";
?>

결과는 다음과 같습니다.

image

신고
Tag : php

name    password    homepage
 hidden


PHP에서 Form값 전달받기

Get, Post에 대한 간략한 설명

웹에서 Form에 입력된 데이터를 전송하는 방법에는 두가지가 있습니다. Get과 Post방법인데요, 이 둘다 각 자 특징과 장단점이 존재하기에 상황에 따라 선택적으로 사용되어집니다.

  1. Get : 이 방법은 웹 주소 뒤에 데이터를 붙여서 전송하는 방법입니다. Get은 Post보다 빠르지만, 보통 데이터의 전송량이 Post방식보다 작고, 웹 주소에 데이터가 노출되기에 누구나 전송되는 데이터를 볼 수 있습니다. 따라서 아이디나 패스워드를 Get방식으로 전송하는 것은 옳바르지 못합니다.
    하지만 Get방식은 주소에 데이터가 포함되어 있기때문에, 해당 페이지를 그대로 북마크할 수 있으며, 주소만 저장해둬도 해당 페이지를 그대로 재방문할 수 있다는 점입니다.
  2. Post : Post방식은 HTTP 헤더에 전송데이터를 포함시켜 전송하는 방법입니다. 주소가 노출되지 않기 때문에 아이디, 패스워드 또는 노출되지 말아야할 정보를 전송하는데 적합한 방식입니다.
  3. 위의 Get과 Post방식을 정하는 방법은 다음과 같습니다. 예를 들어 Post를 사용한다고 하면 아래와 같습니다. Get을 사용하고 싶다면, Post를 Get으로 변경하면됩니다.

<form method="post" action="receive.php">
  Name : <input type="text" name="name">
  <input type="submit" value="Send">
</form>

PHP에서 Form값 전달하기

전송된 데이터를 전송받는 방법은 두가지로 나뉩니다.

  1. 이전 버전의 PHP에서는 Post나 Get으로 전송된 데이터를 자동으로 변수화하기 때문에, 바로 일반 변수처럼 사용할 수 있었습니다. 하지만, 이로인한 보안 문제가 발생하면서 이 방법이 기본적으로 Disabled되었고 'register_globals=Off'라는 옵션이 php.ini파일에 추가되었습니다.  이 옵션의 값을 Off에서 On으로 변경하였을 시, 예전처럼 PHP가 전송되어져 온 값을 자동으로 변수화 합니다.
        echo $name; //전송된 name값을 바로 사용할 수 있다.
  2. PHP 4.X 버전 부터는 'register_globals=Off' 옵션이 추가되고, 옵션값이 off인 상태에서는 전송된 값을 바로 변수처럼 쓸 수 없습니다. (이 방법이 더 권장되고있습니다.)
    대신 다음과 같이 전송된 데이터를 읽어들일 수 있습니다.
        $HTTP_GET_VARS['name']; 또는 $_GET['name'];
        $HTTP_POST_VARS['name']; 또는 $_POST['name'];
    체크박스와 같이 배열로 데이터가 전송되어야 하는 경우 다음의 경우를 조심합니다.
    - checkbox나 select문의 name 속성 값을 줄 때 마지막에 '[]'를 붙여주어야합니다. 그렇지 않은 경우 모든 데이터가 배열로서 전송되지 않습니다.
    - 받을 때는, $_GET[이름][첨자]로 참조합니다.
    소스는 다음과 같습니다.

send.html

<form method="get" action="receive.php">
    Favorites : <br>
    <select name="favorites[]" multiple>
        <option>Internet Surfing
        <option>Playing Games
        <option>Reading books
    </select>
    <input type="submit">
</form>

receive.php

<?
    $size = count($_GET[favorites]);

    for($i =0; $i < $size; $i++)
        echo $_GET[favorites][$i] . "<br>";
?>

신고
Tag : php
Commented by Favicon of http://grrfruity.blogspot.com/ BlogIcon grrfruity at 2010.02.01 13:08 신고  r x
옛날 서적을 가지고 공부하다 보니까 좀 문제가 많이 생기는 군요. 한참 해매다가 덕분에 겨우 해결할 수 있었네요.

name    password    homepage
 hidden


PHP 기초문법 및 변수

PHP문서의 작성

  1. <? ~ ?> 또는 <?PHP ~ ?>, <script language="PHP"> ~ </script>의 ~부분에 PHP 문장을 기술 하면 됩니다.
    (php.ini에서 short_open_tag = On으로 설정한 경우에만 <? ?>를 사용할 수 있습니다.)
  2. C언어와 거의 모든 문법이 동일합니다. 대소문자를 구별하며, 문장을 마칠 때는 반드시 ';'를 붙여야합니다.
    (<? ?>에서 뒤쪽의 '?'는 자체적으로 마침이라는 의미가 있으므로 세미콜론을 생략할 수 도 있습니다. <? echo "hello"; ?><? echo "hello" ?>로 표현 가능합니다.)
  3. HTML페이지로 출력하는 기본적인 함수는 echo를 사용합니다. echo "hello";, echo("hello"); 모두 동일한 표현입니다.
  4. 변수의 선언이 필요치 않으며, 어느 곳에서나 변수를 생성 사용할 수 있습니다. 변수의 타입의 지정이 필요없으며, 내부적으로 자동으로 타입에 맞게 형변환 되므로, 변수 타입에 대해 걱정할 필요가 없습니다.
  5. 변수의 선언은 문서의 어디서나 선언이 가능하며, 함수 외부에 선언된 것은 전역 변수, 함수 외부에 선언된 것은 지역 변수로 구분이 됩니다.
  6. 주석은 // 또는 /* */를 사용합니다.
  7. 몇몇 특수기호는 출력하기 위해 탈출문자를 사용해야합니다. 예를 들어 개행문자는 '\n', 슬러쉬는 '\\'로 표현할 수 있습니다.
  8. 일반적인 정수의 경우 1000억까지 표현이 가능하며, 그 이상부터 자동으로 지수 표기(E+) 됩니다.

변수

  1. PHP의 변수명은 예약어, 환경변수, 중복을 피해야 합니다.
  2. 변수의 타입은 내부적으로 자동으로 결정됩니다.
  3. 문자열은 기본적으로 ""(따옴표)안에 위치하게 되지만, 경우에 따라서 따옴표안에 위차한 문장도 숫자로 인식 되는 경우가 있습니다. 또한 따옴표가 없는 문장도 자동으로 문자열로 인식합니다. 이를 자동형변환이라 합니다
        $a = abcdef; //문자열 인식 정상 작동한다.
        $b = "12345"; //12345라는 문자열로 인식된다.
        $c = "1234" + 1; //"1234"는 문자열이지만 자동으로 형변환 되어 계산된다. 결과는 1235이다.
       
    $d = abcd + 3; //abcd에 숫자로 바꿀 수 있는 요소가 없으므로, 0으로 인식하여 0+3으로 계산 된다.
  4. 변수를 사용하기 위해서 변수의 선언이 필요 없으며, 따라서 변수명을 처음 사용한 곳이 해당 변수의 선언이 되는 것입니다.
  5. PHP에서 모든 변수는 '$'문자로 시작됩니다.
    $abc;
  6. PHP의 변수 확인
    -var_dump(); : '변수타입(변수값)'형태의 스트링을 리턴합니다.
    -is_type(); : type 대신에 변수 타입을 기술하면 됩니다. 타입이 일치하지 않으면 null, 일치하면 1을 반환합니다.
        $abc = 10;
        is_int($abc);
  7. 변수의 타입 :
    - boolean (또는 bool - PHP4.2 이 후 버전)
    - integer (또는 int - PHP4.2 이 후 버전)
    - float (또는 double - PHP4.2 이하 버전)
    - string
    - array
    - object
    - null (PHP4.2 이 후 버전)
  8. 변수의 형변환(Casting) : (변수형)으로 변수의 타입을 바꿀 수 있습니다.
        (int)"100"; //정수 100으로 변환된다.
  9. settype(변수, 타입) : 변수의 타입을 바꾸는 함수 입니다. 따라서 매개변수는 반드시 변수가 위치해야합니다. 타입으로 쓸수 있는 종류는 7 변수의 타입과 동일합니다. 사용 예는 아래와 같습니다.
       settype($abc, "string");
  10. 문자열의 표현
    문자열을 표현하기 위해서는 홀따옴표를 사용합니다. 쌍따옴표의 경우 역시 문자열로 인식하지만, 먼저 쌍따옴표 내부에 해석 가능한 문장이 있는지 찾아 해석한다음 문자열로 만든다는 차이점이 있습니다. 쌍따옴표를 사용하면 매우 간결하게 출력문을 작성할 수 있지만, 순수한 문자열의 경우는 홀따옴표를 사용하는 것이 바람직합니다.

전역변수

PHP에서 전역변수란 함수 내부에 위치한 변수를 제외한 모든 변수를 뜻합니다. PHP의 전역변수의 독특한 점은 함수 외부의 전역변수를 함수내부에서 곧바로 사용할 수 없다는 점입니다. 함수 내부에서 전역변수를 사용하기 위해서는 global 키워드를 사용하여야 합니다.

<?
    $a = 10;
    function test()
    {
        echo $a;
    }
    test();
?>

위 코드를 실행했을 때, 보통 다른 언어에서는 '10'을 출력하겠지만, PHP에서는 아무 것도 출력되지 않습니다. 함수 외부에서 선언된 $a는 전역변수로, 함수 내부에서 사용된 $a는 지역변수로 각각 다른 변수로 취급되기 때문입니다. 함수 외부에서 선언된 $a를 함수 내부에서 사용하기 위해서는 다음과 같이 global키워드를 사용해야합니다.

<?
    $a = 10;
    function test()
    {
        global $a; 
        echo $a;
    }
    test();
?>

일반적인 언어에서는 블록문안에서 선언된 모든 변수는 지역변수로 간주하지만, PHP에서는 함수내부에 변수만이 지역변수로 간주된다.

정적 변수

함수 내부의 변수는 지역변수이기 때문에 함수의 종료와 동시에 소멸됩니다. 하지만 함수가 종료되더라도 변수를 유지 시키고 싶다면 static키워드를 사용하면됩니다.

<?
    function test()
    {
        static $a;
        echo ++$a;
        echo " .";
    }
    test();
    test();
?>

출력 결과는 1, 2입니다.

배열

  1. 배열의 생성은 다음과 같은 방법이 있습니다.
    • array 함수의 이용.
      $arr = array("값1", 값2, 값3, array("값4", "값5"));
    • 첨자 직접 지정
          $arr[4] = "값1";
          $arr['a'] = 값3;
          $arr[10] = array("값10", "값11");
      배열 첨자는 마음대로 지정할 수 있습니다. 반드시 순서대로 지정할 필요 없으며, 중간에 첨자를 비워도 에러를 발생시키지 않습니다. 또한 첨자로 숫자와 문자열을 병행할 수 도 있습니다.
    • 첨자 없이 지정
          $arr[] = "1";
          $arr[] = "2";
          $arr[] = "3";
      이 경우 첨자가 자동으로 증가하며 값이 할 당 됩니다. 배열내의 가장 큰 정수형 첨자보다 1 큰 수 가 다음 첨자가 됩니다. 아래 예제를 보면,    
          $arr[4] = "1";
          $arr['name'] = "Son";
          $arr[2] = "45";
          $arr[] = "last";
      마지막에 배열에 "last"를 할당 하였는데, 그 값의 첨자는 자동적으로 5가 됩니다.
  2. 배열에 할당되는 값은 PHP에서 사용가능한 모든 값이 될 수 있습니다. 따라서 기존의 배열에 배열을 할당하면 다차원 배열이 됩니다.
  3. 배열의 크기를 알아내기 위해서는 sizeof()나 count()를 사용하시면됩니다.
        $a = array(1,2,3,4,5);
        echo sizeof($a);
        echo "<br>";
        echo count($a);
  4. 배열에서 특정 값 지우기 
        unset($배열명[]);  //배열에서 에 해당하는 데이터가 삭제됩니다.
  5. PHP에서 배열을 내부적으로 처리하는 방식
    PHP에서 배열은 키와 값으로 데이터를 저장하는 DataSet과 더 관련이 깊다고 볼 수 있습니다. 물론 다른 언어의 배열과 같이 숫자 첨자를 이용하여 배열 처럼 사용할 수 있지만, 내부적으로는 이 동작방식은 첨자를 Key로하여 데이터들을 관리하고 있다는 점입니다. 따라서 위와 같이 정수 첨자와 키 값을 동시에 하나의 배열에 지정할 수 있는 것입니다.
    기존의 언어에서 배열을 선언하면, 해당 배열의 크기만큼 연속적인 메모리 공간을 할당하지만, PHP에서는 선언이라는 것 자체가 없기 때문에, 필요할 때마다 키와 값으로 메모리에 저장하는 방식입니다.     $A = array("name" => "John", "age" => 25, "hobby" => "Collect"); 
    위와 같이 배열을 선언 할 수 있는데, 위와 같은 방식이 키와 값으로 데이터를 저장하는 방법입니다. 마디막으로 아래의 배열은 
        $A = array(1,2,3,4,5);
    내부적으로 다음과 같이 사용됩니다.
        $A = array(0 => 1, 1 => 2, 2 => 3, 3 => 4, 3 => 4, 4 => 5);
    그럼 $A[100] = 1;라고 정의할 때, 이 배열의 개수는 얼마일까요. 100이 아닌, 1입니다.

가변 변수

  1. 프로그래밍을 하다보면, 특정 변수에 할당 된 값을 이름으로 하는 변수를 참조하고 싶을 때가 있습니다. 예를 들어 사용자가 변수명을 입력하면, 그 변수의 값을 출력하는 프로그램을 만든다고 생각합시다.
        $Kim = 19;
        $Son = 20;
        $Lee = 45;
    위의 변수가 정의 되어 있고, 사용자가 "Son"이라는 값을 입력했다고 합시다. 위의 Son이라는 변수를 출력하기 위해서는 보통 if문이나 switch문을 사용할 것입니다. 
        if($input == "Kim")
            echo $Kim;
        if($input == "Son")
            echo $Son;
        if($input == "Lee")
            echo $Lee;
    하지만 PHP에서 지원하는 가변변수라는 것을 사용하면 보다 간결하게 표현할 수 있습니다.
        echo $$input;
    위의 문장은 $input의 변수의 값에 해당하는 변수를 찾아서 참조한다는 뜻입니다. 물론 해당 변수명에 해당하는 변수가 없으면 null을 반환합니다.
  2. '$$변수명'이라는 표현은 간혹 애매한 표현이 될 수 있습니다. 예를 들어 다음과 같은 문장이 있습니다.
        $$a[3];
    위의 문장은 a[3]에 해당하는 변수명을 찾으라는 뜻인지, $a에 해당하는 변수를 찾아 3이라는 첨자에 해당하는 값을 출력하라는 것인지 매우 혼동스럽습니다. 따라서 '${$a[3]}' 등으로 '{', '}'를 사용하는 것이 보다 바람직한 표현입니다. 
    (실제로 PHP는 후자의 방법으로 실행합니다. 즉, $a[3]을 먼저 참조한 뒤, 그에 해당하는 변수를 찾게 됩니다.)
신고
Tag : php, 문법

name    password    homepage
 hidden


 Category
분류 전체보기 (95)
Netwrok & Security (6)
Web Development (61)
Database (5)
Framework (6)
Others (17)
About (0)
 TAGS
SourceSafe2005 ebnf 영국 인턴쉽 PHP 강좌 ASP.NET ajax 오라클 구조 Silverlight XML linux WCF mantis bug tracker smarty mantis exception UpdateProgress web tier 리눅스 DTD 영국 홈스테이 php data tier Blog API ATRIX MS SQL Server 영국 학원 ASP 자바스크립트 ie6 자바스크립트 버그 오라클 특수문자 class id 차이 application error #401 RFC 4180 SourceSafe Internet id name 차이 maxRecievedMessageSize c#.net LiveMail It's me
 Calendar
«   2017/12   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
 Visitor Statistics
Total : 251,719
Today : 48
Yesterday : 124
rss
 

티스토리 툴바