PHP不会在Javascript的HTTP请求中将数据存储在数组中

时间:2014-12-28 11:10:28

标签: javascript php arrays

我通过这种JavaScript方法将数组传递给PHP文件:

/**
 * The PHP file which receives the data
 *
 * @type {string} The php filename
 */
const INSTALL_FILE = "install.php";

/**
 * Passes roadTaxData to the php install file which could be get with the $_POST operator
 */
function passToPHP (paramName, data) {
    var httpc = new XMLHttpRequest(); // simplified for clarity"
    httpc.open("POST", INSTALL_FILE, true); // sending as POST

    httpc.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    /*
     Test purposes
     */
    httpc.onreadystatechange = function () { //Call a function when the state changes.
        if (httpc.readyState == 4 && httpc.status == 200) { // complete and no errors
            console.log(httpc.responseText); // some processing here, or whatever you want to do with the response
        }
    };
    httpc.send(paramName + "=" + data);
}

在我接收数据的PHP文件中(确实如此,我正在调用方法并实际测试它)我有这样的事情:

$road_tax_data = json_decode($_POST['road-tax_data'], true);
require "RoadTaxDataParser.php";

RoadTaxDataParser::set('test', $road_tax_data);

哪个参考此文件:

class RoadTaxDataParser
{
    private static $data = [];

    public static function set ($key, $value) {
        self::$data[$key] = $value;
    }

    public static function get ($key) {
        return self::$data[$key];
    }
}

并且(希望)将数据存储在其中。

问题

当我尝试在我的get()文件中的RoadTaxDataParser中调用index.php方法时,这样:

echo RoadTaxDataParser::get('test');

我收到错误说:

  

注意:未定义索引:test in   第13行的C:\ Users \ Bas \ Documents .... \ Cars \ RoadTaxDataParser.php

预期结果

我希望我可以通过HTTP请求在一个Registry类中存储数据,然后在需要时获取数据。

这样做的目的是我不想用JavaScript做任何计算或html部署,我想用PHP做这件事。

问题

如何从JavaScript HTTP请求中将数据存储在类中,然后使用index.php文件将其调回?

我自己尝试

我尝试了Axel告诉我的会话。在我的install.php文件中这样:

header('Content-Type: application/json');

$road_tax_data = json_decode($_POST['road-tax_data'], true);
$_SESSION['rtd'] = $road_tax_data;

然后通过我的index.php

var_dump($_SESSION['rtd']);

这给了我这个错误:

  

注意:未定义的变量:_SESSION in   C:\用户\巴斯\文件...   。\ Cars \ index.php第26行NULL

1 个答案:

答案 0 :(得分:2)

没有像PHP的即时应用服务器这样的东西。

每个脚本都需要一次又一次地将整个应用程序上下文加载到内存中。这是PHP的巨大劣势。

如果你有一个对象,存储上下文值,比如你的RoadTaxDataParser,你需要保存状态,并在下一个脚本中恢复它,执行脚本后sinc,清除内存和RoadTaxDataParser的实例离开了。

你可以这样做,使用单例设计模式(代码未测试):

class RoadTaxDataParser
{
    public static $__instance = null;
    private static $data = [];

    public static function set ($key, $value) {
        self::$data[$key] = $value;
        $_SESSION['rtdp'] = self;  // could be done better
    }

    public static function get ($key) {
        return self::$data[$key];
    }

    public static function getInstance() {
          if ( self::$__instance != null )
                 return self::$__instance;
          self::$__instance = isset($_SESSION['rtdp']) ? $_SESSION['rtdp'] : new RoadTaxDataParser();

          return self::$__instance;

}

然后

 RoadTaxDataParser::getInstance()->set('test', $road_tax_data);

此外,您需要先在每个脚本中启动会话:

 session_start(); 

请参阅php.net/manual/en/function.session-start.php - 作为第一个声明!

实际上,只有在脚本终止时才需要将对象同步到会话中,而不是每次分配值时都要同步。但这需要另一个处理程序,这会使结构复杂化。