将php对象传递给$ .post()

时间:2013-05-19 20:49:33

标签: php ajax object

我想将2个php对象作为数据传递给$ .post。

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

$player$enemy是两个不同的对象,每个对象都有一些属性。我想将它们作为整个对象传递给它们,以便fight.php可以处理它们。

我也试过serialize,但无济于事:

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

我该怎么做?

注意:使用我尝试的所有方法,我得到一些'未知标识符'或$ _POST在接收页面上显示为空。

编辑:json_encode部分有效,但解码失败。在接收页面上:

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

失败并返回错误:json_decode() expects parameter 1 to be string, array given

4 个答案:

答案 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编码。

答案 1 :(得分:1)

要在PHP和Javascript之间轻松进行通信,您应该正确地序列化您的对象。最简单的方法是在PHP代码中调用json_encode($ player)。然后,当您使用PHP再次获取它时,您需要在其上调用json_decode()并正确初始化该对象。 PHP和Javascript无法共享对象的实例。只有序列化数据。

答案 2 :(得分:1)

尝试使用json_encode http://www.php.net/manual/en/function.json-encode.php

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

答案 3 :(得分:1)

一个建议可能是使用json_encode JSON编码PHP对象。

但是,让我们考虑一下:你有一个生成输出的PHP脚本。该输出 - 包含此Javascript片段和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']);