我正在将一个站点从Windows服务器移动到运行PHP 5.2.15的Linux服务器。
网站上有一个大型的应用表单,它使用javascript、jquery和ajax来验证/添加字段,使用json来编码/解码输入数据,使用PHP来发送电子邮件。
此表单在Windows帐户上运行良好。当我将它移动到我们的Linux服务器时,除了发送的电子邮件是空的之外,一切都正常。有一个PHP错误被打印出来并与电子邮件一起发送:警告:为/home/account/public_html/application/application_email中的foreach()提供了无效参数。TPL在第4行
文件的前几行如下:
<?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"很陌生。
谢谢!
我也有同样的问题。我的JSON在本地服务器上工作很好,这是窗口服务器,而我转换到Linux,我也遇到了同样的问题,在我尝试了获取数据的方法后,它工作得很好。我已经把json_decode($_REQUEST['json']
换成了json_decode($_POST['json']
,最后发现它在工作
好的,如果您认为$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数组…
让我们知道你的结果:)