表单数据json / ajax脚本在新服务器上不起作用(windows到linux)

时间:2011-04-23 17:19:58

标签: php ajax json

我正在将一个站点从Windows服务器移动到运行PHP 5.2.15的Linux服务器。

网站上有一个大型的申请表,使用javascript,jquery和ajax来验证/添加字段,json用于编码/解码输入数据,PHP用于发送电子邮件。

此表单在Windows帐户上正常运行。当我将它移动到我们的Linux服务器时,一切正常,除了发送的电子邮件是空的。有一个PHP错误被打印并与电子邮件一起发送: 警告:在第4行的/home/account/public_html/application/application_email.tpl中为foreach()提供的参数无效

该文件的前几行如下:

<?php 

 $infoArr = get_object_vars( $info );
 foreach( $infoArr as $key=>$val ) {
    $parts = explode( "_", $key );
    $number = array_pop( $parts );
    if( count( $parts ) >= 1 && is_numeric( $number ) )
    {

所以对我来说,错误说$ info是空的。 php变量$ info在另一个名为submitApp.php的文件中创建。该文件的前几行是:

<?php
 require_once( "emogrifier.php" );

 $info = json_decode( $_REQUEST['data'] );

 ob_start();
 require( "application_email.tpl" );
 $css = file_get_contents("application_email.css");
 $html = ob_get_contents();
 ob_end_clean();

因此,json_decode函数没有发生什么。在Firefox中使用Live HTTP标头,我可以看到表单输入数据(通过POST)传递给submitApp.php。所以,我知道数据正在到达那里。以下是来自LiveHTTPheaders的行:

POST /~account/application/submitApp.php data=%7B%22name%22%3A%22Test+Name%22%2C%22address%22%3A%22111+Test+Street%22%2C%22city%22%3A%22Testville%22%2C%22state%22%3A%22NJ%22%2C%22zip%22%3A%2212121%22%2C%22email%22%3A%22test%40test.com%22%2C%22

等等。

因此看起来好像json_decode不起作用,因此不会将$_REQUEST['data']的内容放入变量$info

有什么想法吗?我不是php的新手,但我是json,ajax以及这个“emogrifier”的新手。

谢谢!

2 个答案:

答案 0 :(得分:1)

我有同样的问题。我的JSON在本地服务器工作正常,这是我转换到Linux的窗口服务器我遇到了同样的问题,我尝试发布menthod获取数据后工作正常。我已将json_decode($_REQUEST['json']替换为json_decode($_POST['json']。最后发现它正在运行。

答案 1 :(得分:0)

好的,所以如果您认为$ info为空,那么您应该测试该条件,以便您可以优雅地处理它。以下可能看起来很简单,但我想首先消除最简单的解决方案,以确保我们正在以艰难的方式做事。因此,我喜欢在使用之前检查我的变量,因为我厌倦了NULL引用错误。

if( isset($info) )
{
  //... do something
}
else
{
  //... gracefully handle the error
}

至于怀疑json代码不起作用,你应该首先测试$ _REQUEST ['DATA']变量:

if( isset($_REQUEST['data]) )
{
  // DEBUG -- attempt to view the data:
  print_r($_REQUEST['data']);

  // ... perform json extraction
}
else
{
  // ... handle the error gracefully
}

通常当您使用HTML表单元素时,数据通过POST请求发送。我知道GET / POST请求也最终出现在REQUEST超全局数组中,但您可能想验证您的数据不在POST数组中......

告诉我们你的结果:)