PHP 매뉴얼
이전 |  | 다음

# 50. 장. 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 function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?>`

무엇이 잘못된건가요?
5. 헤이, 새줄(newline)이 왜 안생기나요?

`<pre> <?php echo "This should be the first line."; ?> <?php echo "This should show up after the new line above."; ?> </pre>`

6. 'Warning: Cannot send session cookie - headers already sent...' 나 'Cannot add header information - headers already sent...'같은 메시지를 봤습니다.
7. 요청 헤더값을 직접 확인하고 싶습니다. 어떻게 하면 되죠?
8. IIS로 인증을 하려합니다. 그런데 'No Input file specified'과 같은 메시지가 출력되는군요.
9. PHP 스크립트는 IE와 Lynx에서는 동작을 합니다. 그러나 네스케이프에서는 출력의 일부가 사라져버립니다. "소스보기"를 하면 IE에서는 볼수 있지만 네스케이프에서는 볼수없습니다.
10. 어떻게 XML과 PHP를 섞어쓸수 있다고 생각할수 있습니까? <?xml태그에 불만을 터트린단 말입니다!
11. 이미 짜여진 코드를 옮기기 위해서 FrontPage나 다른 HTML 편집기를 어떻게 사용할수 있습니까?
12. PHP에서 가용한 모든 변수 목록을 어디서 볼수 있습니까?
13. 유료이고 상용 라이브러리인 ClibPDF와 PDFLib를 사용하지 않고 어떻게 하면 PDF 파일을 만들수 있습니까? 무료이면서 외부의 PDF 라이브러리가 필요없는 것을 사용하고 싶습니다.
14. 유저 정의 함수에서 표준적인 CGI변수($DOCUMENT_ROOT나 $HTTP_REFERER)중 하나에 접근하여하였습니다. 그런데 그 변수를 찾을수가 없는것처럼 보입니다. 무엇이 잘못된건가요?

1. 폼으로부터 데이터를 제어할수 있는 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;
}
?>`

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

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

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

> directive 주의: magic_quotes_gpc: PHP 설정 magic_quotes_gpc의 기본값은 `on`입니다. 이것은 모든 GET, POST, COOKIE 데이터에 대해 addslashes()를 실행합니다. 이를 제거하기 위해서 stripslashes()를 사용할 수 있습니다.

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? "은 \"으로, '는 \'으로 변경이 되어있습니다. 어떻게하면 이런 원치않는 역슬래쉬를 제거할수 있을까요? 어떻게 그리고 왜 이런 역슬래쉬가 생긴거죠?

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

> directive 주의: magic_quotes_gpc: PHP 설정 magic_quotes_gpc의 기본값은 `on`입니다. 이것은 모든 GET, POST, COOKIE 데이터에 대해 addslashes()를 실행합니다. 이를 제거하기 위해서 stripslashes()를 사용할 수 있습니다.

4. 다음과 같은 처리를 할때, 출력이 잘못된 순서로 됩니다:

`<?php function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?>`

무엇이 잘못된건가요?

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

5. 헤이, 새줄(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을 만들때, 새줄을 쓰지 않고 매우 긴 줄을 만들거나 이런 효과를 이용해서 읽을수 없는 소스 페이지 를 만들어야 할때도 있기 때문이고,이는 당신의 삶을 좀더 안락하게 해줍니다.

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

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

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

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

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

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

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

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

9. 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는 출력해줍니다.

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

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

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

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

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

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

> register_globals: 중요 경고: PHP 4.2.0부터는 PHP 설정 register_globals의 기본값은 off입니다. PHP 커뮤니티에서는, 이 설정에 의존하지 않는 superglobals와 같은 다른 방법을 이용하기를 권장합니다.

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

이와같은 상용라이브러리를 대체하기 위해 PHP로 쓰여진것이 있습니다. 다음과 같습니다. http://www.ros.co.nz/pdf/, http://www.fpdf.org/, http://www.gnuvox.com/pdf4php/, and http://www.potentialtech.com/ppl.php. 이와 더불어 Panda모듈도 있습니다.

14. 유저 정의 함수에서 표준적인 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으로 놓는것이 바람직합니다.

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

이전 | 처음으로 | 다음
빌드(build)시의 문제 | 위로 | PHP와 HTML