PHP 5.5.16 is released

PHP 사용하기

이 섹션은 PHP스크립트를 작성할때 직면할수 있는 매우 일반적인 에러를 정리했습니다.

  1. 폼으로부터 데이터를 제어할수 있는 PHP스크립트를 작성하려합니다. POST 메쏘드에서 사용가능한 변수를 알 수 있을까요?
  2. 작은따옴표(')에 역슬래시를 앞에(\') 붙여줄 필요가 있습니다. 이와 같은 일은 어떻게 정규표현식(regular expression)으로 처리할수 있을까요? 그리고 "를 \"로, \를 \\로 변환하고 싶습니다.
  3. All my " turn into \" and my ' turn into \', how do I get rid of all these unwanted backslashes? How and why did they get there? "은 \"으로, '는 \'으로 변경이 되어있습니다. 어떻게하면 이런 원치않는 역슬래시를 제거할수 있을까요? 어떻게 그리고 왜 이런 역슬래시가 생긴거죠?
  4. PHP 지시어 register_globals가 어떤 영향을 미칩니까?
  5. 다음과 같은 처리를 할때, 출력이 잘못된 순서로 됩니다: <?php function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?> 무엇이 잘못된건가요?
  6. 헤이, 새줄(newline)이 왜 안생기나요? <pre> <?php echo "This should be the first line."; ?> <?php echo "This should show up after the new line above."; ?> </pre>
  7. 'Warning: Cannot send session cookie - headers already sent...' 나 'Cannot add header information - headers already sent...'같은 메시지를 봤습니다.
  8. 요청 헤더값을 직접 확인하고 싶습니다. 어떻게 하면 되죠?
  9. IIS로 인증을 하려합니다. 그런데 'No Input file specified'과 같은 메시지가 출력되는군요.
  10. 윈도우: IIS를 사용하여 다른 컴퓨터에 공유한 파일에 접근할 수 없습니다.
  11. PHP 스크립트는 IE와 Lynx에서는 동작을 합니다. 그러나 네스케이프에서는 출력의 일부가 사라져버립니다. "소스보기"를 하면 IE에서는 볼수 있지만 네스케이프에서는 볼수없습니다.
  12. 어떻게 XML과 PHP를 섞어쓸수 있다고 생각할수 있습니까? <?xml태그에 불만을 터트린단 말입니다!
  13. 이미 짜여진 코드를 옮기기 위해서 FrontPage나 다른 HTML 편집기를 어떻게 사용할수 있습니까?
  14. PHP에서 가용한 모든 변수 목록을 어디서 볼수 있습니까?
  15. 유료이고 상용 라이브러리인 PDFLib 등을 사용하지 않고 어떻게 하면 PDF 파일을 만들수 있습니까? 무료이면서 외부의 PDF 라이브러리가 필요없는 것을 사용하고 싶습니다.
  16. 유저 정의 함수에서 표준적인 CGI변수($DOCUMENT_ROOT나 $HTTP_REFERER)중 하나에 접근하여하였습니다. 그런데 그 변수를 찾을수가 없는것처럼 보입니다. 무엇이 잘못된건가요?
  17. 몇몇 PHP 지시어는 integer 바이트 값뿐이 아닌, 단축 바이트 값도 가질 수 있습니다. 어떠한 단축 바이트 옵션이 존재합니까? 그리고 php.ini 밖에서 사용할 수 있습니까?
폼으로부터 데이터를 제어할수 있는 PHP스크립트를 작성하려합니다. POST 메쏘드에서 사용가능한 변수를 알 수 있을까요?

PHP는 많은 미리 정의된 변수들을 가집니다. 슈퍼 글로벌(superglobal)변수인 $_POST처럼요. $_POST변수는 포스팅된 모든 변수의 연관배열이기 때문에 이 변수로 루프를 돌릴수도 있다. 예를 들어서 간단하게 foreach로 루프를 돌린다고 하면 empty()함수 값을 체크하고 그 값을 출력하면 된다.

<?php
$empty 
$post = array();
foreach (
$_POST as $varname => $varvalue) {
    if (empty(
$varvalue)) {
        
$empty[$varname] = $varvalue;
    } else {
        
$post[$varname] = $varvalue;
    }
}

print 
"<pre>";
if (empty(
$empty)) {
    print 
"None of the POSTed values are empty, posted:\n";
    
var_dump($post);
} else {
    print 
"We have " count($empty) . " empty values\n";
    print 
"Posted:\n"var_dump($post);
    print 
"Empty:\n";  var_dump($empty);
    exit;
}
?>

Note: 자동 전역: 사용상 주의

$_GET, $_POST, $_SERVER 등의 자동 전역 배열은 PHP 4.1.0부터 사용할 수 있습니다. 자세한 내용은 매뉴얼의 superglobals 섹션을 읽어보십시오.

작은따옴표(')에 역슬래시를 앞에(\') 붙여줄 필요가 있습니다. 이와 같은 일은 어떻게 정규표현식(regular expression)으로 처리할수 있을까요? 그리고 "를 \"로, \를 \\로 변환하고 싶습니다.

addslashes()함수로 이와 같은 일을 처리할수있습니다. mysql_escape_string()함수도 참고하십시오. 또한 stripslashes()함수로 역슬래시를 벗길 수 있습니다.

Note: 지시어 주의: magic_quotes_gpc

지시어 magic_quotes_gpc의 기본값은 on입니다. 이것은 모든 GET, POST, COOKIE 데이터에 대해 addslashes()를 실행합니다. 이를 제거하기 위해서 stripslashes()를 사용할 수 있습니다.

All my " turn into \" and my ' turn into \', how do I get rid of all these unwanted backslashes? How and why did they get there? "은 \"으로, '는 \'으로 변경이 되어있습니다. 어떻게하면 이런 원치않는 역슬래시를 제거할수 있을까요? 어떻게 그리고 왜 이런 역슬래시가 생긴거죠?

stripslashes()함수로 이 string에서 이런 역슬래시를 벗길수가 있습니다. 이런 마술적인 역슬래시가 존재하는 이유는 magic_quotes_gpc옵션이 활성화되어 있기 때문입니다.

Note: 지시어 주의: magic_quotes_gpc

지시어 magic_quotes_gpc의 기본값은 on입니다. 이것은 모든 GET, POST, COOKIE 데이터에 대해 addslashes()를 실행합니다. 이를 제거하기 위해서 stripslashes()를 사용할 수 있습니다.

PHP 지시어 register_globals가 어떤 영향을 미칩니까?

우선, 이 ini 설정이 무엇을 하는지 설명해야 합니다. URL http://example.com/foo.php?animal=cat이 있다고 하고, foo.php은 다음 PHP 코드를 가지고 있다고 합시다:

<?php
// $_GET 을 사용하는게 좋습니다.
echo $_GET['animal'];

// $animal이 존재하려면, register_globals가 on이여야 합니다.
// 이렇게 하지 마십시오!!
echo $animal;

// 이는 모든 변수에 적용되므로, $_SERVER도 동일합니다.
echo $_SERVER['PHP_SELF'];

// 다시 말하지만, $PHP_SELF가 존재하려며느 register_globals가 on이여야 합니다.
// 이렇게 하지 마십시오!!
echo $PHP_SELF;
?>

위 코드가 register_globals가 많은 변수를 만들어 내는 것을 보여줍니다. 몇 년간 이러한 코딩이 문제가 되어, 몇 년간 기본값으로 꺼버렸습니다. PHP 6에서는 이 배제된 기능을 없앨 것입니다. 주요 웹 호스트가 register_globals를 사용하지 않지만, 아직도 오래된 문서, 튜토리얼, 책이 on을 요구하고 있습니다. 적절히 대처하십시오.

추가 정보는 다음을 참고하십시오:

Note:

위 예제에서, QUERY_STRING을 포함한 URL을 사용했습니다. 이러한 방식으로 정보를 넘기는 것은 GET HTTP 요청이기 때문에, 자동 전역 $_GET을 사용하였습니다.

다음과 같은 처리를 할때, 출력이 잘못된 순서로 됩니다:
<?php
function myfunc($argument)
{
    echo 
$argument 10;
}
$variable 10;
echo 
"myfunc($variable) = " myfunc($variable);
?>
무엇이 잘못된건가요?

이 함수의 결과를 사용하기 위해서는 (위 예처럼 다른 스트링과 합치는) echo() 함수대신에 return()를 사용해야 합니다.

헤이, 새줄(newline)이 왜 안생기나요?
<pre>
<?php echo "This should be the first line."?>
<?php 
echo "This should show up after the new line above."?>
</pre>

PHP에서는 코드 블럭이 "?>" 나 "?>\n"로 끝날수 있습니다. 그래서 위 예에서 문장은 한줄로 출력이 될것입니다. 왜냐하면 블럭의 끝에 새줄표시(newline)를 빠뜨렸기 때문이요. 이와 같은 이유로 새줄쓰기를 하려면 각 블럭의 끝에 새줄표시(newline)를 해줘야합니다.

왜 이와같은 일을 할까요? 왜냐하면 일반적인 HTML을 만들때, 새줄을 쓰지 않고 매우 긴 줄을 만들거나 이런 효과를 이용해서 읽을수 없는 소스 페이지 를 만들어야 할때도 있기 때문이고,이는 당신의 삶을 좀더 안락하게 해줍니다.

'Warning: Cannot send session cookie - headers already sent...' 나 'Cannot add header information - headers already sent...'같은 메시지를 봤습니다.

header()함수, setcookie()함수, 세션 함수는 헤더에 출력을 합니다. 그러나 헤더는 모든 다른 컨텐트 전에 와야 합니다. 이 함수를 사용하기 전에 어떤 출력(HTML같은)도 있어서는 안됩니다. headers_sent()함수가 스크립트에서 이미 헤더를 보냈는지 체크해줍니다. Output Control Functions도 참고하세요.

요청 헤더값을 직접 확인하고 싶습니다. 어떻게 하면 되죠?

아파치 모듈로 PHP설치하셨다면 getallheaders()함수로 이와 같은 일을 할수 있습니다. 다음과 같은 코드로 요청 헤더의 모든값을 확인하실수 있습니다:

<?php
$headers 
getallheaders();
foreach (
$headers as $name => $content) {
    echo 
"headers[$name] = $content<br />\n";
}
?>

apache_lookup_uri(), apache_response_headers(), fsockopen()함수도 참고하세요.

IIS로 인증을 하려합니다. 그런데 'No Input file specified'과 같은 메시지가 출력되는군요.

IIS의 보안 모델은 여기서 결함이 있습니다. 이와같은 결함은 IIS하에서 실행되는 모든 CGI 프로그램에 있어서는 일반적인 현상입니다. 이와같은 에러를 피하는 방법으로는 일반 HTML 파일(PHP에 의해 파싱되지 않음)을 인증이 필요한 디렉토리 안에 엔트리 페이지로 만들어넣는것입니다. 그리고 나서 PHP 페이지로 리디렉트(redirect)하는 META 태그를 사용하거나, PHP 페이지로 링크를 거십시오. 이와같은 현상은 다른 NT 웹서버와는 상관이 없습니다. 더 많은 정보를 위해서 아래 링크로 가세요: » http://support.microsoft.com/kb/q160422/HTTP Authentication의 매뉴얼 섹션.

윈도우: IIS를 사용하여 다른 컴퓨터에 공유한 파일에 접근할 수 없습니다.

Go to Internet Information Services를 변경해야 합니다. PHP 파일 위치에 가서, 속성을 여십시오. File Security 탭에서, Edit -< Anonymous access and authentication control로 가십시오.

이 문제를 Anonymous Access을 끄고 Integrated Window Authentication을 켜두거나, Anonymous Access을 켜두고 접근 권한이 없는 사용자를 편집하여 해결할 수 있습니다.

PHP 스크립트는 IE와 Lynx에서는 동작을 합니다. 그러나 네스케이프에서는 출력의 일부가 사라져버립니다. "소스보기"를 하면 IE에서는 볼수 있지만 네스케이프에서는 볼수없습니다.

네스케이프는 HTML 태그(테이블같은)에 관한한 IE보다 엄격합니다. » validator.w3.org와 같은 HTML validator로 HTML 출력을 검증한다면 무엇이 문제인지 도움을 받을수 있습니다. 예를 들면, </table> 태그가 빠지면 이와같은 문제가 발생할수 있습니다.

또한 IE와 Lynx 모두 HTML 스트림(stream)에서 널문자(\0)를 무시 하지만, 네스케이프는 그렇지 않습니다. 이 널문자를 체크하기위한 최고의 방법은 PHP의 커맨드 라인(command line)버전 (또는 CGI버전으로도 알려져있슴)으로 컴파일해서 그 커맨드라인에서 스크립트를 실행해 보는것입니다. *nix에서 스크립트를 od -c로 파이프(pipe)해서 \0문자가 있는지 찾아보는것입니다. 윈도우상에서는 에디터나 바이너리 파일을 볼수 있는 다른 프로그램이 있어야 합니다. 네스케이프는 파일 안에서 널값을 봤을때 표준적으로 그 라인안의 어떤것도 출력하지 않습니다. 반면에 IE와 Lynx는 출력해줍니다.

어떻게 XML과 PHP를 섞어쓸수 있다고 생각할수 있습니까? <?xml태그에 불만을 터트린단 말입니다!

<?xml태그를 PHP코드안에 직접 넣기 위해서는 short_open_tags PHP 디렉티브 값을 0으로 설정함으로써 짧은 태그(short tags)를 비활성화해야 합니다. ini_set()함수로 이 디렉티브를 설정할수 없습니다. short_open_tags가 on이든 off든 관계없이 다음처럼 할수도 있습니다: <?php echo '<?xml'; ?> 이 디렉티브의 기본값(default)은 on입니다.

이미 짜여진 코드를 옮기기 위해서 FrontPage나 다른 HTML 편집기를 어떻게 사용할수 있습니까?

가장 쉬운 방법은 PHP코드안에서 ASP 태그 사용하기를 활성화시키는 것입니다. 이렇게 하면 <%와 %>의 ASP 스타일 코드 경계기호(delimiter)를 사용할 수 있게해줍니다. 몇몇 유명한 HTML 펴집기는 매우 지능적으로 이런 태그를 다루어줍니다(현재까지는). ASP 스타일 태그를 활성화시키려면 php.iniasp_tags를 활성화시키거나, 적절한 아파치 디렉티브(directive)를 사용해야합니다.

PHP에서 가용한 모든 변수 목록을 어디서 볼수 있습니까?

미리 정의된 변수에 관한 매뉴얼 페이지를 보십시오. 이 페이지에서는 일부의 미리 정의된 변수 목록이 포함되어있습니다. 모든 변수 목록은 phpinfo()함수를 호출함으로써 확인하실수 있습니다. PHP밖에서 온 변수들의 매뉴얼 섹션을 읽으십시오. 그페이지에서는 HTML폼, 쿠키, URL같은 외부변수에 관한 일반적인 시나리오를 설명해줍니다.

Note: register_globals: 중요 경고

PHP 4.2.0부터 PHP 지시어 register_globals의 기본값은 off입니다. PHP 커뮤니티에서는 이 지시어에 의존하지 않는 superglobals 방식의 사용을 권합니다.

유료이고 상용 라이브러리인 PDFLib 등을 사용하지 않고 어떻게 하면 PDF 파일을 만들수 있습니까? 무료이면서 외부의 PDF 라이브러리가 필요없는 것을 사용하고 싶습니다.

There are a few alternatives written in PHP such as » FPDF and » TCPDF.

There is also the Haru extension that uses the free libHaru external library.

유저 정의 함수에서 표준적인 CGI변수($DOCUMENT_ROOT나 $HTTP_REFERER)중 하나에 접근하여하였습니다. 그런데 그 변수를 찾을수가 없는것처럼 보입니다. 무엇이 잘못된건가요?

PHP 디렉티브 register_globals은 서버와 환경변수에 모두 영향을 미친다는것을 반드시 이해해야 합니다. register_globals = off (PHP 4.2.0버전 이래로 off가 디폴트)일때는 $DOCUMENT_ROOT변수는 존재하지 않을것입니다. 대신에 $_SERVER['DOCUMENT_ROOT']변수를 사용합니다. register_globals = on 이라면 $DOCUMENT_ROOT변수와 $GLOBALS['DOCUMENT_ROOT']변수 모두 존재할것입니다.

분명히 register_globals = on 인데, 함수 내에서 $DOCUMENT_ROOT 변수를 쓸수 없는 이유는 이 변수가 다른 변수와 같은 것이고 함수내에서는 global $DOCUMENT_ROOT와 같이 선언해야 합니다. 이와 더불어 변수 사용 범위 매뉴얼 페이지를 참고하세요. register_globals = off으로 놓는것이 바람직합니다.

Note: 자동 전역: 사용상 주의

$_GET, $_POST, $_SERVER 등의 자동 전역 배열은 PHP 4.1.0부터 사용할 수 있습니다. 자세한 내용은 매뉴얼의 superglobals 섹션을 읽어보십시오.

몇몇 PHP 지시어는 integer 바이트 값뿐이 아닌, 단축 바이트 값도 가질 수 있습니다. 어떠한 단축 바이트 옵션이 존재합니까? 그리고 php.ini 밖에서 사용할 수 있습니까?

사용할 수 있는 옵션은 K(킬로바이트), M(메가바이트), G(기가바이트; PHP 5.1.0부터 사용가능)입니다. 대소문자는 구별하지 않습니다. 1M은 1 메가바이트, 즉 1048576 바이트와 동일합니다. 1K은 1 킬로바이트, 즉 1024 바이트와 동일합니다. 이 단축어는 php.ini 밖에서는 사용할 수 없습니다. 대신 바이트의 integer 값을 사용하십시오. 이러한 값을 어떻게 변경하는 지에 대해서는 ini_get() 문서를 참고하십시오.

add a note add a note

User Contributed Notes 3 notes

up
2
greenie2600 at yahoo dot com
6 years ago
Here's a simple function that will convert the shorthand values described in point 64.16 to a number of bytes.

I use this to display the maximum size of file uploads to the user, so they don't waste time uploading a huge file only to find that it's too big. (I've been unable to find any browsers that actually support the MAX_FILE_SIZE technique described in chapter 38, and it's certainly not part of any W3C spec, so this is the next best thing.)

Here's how you'd use my function for that purpose (though you might want to abstract this to a function of its own):

<?php
echo 'Maximum file size: ' . convertBytes( ini_get( 'upload_max_filesize' ) ) / 1048576 . 'MB';
?>

And here's the function:

<?php
/**
* Convert a shorthand byte value from a PHP configuration directive to an integer value
* @param    string   $value
* @return   int
*/
function convertBytes( $value ) {
    if (
is_numeric( $value ) ) {
        return
$value;
    } else {
       
$value_length = strlen( $value );
       
$qty = substr( $value, 0, $value_length - 1 );
       
$unit = strtolower( substr( $value, $value_length - 1 ) );
        switch (
$unit ) {
            case
'k':
               
$qty *= 1024;
                break;
            case
'm':
               
$qty *= 1048576;
                break;
            case
'g':
               
$qty *= 1073741824;
                break;
        }
        return
$qty;
    }
}
?>
up
2
kjn
7 years ago
64.16 Byte Values

The number that precedes K, M, or G should be an integer.

E.g. this php.ini directive:
   post_max_size = 0.25M
is interpreted as 0, and thus prevents all POSTs.

It is particularly unhelpful that phpinfo() reports the string value assigned to post_max_size (0.25M), and not the numerical value that PHP extracts from that string (0M).
up
0
info at zankmusic dot com
5 years ago
Just spent a couple days on this one...
As previously posted, if you set
upload_max_filesize = 0.25M, the value reads correctly in phpinfo(), BUT it is effectively ZERO when implemented.

Note that the following also give ZERO bytes:

upload_max_filesize =  10M  (note the two white spaces before 10M), but the phpinfo() reads '10M' and everything looks ok.

I removed all white spaces in my php.ini file and viola...working fine again.
To Top