PHP 사용하기

이 섹션에서는 PHP 스크립트를 작성하는 동안 직면할 수 있는 많은 일반적인 오류를 수집합니다.

PHP 함수의 매개변수 순서가 기억나지 않습니다. 무작위인가요?

PHP는 수백 개의 외부 라이브러리를 하나로 묶는 접착제이기 때문에 때로는 지저분해집니다. 그러나 간단한 경험 법칙은 다음과 같습니다.

배열 함수 매개변수는 "바늘, 건초 더미"로 정렬되는 반면 문자열 함수는 반대이므로 "건초 더미, 바늘"로 정렬됩니다.

폼으로부터 데이터를 제어할수 있는 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;
}
?>
                  
                
작은따옴표(')에 역슬래시를 앞에(\') 붙여줄 필요가 있습니다. 이와 같은 일은 어떻게 정규표현식(regular expression)으로 처리할수 있을까요? 그리고 "를 \"로, \를 \\로 변환하고 싶습니다.

이것이 데이터베이스용이라고 가정하고 데이터베이스와 함께 제공되는 이스케이프 메커니즘을 사용하십시오. 예를 들어, MySQL에서는 mysql_real_escape_string()을 사용하고 PostgreSQL에서는 pg_escape_string()을 사용합니다. 이전 PHP 코드에서 더 일반적으로 사용되는 일반 addslashes()stripslashes() 함수도 있습니다.

다음을 수행하면 출력이 잘못된 순서로 인쇄됩니다.
                  
<?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을 만들때, 새줄을 쓰지 않고 매우 긴 줄을 만들거나 이런 효과를 이용해서 읽을수 없는 소스 페이지 를 만들어야 할때도 있기 때문이고,이는 당신의 삶을 좀더 안락하게 해줍니다.

'경고: 세션 쿠키를 보낼 수 없음 - 헤더가 이미 전송됨...' 또는 '헤더 정보를 추가할 수 없음 - 헤더가 이미 전송됨...'이라는 메시지가 나타납니다.

header(), setcookie()세션 함수는 출력 스트림에 헤더를 추가해야 하지만 헤더는 다른 모든 콘텐츠보다 먼저 보낼 수 있습니다. 이러한 기능을 사용하기 전에는 HTML과 같은 출력이 있을 수 없습니다. headers_sent() 함수는 스크립트가 이미 헤더를 보냈는지 확인하고 출력 제어 함수도 봅니다.

요청 헤더의 정보에 직접 액세스해야 합니다. 어떻게 해야 하나요?

getallheaders() 함수는 PHP를 Apache 모듈로 실행하는 경우 이 작업을 수행합니다. 따라서 다음 코드 비트는 모든 요청 헤더를 보여줍니다.

                  
<?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을 켜두고 접근 권한이 없는 사용자를 편집하여 해결할 수 있습니다.

XML과 PHP를 혼합하려면 어떻게 해야 합니까? 내 <?xml 태그에 대해 불평합니다!

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

PHP에서 사용할 수 있는 전체 변수 목록은 어디에서 찾을 수 있습니까?

스크립트에 사용할 수 있는 미리 정의된 변수의 일부 목록이 포함되어 있으므로 미리 정의된 변수에 대한 매뉴얼 페이지를 읽으십시오. 사용 가능한 변수의 전체 목록(및 훨씬 더 많은 정보)은 phpinfo() 함수를 호출하여 볼 수 있습니다. HTML 양식, 쿠키 및 URL과 같은 외부 변수에 대한 일반적인 시나리오를 설명하는 PHP 외부 변수에 대한 매뉴얼 섹션을 반드시 읽으십시오.

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

» FPDF » TCPDF와 같이 PHP로 작성된 몇 가지 대안이 있습니다.

일부 PHP 지시문은 int 바이트 값만 사용하는 것과 달리 단축 바이트 값을 사용할 수도 있습니다. 사용 가능한 모든 단축 바이트 옵션은 무엇입니까?

사용 가능한 옵션은 K(킬로바이트), M(메가바이트) 및 G(기가바이트)이며 모두 대소문자를 구분하지 않습니다. 다른 모든 것은 바이트를 가정합니다. 1M은 1메가바이트 또는 1048576바이트와 같습니다. 1K는 1킬로바이트 또는 1024바이트와 같습니다. 이러한 속기 표기법은 php.iniini_set() 함수에서 사용할 수 있습니다. 숫자 값은 int로 캐스팅됩니다. 예를 들어, 0.5M0으로 해석됩니다.

참고: 킬로바이트 대 키비바이트

PHP 표기법은 1킬로바이트를 1024바이트와 동일하게 설명하지만 IEC 표준에서는 이를 대신 키비바이트로 간주합니다. 요약: k 및 K = 1024바이트.