폼으로부터 데이터를 제어할수 있는 PHP스크립트를 작성하려합니다.
POST 메쏘드에서 사용가능한 변수를 알 수 있을까요?
PHP는 많은 미리 정의된
변수들을 가집니다. 슈퍼 글로벌(superglobal)변수인
$_POST처럼요. $_POST변수는
포스팅된 모든 변수의 연관배열이기 때문에 이 변수로 루프를 돌릴수도 있다.
예를 들어서 간단하게 foreach로 루프를 돌린다고
하면 empty()함수 값을 체크하고 그 값을 출력하면 된다.
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?
"은 \"으로, '는 \'으로 변경이 되어있습니다. 어떻게하면 이런 원치않는
역슬래시를 제거할수 있을까요? 어떻게 그리고 왜 이런 역슬래시가 생긴거죠?
우선, 이 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을 요구하고 있습니다. 적절히 대처하십시오.
이 함수의 결과를 사용하기 위해서는 (위 예처럼 다른 스트링과 합치는)
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...'같은
메시지를 봤습니다.
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.ini의 asp_tags를 활성화시키거나,
적절한 아파치 디렉티브(directive)를 사용해야합니다.
PHP에서 가용한 모든 변수 목록을 어디서 볼수 있습니까?
미리 정의된 변수에
관한 매뉴얼 페이지를 보십시오. 이 페이지에서는 일부의 미리 정의된 변수 목록이
포함되어있습니다. 모든 변수 목록은 phpinfo()함수를 호출함으로써
확인하실수 있습니다. PHP밖에서 온 변수들의
매뉴얼 섹션을 읽으십시오. 그페이지에서는 HTML폼, 쿠키, URL같은 외부변수에 관한
일반적인 시나리오를 설명해줍니다.
유료이고 상용 라이브러리인
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으로 놓는것이 바람직합니다.
몇몇 PHP 지시어는 integer 바이트 값뿐이 아닌, 단축 바이트
값도 가질 수 있습니다. 어떠한 단축 바이트 옵션이 존재합니까? 그리고
php.ini 밖에서 사용할 수 있습니까?
사용할 수 있는 옵션은 K(킬로바이트), M(메가바이트), G(기가바이트; PHP
5.1.0부터 사용가능)입니다. 대소문자는
구별하지 않습니다. 1M은 1 메가바이트, 즉
1048576 바이트와 동일합니다. 1K은
1 킬로바이트, 즉 1024 바이트와 동일합니다. 이
단축어는 php.ini 밖에서는 사용할 수 없습니다. 대신 바이트의
integer 값을 사용하십시오. 이러한 값을 어떻게 변경하는 지에
대해서는 ini_get() 문서를 참고하십시오.