2010-07-13 4 views
9

이 file_1.php

<?php 

    $_POST["test_message"] = "Hello, world";  

    header("Location: http://localhost/file_2.php"); 
?> 

이며,이 file_2.php

<html> 
<head> 
</head> 
<body> 

<?php 

    if (!(isset($_POST["test_message"]))) 
    echo "Test message is not set"; 
    else 
    echo $_POST["test_message"]; 
?> 

</body> 
</html> 

출력이 하나라도 쓸 수 있는지 궁금한데 Test message is not set

인 경우 $ _POST 그리고 그렇게 궁금해했다면 그렇게하는 것이 나쁜 습관인지 궁금합니다. 난 그냥 버튼을 제출하고 메서드와 함께 양식을 보내 주겠습니까 = 나를 위해 $ _POST에 글을 쓰거나 합법적으로 파일간에 데이터를 전달하기 위해 $ _POST에 쓸 수 있습니까?

+0

이것이 나쁜 관행이라면 말할 필요도 없습니다. 단순히 다른 파일에 데이터를 게시하는 방식이 아닙니다. 작동하지 않습니다. – oezi

+1

세션 변수 사용 –

+1

앱의 다른 부분이 가져 오기 전에 게시 데이터를 필터링하고 두 부분을 완전히 분리해야하는 경우 게시 데이터를 필터링하는 것이 좋지 않을 수 있습니다. 그렇지 않으면, 당신이하는 일은 무엇이든 할 수있는 더 좋은 방법 일 것입니다. –

답변

14

대신 $_SESSION을 사용하고 싶습니다.

$_POST은 현재 페이지에 게시되었으며 페이지로드 사이에 상태를 유지하지 않는 정보 용으로, 리디렉션 할 때 실제로 두 번째 파일에 내용을 게시하는 경우에만 채워집니다. 헤더를 통해 리디렉션하지 않고 두 번째 파일을 포함하려는 경우 $_POST 변수가 설정되기 때문에 수행 한 작업이 작동합니다.

$_SESSION은 페이지간에 상태를 유지하므로 리디렉션 할 때 원하는 결과를 얻을 수 있습니다.

$_SESSION을 올바르게 사용하려면 먼저 session_start();으로 전화하여 세션을 시작해야합니다. PHP manual에는 더 많은 정보가 있습니다.

+0

이것은 "transitory"에 대한 +1 +1 – Mawg

6

$_POST["test_message"]은 실제로 스크립트에 아무 것도 게시하지 않았기 때문에 file2.php에서 비어 있습니다. $_POST 배열은 POST 양식 데이터로 채워 지므로 페이지 간 데이터 지속성이 필요한 경우 헤더 재 지정에 GET 변수를 추가하거나 $_SESSION에 데이터를 저장하여 $_GET을 채울 수 있습니다.

+0

당신은 $ _POST가 "emthod = post"가있는 HTML 양식에서만 쓸 수 있다고 말하고 있습니까? PHP 매뉴얼에서 – Mawg

+1

은 $ _POST가 "... HTTP POST 메소드를 통해 현재 스크립트에 전달 된 변수의 연관 배열"이라고 말합니다. http://php.net/manual/en/reserved.variables.post.php – robjmills

+0

+1은 답하고 +1은 덧글입니다. 감사합니다 – Mawg

3

그렇게하는 것이 좋습니다. 당신이 모든 큰 PHP 프레임 워크 (CI, cake, joomla 등)를 살펴 본다면, 그들은 최종 목적지 (일반적으로 몇몇 도우미 코드를 사용)로 컨트롤러를 index.php 페이지를 통해 게시합니다. 따라서 $ _POST 변수는 상당히 깊은 층에 묻혀 있습니다. $ _POST 변수는 http 요청이 활성화되어있는 동안 일시적으로 만 유효하므로 요청이 완료되면 모든 변수가 null로 재설정됩니다.

$ _SESSION 변수는 요구 사항을 처리하기 위해 사용할 수 있으며 요구 사항과 시나리오에 따라 다릅니다.

+0

+1과 같습니다. 고마워, 나는 $ _SESSION – Mawg

1
$_POST 만 형태로 사용되어야한다

이 마음에 들지 :

$_POST["test_message"] = "Hello, world"; 

당신은 또한 당신이 stripslashesmysql_real_escape_string (데이터베이스에 데이터를 삽입)

같은 보안 위험, 사용 함수를 사용하지 않도록해야

페이지간에 상태를 유지하려면 대신 sessions을 사용해야합니다.

2

웹 서버의 관점에서 보면 : file_1.php에 대한 요청을 받고, PHP 파일을 실행하고, Location: 헤더가 포함 된 결과를 다시 보냅니다.그런 다음 얼마 후에 file_2.php에 대한 별도 요청을 받아서 해당 파일을로드하여 실행하고 그 결과 인 HTML 페이지를 다시 보냅니다. 핵심은 두 파일이 완전히 다른 HTTP 요청에 사용된다는 것입니다. 각각은 별도의 환경에서 실행되므로 예를 들어, 하나의 변수에 대한 변경 사항은 다른 변경 사항에 반영되지 않습니다. file_1.php 요청의 $_POSTfile_2.php 요청의 $_POST과 별개의 변수입니다.

실제 질문 : 나는 $_POST에 글을 쓸 수 있다고 생각하지만 권장하지는 않습니다. 그것은 실제로 변수가 무엇을위한 것이 아닙니다.

+0

+1을 고수 할 것이다. 그것은 그것을 아주 분명하게했다. – Mawg

1

일반적으로 $_POST은 각 요청의 POST 데이터로 채워진 일반 PHP 배열입니다. 따라서 $_POST에 자신의 값을 쓸 수 있습니다.

하지만 ...

1) 귀하의 코드 file_1.phpheader() 전화로 작동하지 않습니다는 file_2.php에서) 완전히 새로운 (그리고 빈 $_POST 배열 결과 새 요청을 발행하도록 브라우저에 지시합니다. file_2.php에 아무것도 게시하지 않았기 때문에 배열이 비어있게됩니다. 제 생각에는

2) 그것은 참으로 나쁜 습관이다 ... 당신이 탈출, 살균, 매우주의 (필터링 처리되어야하는 사용자가 데이터를 검색하고 있다는 $_POST (또는 $_GET 또는 $_REQUEST)에서 데이터를 얻기 나타냅니다 ..). 이러한 배열에 내부 데이터를 쓰면 내부 및 외부 데이터가 혼합되어 혼동과 보안상의 위험을 초래할 수 있습니다.

+0

+1 보안에 대해 좋은 점. 감사 – Mawg

1

예제가 작동하지 않는 이유를 설명하는 다른 답변을 참조하십시오.

또한 $ _POST superglobal을 데이터 저장소로 사용하는 것은 꽤 나쁜 생각입니다. 특정 변수 공유 솔루션 (데이터베이스, 메신저 메모리 레지스트리, 세션, 쿠키 등)을 사용하십시오.

관련 문제