2012-05-17 3 views
0

저는이 문제를 12 시간 넘게 연구했지만 성공하지 못했습니다.POST 요청의 중첩 배열이 PHP에 의해 완전히 구문 분석되지 않았습니다.

Google에는 정부 고객을 위해 제작 한 대규모 사용자 정의 CMS가 있습니다. 이 소프트웨어는 PHP 5.3.3에서 개발되었습니다. 초기 배포는 PHP 5.2.2에서 수행되었지만 몇 가지 문제가 있었지만 결국 서버를 PHP 5.3.8로 업그레이드했습니다. 서버에 배포되는 버전을 정확히 제어 할 수는 없습니다.

쇼 스토퍼 문제가 발생했습니다. 중첩 된 배열의 최대 5 레벨까지 POST를 통해 큰 양식을 제출하는 AJAX 요청이 있습니다. 이것은 몇 개월 동안 잘 작동했지만, 갑자기 새로운 PHP 설치를 사용하여, 우리는 $ _POST 변수 안에있는 데이터의 부분 디코드만을 얻습니다. 필자는 php : // 입력을 검사하여 PHP가 모든 데이터를 수신했음을 확인했습니다 (데이터가 Firebug를 통해 브라우저에서 전송되었음을 확인했습니다).

은 우리가 디코딩 된 출력으로 받고있다

Array 
(
    [db_required_fields] => Array 
     (
      [awr_title] => Array 
       (
        [en] => phil test eng 
       ) 

     ) 

    [subtitle_intro] => Array 
     (
      [awr_subtitle] => Array 
       (
        [en] => 
       ) 

     ) 
[products] => Array 
    (
     [cp_recall] => Array 
      (
       [1] => Array 
        (
         [product_common_name] => Array 
          (
           [en] => 
          ) 

        ) 

      ) 

     ) 
) 

없는 무엇을 (내가 간결을 단축했습니다 위해서 var_dump를 통해, 이것은 당신에게 좋은 아이디어를 줄 것이다)의 각 [EN을 ]에는 피어 [fr] 배열 색인 항목이 있어야합니다. 예를 들어 [fr] 필 테스트 fr 항목이 있어야합니다. 두 번째 배열 수준의 다른 여러 인덱스 항목이 누락되었습니다. 요청 데이터 자체는 약 6-7Kb 정도로 크지 않습니다.

내가 한 일 : - 수호신은 종종 유사한 문제의 원인으로 언급 되었기 때문에 사용하지 못했습니다. - phpinfo()를 보았습니다. 작업중인 서버와 현재 작동중인 서버 모두에서 적절한 차이점을 식별하려고합니다. - 상황에 영향을 줄 수있는 모든 모듈과 옵션을 조사했습니다 (예 : mbstring).

이제 php : // 입력 데이터에 대한 내 자신의 파서 작성을 고려 중이지만 위험에 처할 수 있습니다.

의견이나 제안이 있으십니까?

+1

정확히이 데이터를 서버로 전송하고 있습니까? 양식을 통해? 그렇다면 양식의 속성은 무엇입니까? 아니면 다른 PHP 스크립트에서 cURL POST 요청을 사용하고 있습니까? 아니면 심지어 클라이언트 측에서 AJAX POST? –

+0

제 질문에서 언급했듯이, AJAX POST입니다. – Phil

+1

양식에서 게시하는 배열을 공유 할 수 있습니까? 귀하의 JS와 PHP도하시기 바랍니다. – rroche

답변

2

게시물 데이터를 보내기 전에 직렬화하는 것이 좋습니다. 그리고 하나의 "필드"에 JSON의 단일 문자열로 보냅니다. 이런 식으로 뭔가 : 같은 서버 측에 그런

$.ajax({ 
    type: 'POST', 
    url: 'YOUR URL', 
    data: { 
     json: JSON.stringify(form_data) // Where form_data is the JSON object. 
    }, 
    success: function(response) 
    { 
     // Do stuff. 
    } 
}); 

, json_decode은 다음과 같습니다

<?php 

$_POST = json_decode($_POST['json'], true); 

?> 

편집 :

대신 때 unserialize의 json_decode를 원한다. 오케이.

+0

나는이 제안을 좋아한다. 우리는 이것을 시도 할 것이다. 고맙습니다. – Phil

+0

사실, 데이터를 json에 넣는 것이 효과적 일지 모르지만이 문제가 여러 다른 장소에서 나타납니다. 이 경우 문제를 해결하는 대신 PHP 설치를 수정해야합니다. 그러나 여전히 좋은 제안입니다. :) – Phil

1

아마도 새로운 PHP 구성 변수 max_input_nesting_level 또는 max_input_vars (특히 후자)의 영향을받을 것입니다. PHP가 일부 입력을 무시하기 시작하지 않도록 더 높은 값으로 설정하십시오.

0

주, 당신은 max_input_varsmax_input_nesting_level 같은 설정을 변경하려면 당신이 수호신 실행이있을 때, 당신은 또한 수호신 이러한 PARAMS을 변경할 필요가있다. max_input_vars의 예 :

이 항목을에 추가해야합니다.htaccess로 파일 : 또한 htaccess로 내 수호신 매개 변수의 변경을 허용하기 위해 php.ini 파일에 다음을 추가 할 필요가

php_value suhosin.post.max_vars 4000 
php_value suhosin.request.max_vars 4000 

가 :

suhosin.perdir = "pr" 

는 "P는"허용 "게시"설정 변경, "r"요청 설정.

관련 문제