2013-05-19 2 views
3

2 개의 PHP 객체를 그대로 $ .post에 데이터로 전달하고 싶습니다.

 $(function() { 
      $("button").click(function() { 
       $.post("fight.php",{player: "<?php $player;?>", enemy: "<?php $enemy; ?>"},function(result) { 
        $("#displayFight").html(result); 
       }); 
      }); 
     }); 

$player

, $enemy는 몇 가지 속성 각각 2 개의 다른 개체입니다. 나는 그것들을 전체 객체로 전달하고자하므로 fight.php이 그것들을 처리 할 수 ​​있습니다.

는 또한 serialize을 시도했지만 아무 소용했습니다

{player: $("<?php $player ?>").serialize()} 

내가 어떻게 할 수 있습니까?

참고 : 시도한 모든 방법을 사용하면 수신 할 페이지에서 '알 수없는 식별자'또는 $ _POST가 비어 있습니다.

EDIT : json_encode 부분은 작동하지만 디코딩이 실패합니다. 수신 페이지 :

$player = json_decode($_POST["player"]) 

실패하고 오류 반환 : json_decode() expects parameter 1 to be string, array given

+0

그들에게'json_encode'를 사용할 수 있습니다. – MacMac

+0

인터넷을 통해서만 텍스트를 보낼 수 있습니다. 개체가 텍스트로 /에서 변환 할 수 있어야합니다. –

답변

2

당신은 다음과 같이 json_encode를 사용해야합니다 :

$.post("fight.php",{ 
    player: <?php echo json_encode($player);?>, 
    enemy: <?php echo json_encode($enemy);?> 
}, ...); 

<?php ?> 태그 주위에 따옴표가없는 것으로 도시; 필요한 경우 json_encode이 자동으로 추가됩니다.

외에도 json_encode이 부과하는 요구 사항을 알고 있어야합니다. 가장 중요한 점은 객체에 문자열 콘텐츠 (속성 또는 하위 개체의 속성)가 포함되어있는 경우 이러한 문자열을 인코딩해야합니다. UTF-8. JSON에 수 json_encodehttp://www.php.net/manual/en/function.json-encode.php

{player: <?php json_encode($player); ?>} 
+0

처음에는 작동하는 것처럼 보이지만 $ _POST에서 데이터를 가져올 때 각 개체가 배열로 나옵니다. json_decode()하려고하면 오류 메시지가 나타납니다. "son_decode()는 매개 변수 1이 주어진 배열의 문자열이어야합니다". 왜 그런가? – frrlod

+0

@frrlod : jQuery는 직렬화 된 양식을 PHP에서 읽을 때 배열로 변환합니다. 실제로 POST 데이터로부터 배열을 생성하는 것은 PHP입니다. PHP가 당신에게 그 데이터로부터 객체를 줄 수있는 방법이 없기 때문에, 그 시점에서 당신 스스로가 있습니다. 적절한 해결 방법은 요청에서 벗어나려고하는 대상의 종류에 따라 다릅니다. – Jon

+0

@frrlod : 가장 쉬운 경우 (하위 객체가없는 일반'stdClass' 객체)의 경우 간단히 $ player = (object) $ _ POST [ 'player']'이면 충분합니다. – Jon

1

쉽게 제대로 개체를 serialize해야 PHP와 자바 스크립트 간의 통신을. 가장 쉬운 방법은 PHP 코드에서 json_encode ($ player)를 호출하는 것입니다. 그런 다음 PHP로 다시 가져올 때 json_decode()를 호출하고 객체를 제대로 초기화해야합니다. PHP와 Javascript가 객체의 인스턴스를 공유 할 수있는 방법은 없습니다. 직렬화 된 데이터 만.

1

봅니다 json_encode를 사용하여 PHP 객체를 인코딩합니다.

그러나 이것에 대해 생각해 봅시다. 출력물을 생성하는 PHP 스크립트가 있습니다. 이 자바 스크립트 스 니펫과 2 개의 객체가 포함 된 출력은 실행되는 클라이언트 측 (브라우저)으로 보내지고 두 객체를 AJAX 호출로 서버로 다시 보냅니다.

<?php 
    // apologies for errors - my PHP's rusty 
    $_SESSION[$player->uuid()] = $player; 
    $_SESSION[$enemy->uuid()] = $enemy; 
?> 
$.post("fight.php",{player: "<?php $player->uuid();?>", enemy: "<?php $enemy->uuid(); ?>"},function(result) { 
    // ... 
}); 

그런 다음 fight.php 스크립트가 다음 복원하는 것입니다 :

그래서 다른 아이디어는 단순히 세션에서 객체가 서버 측에게 모든 시간을 저장 만 전체 개체 대신 식별자를 보낼 수 있습니다 : 될 수있는 -

당신이 데이터베이스 기반 애플리케이션을 구축하기 위해 기존의 프레임 워크를 사용하는 경우
// is this still how PHP handles sessions? 
$player = $_SESSION[$_POST['player']]; 
$enemy = $_SESSION[$_POST['enemy']]; 

, 이것은 특히 가능성이 객체는 데이터베이스에 저장되어 쉽게 데이터베이스에서 읽을 수 있기 때문에 작동 베팅 ($_SESSION 배열을 사용하는 것보다) :

// if recollection serves this is CakePHP-ish 
$player = $this->Player->find($_POST['player']); 
$enemy = $this->Enemy->find($_POST['enemy']); 
1

한 가지 제안을 사용

+0

첫 줄을 설명해 주시겠습니까? 왜 [json_encode] [1]가 아니라 json_encode ($ player)입니까? – frrlod

+0

@frrlod - 그냥 오타입니다. 하이퍼 링크가 올바르게 렌더링되지 않도록 Markdown 주석을 엉망으로 만들었습니다. –

+0

나는 그 생각을 좋아한다. 만료로 인해 세션이 문제가되지 않겠습니까? 나는 DB를 사용하는 것이 더 나은 생각이라고 생각하지만, 단지 배우기 위해서입니다. – frrlod