通过AJAX帖子

时间:2016-10-03 09:35:48

标签: php ajax

任何人都可以提供帮助。我想我错过了一些基本而明显的东西!

我将对象$ session从index.php传递给results.php,就像这样..

的index.php

include 'classes/user.php';
$session = new User();
//some object work
$sessionObjectStr = serialize($session);

<script>
var sessionObj = <?php if(isset($session)){echo json_encode($sessionObjectStr);}else{echo json_encode("");}; ?>;
$.post( 'results.php', {'object':sessionObj}, function(data){.....
</script>

results.php

include 'classes/user.php';
if(isset($_POST['object'])){ $session =  unserialize(($_POST['object']));}
$session->getName();

getName方法什么都不返回。它应该像在index.php页面上那样返回名称。

来自index.php的

var_dump用于序列化$ session

string(690) "O:4:"User":7:{s:9:"*userId";s:2:"27";s:7:"*name";s:5:"Admin";s:8:"*email";s:13:"admin@nrt.com";s:9:"*rights";s:5:"Super";s:9:"*cookie";N;s:12:"*lastLogin";s:10:"1475435341";s:5:"*db";O:8:"Database":4:{s:7:"*link";O:6:"mysqli":19:{s:13:"affected_rows";N;s:11:"client_info";N;s:14:"client_version";N;s:13:"connect_errno";N;s:13:"connect_error";N;s:5:"errno";N;s:5:"error";N;s:10:"error_list";N;s:11:"field_count";N;s:9:"host_info";N;s:4:"info";N;s:9:"insert_id";N;s:11:"server_info";N;s:14:"server_version";N;s:4:"stat";N;s:8:"sqlstate";N;s:16:"protocol_version";N;s:9:"thread_id";N;s:13:"warning_count";N;}s:10:"*numRows";i:1;s:13:"*affectRows";i:1;s:9:"*result";b:1;}}"
来自results.php的

var_dump $ _POST ['object'] - (序列化)

string(690) "O:4:"User":7:{s:9:"*userId";s:2:"27";s:7:"*name";s:5:"Admin";s:8:"*email";s:13:"admin@nrt.com";s:9:"*rights";s:5:"Super";s:9:"*cookie";N;s:12:"*lastLogin";s:10:"1475435341";s:5:"*db";O:8:"Database":4:{s:7:"*link";O:6:"mysqli":19:{s:13:"affected_rows";N;s:11:"client_info";N;s:14:"client_version";N;s:13:"connect_errno";N;s:13:"connect_error";N;s:5:"errno";N;s:5:"error";N;s:10:"error_list";N;s:11:"field_count";N;s:9:"host_info";N;s:4:"info";N;s:9:"insert_id";N;s:11:"server_info";N;s:14:"server_version";N;s:4:"stat";N;s:8:"sqlstate";N;s:16:"protocol_version";N;s:9:"thread_id";N;s:13:"warning_count";N;}s:10:"*numRows";i:1;s:13:"*affectRows";i:1;s:9:"*result";b:1;}}"

因为你可以看到序列化版本是相同的..一旦我在results.php上反序列化,我应该能够像我之前那样使用该对象吗?

编辑: 正如所建议的,我在发布此问题之前尝试的是解码变量然后反序列化它。但它返回错误

if(isset($_POST['object'])){ $decodeObjStr = json_decode($_POST['object']); $session =  unserialize($decodeObjStr);}

致命错误:在布尔值

上调用成员函数getName()

decode_json的var dump。

 var_dump($decodeObjStr);

NULL

2 个答案:

答案 0 :(得分:2)

为什么呢?这是在阅读你的问题时首先突然出现的问题。你为什么想做这个?这是一个巨大的安全风险,它可以(并且可能会)将您的用户的详细信息暴露给第三方。
更不用说,通过简单地编辑HTML代码,为用户提供一个简单的方法来增加他们自己的权限他们的浏览器的内置工具..

最重要的是:为什么不使用会话的内置功能及其相关的cookie?这样你只需要运行session_start(),并使用$_SESSION数组来存储内容。此外,不需要涉及AJAX甚至JavaScript,因为这个功能都是服务器端的。将数据发送到客户端,只需将其重新发送回服务器,就没有必要了。特别是当你可以将它存储在服务器上时。你不同意吗? :)

在这种情况下,我强烈建议使用会话。将userID存储在会话中,并使用它在每次加载时重新创建用户对象。必要时查询数据库 应该完全没有必要序列化对象,也不需要创建自己的定制“会话状态引擎”。

快速代码示例:
的index.php     

session_start ();

$user = new User ();
// Woodoo here, creating new user or logging in.

$_SESSION['userid'] = $user->getID ();

?>

<html>
<a href="results.php">Results</a>
</html>

<强> results.php     

session_start ();
$user = new User();

// Read the user's details from the DB, finalizing the object for use.
$user->read ($_SESSION['id']);

// Now we can do whatever we wanted to with the $user object.

答案 1 :(得分:1)

使用PHP函数内置的json_decode(),然后再进行反序列化。