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 在接收页面上显示为空。

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

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

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

4

4 回答 4

3

您需要使用json_encode,如下所示:

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

<?php ?>请注意,标签周围没有引号;json_encode如果需要,将自动添加它们。

除此之外,您需要了解json_encode强加的要求:最重要的是,如果您的对象包含字符串内容(作为属性或作为任何子对象的属性),那么这些字符串必须以 UTF-8 编码。

于 2013-05-19T20:53:19.313 回答
1

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

于 2013-05-19T20:52:58.077 回答
1

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

{player: <?php json_encode($player); ?>}
于 2013-05-19T20:53:24.890 回答
1

一种建议是使用 .json 对 PHP 对象进行 JSON 编码json_encode

但是,让我们考虑一下:您有一个 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']);
于 2013-05-19T20:58:12.923 回答