我是一个苦苦挣扎的学习php和javascript的人,并一直疯狂地搜索解决方案但无济于事。我正在尝试使用php将json对象/字符串从一个页面发送到另一个页面,然后在该新页面中回显结果(最终使用tcppdf生成pdf)。所以基本上一些javascript在一个页面中生成一个对象pageStructure
,然后我将其字符串化:
var jsonString = JSON.stringify(pageStructure);
alert(jsonString);`
警报弹出正常。
我现在想把它发送到另一个php文件getdata.php
,然后用它来构建一个pdf。
我已尝试使用表单发布,但更新表单中输入的值jsonString
无法正常工作。
**补充 - 这里我的问题的解释 我创建了一个表单如下:
<form action="getdata.php" method="post">
<textarea type="hidden" id="printMatter" name="printMatter" value=""></textarea>
<button type="submit"><span class="glyphicon glyphicon-eye-open" ></span></button>
</form>
在构建jsonString
以将textarea
的值设置为该值后,我有一些代码:
document.getElementById('printMatter').value = jsonString;
alert(document.getElementById('printMatter').value);
提交按钮激活打开getdata.php页面的表单,但我注意到两件事:
(1)在发送jsonString之前,每个引号(&#34;)之前的字符串都是escapes()。
(2)当getdata.php打开时,回显的jsonString已经改为包含no \ s而是json字符串中一个对象的值(&#39; value&#39;)(一块svg)代码包括众多\ s) - 例如(截断,因为值是一个非常长的svg字符串,但这给出了想法):
{"type":"chartSVG","value":"<g transform=\"translate(168.33333333333334,75)\" class=\"arc\">...
已更改为整数 - 例如:
{"type":"chartSVG","value":"12"}
我不明白这种情况发生的原因或原因,以及如何在发布表单后维护完整的svg代码。
**
我尝试过如下使用jquery / ajax:
$.ajax({
url: 'getdata.php',
type: 'post',
data: {printMatter: jsonString},
success: function(){
alert('it worked');
},
error: function(){
alert('it failed')}
})
我得到了成功的回复,但我最终得到了同一页,而不是让新的php文件回应它的发送内容!
php脚本包含以下内容:
<?php
echo $_POST['printMatter'];
?>
但这不起作用。也没有尝试在php页面添加标题(例如header('Content: application/json')
。我最终会停留在原始页面上。如何让我在新页面(getdata.php)上留下我的回声json string?
任何人都可以解释我做错了什么或者我怎么能得到我想要的东西?
非常感谢你。
** ADDITION
这表明我如何获得jsonString
对象:
function item(type,value) {
this.type = type;
this.value = value;
}
for (i=0;i<thePage[0].length;i++) {
pageid = thePage[0][i].id;
var entry = new item("page",pageid);
pageStructure.push(entry);
}
var jsonString = JSON.stringify(pageStructure);
所以我最终得到了jsonString
中列出的一系列网页。
答案 0 :(得分:1)
尝试将$ _POST更改为$ _GET,因为您的AJAX请求正在执行HTTP GET而不是HTTP POST。
答案 1 :(得分:0)
<强>更新强>
这不会让我留在我想要的页面上。我不想刷新页面,只是重定向到接收已发布的json数据的新页面。
这本质上是一个页面“刷新”,虽然可能“刷新误导你,因为它可能意味着重新加载当前的URL。刷新的意思是一个全新的页面加载。这基本上是你要求的。那里有几种方法可以解决这个问题...
如果您的数据非常短并且不会违反网络服务器上URI的最大长度,那么您可以使用window.location
:
// send it as json like you are currently trying to do
window.location = 'getdata.php?printMatter=' + encodeURIComponent(jsonString);
// OR send it with typical url-encoded data and dont use JSON
window.location = 'getdata.php?' + $.serialize(pageStructure);
在这种情况下,您可以使用$_GET['printMatter']
来访问数据,而不是$_POST['printMatter']
。
如果数据有可能产生一个长字符串,那么你需要发布它。这有点棘手,因为如果我们想要POST,我们必须使用表单。使用非常简单的JSON和jQuery:
var form = '<form action="getdata.php" method="post">'
+ '<input type="hidden" name="printMatter" value="%value%" />'
+ '</form>';
form.replace('$value%', jsonString);
// if you have any visual styles on form that might then you may
// need to also position this off screen with something like
// left: -2000em or what have you
$(form).css({position: 'absolute'})
.appendTo('body')
.submit();
如果我们想将它作为普通的formdata发送,那么它会变得更复杂,因为我们需要递归循环pageStructure
并使用正确的name
属性创建输入元素...我不会没过那条路。
所以最后的方式(但我认为它不会起作用,因为看起来你试图生成一个文件并让浏览器下载它)将通过AJAX发送它并让ajax返回下一个url去:
JS
$.ajax({
url: 'getdata.php',
type: 'post',
data: {printMatter: jsonString},
type: 'json',
success: function(data){
window.location = data.redirectUrl;
},
error: function(){
alert('it failed')}
});
访问getdata.php
// do something with the $_POST['printMatter'] data and then...
$response = array(
'redirectUrl' =>$theUrlToGoTo
);
header('Content-Type: application/json');
print json_encode($response);
您正在使用AJAX。本质上,如果您这样做,AJAX将不会刷新页面:
$.ajax({
url: 'getdata.php',
type: 'post',
data: {printMatter: jsonString},
success: function(data){
alert('it worked');
alert('You sent this json string: ' + data);
},
error: function(){
alert('it failed')}
});
另请注意,我已将type
从'get'
更改为'post'
...此处设置的类型将部分决定您可以访问所发送数据的位置...如果你设置它然后在getdata.php中你需要使用$_GET
,如果你把它设置为post
那么你应该使用$_POST
。
现在,如果你真的想要一个整页刷新,那么你需要以另一种方式做到这一点。如何解决这个问题我不能说因为你没有提供足够的信息来了解在发送之前获取jsonString
会发生什么。