我通过此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');
我收到一条错误消息:
注意:未定义的索引:在第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']);
这给了我这个错误:
注意:未定义变量:C:\ Users \ Bas \ Documents ...。\ Cars \ index.php在第26行NULL上的_SESSION
没有像使用PHP的即时应用程序服务器这样的东西。
每个脚本都需要一次又一次地将整个应用程序上下文加载到内存中。那是PHP的最大缺点。
如果您有一个存储上下文值的对象(例如RoadTaxDataParser),则需要保存状态,并在下一个脚本中将其还原,在执行脚本后进行正弦存储,内存将被清除,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-作为第一个声明!
实际上,仅在脚本终止时才需要将该对象同步到会话中,而不必每次都分配值时才将其同步到会话中。但这需要另一个处理程序,这会使这里的结构复杂化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句