PHP丢失变量数据

3
我遇到了一个PHP变量丢失数据的问题。这个变量中有相当多的数据,因为它基本上包含了一个二进制文件,但我想知道这是否会导致它完全丢失信息。
看一下我的代码片段,它用于处理电子邮件附件:
var_dump($data);  
if (array_key_exists('filename', $params) || array_key_exists('name', $params)) {  
    var_dump($data);  
 ...
}

第一个var_dump输出了文件的期望结果:
"string(283155) "
--Apple-Mail-5-930065543 ... etc

第一个输出结果如下:

而第二个则会得到以下输出:

string(0) ""
...
string(0) ""

你知道这是为什么吗?如果变量太大,PHP是否会丢失其中的数据?(我之前从未遇到过这个问题,所以不确定)

如果是这样,有没有解决方法?

谢谢!

编辑:还值得一提的是,在这些语句之间没有缺少任何代码。我也尝试了一个较短的字符串,两个var_dump调用都输出了正确的结果。


1
如果在 $data 中有一个短字符串会发生什么?只是为了看看问题是否仍然存在。 - Phliplip
你能否在if语句后面再加一个var_dump,以查看输出结果是什么? - mqchen
尝试在$data变量中创建一个短字符串,我从var_dumps中获得输出。嗯... - Conor B
5个回答

5

这种情况是不应该发生的。在 var_dumps 之间,$data 应该得到了净化。很难确定 $data 在哪里被更改,需要看代码才能确定。但是我曾经遇到过类似的问题,当时我在处理一个过度使用 include 的旧代码。

$data = "my_data";
include "file1.php"  // $data can be changed here !
print($data); // not "my_data"  anymore. 

这接近了我的问题......变量被用在我认为它不会被使用的地方,这会导致问题。谢谢 - Conor B

4
不,PHP绝对不会删除任意变量。可能导致此行为的一些原因:
  • 在两次调用var_dump()之间,您正在使用变量$data进行其他操作。
  • 如果$data是全局变量,则可能会被另一个函数修改。
  • 您有另一个var_dump(),您认为它是打印$data的那个,但实际上它打印了另一个变量
  • $data是一个引用(由=&分配),并且已修改引用的变量。

2

闻起来像是以下情况之一:

  1. 您在作用域外使用 $data。例如,它是全局的,但您在 function() 块中使用它。在这种情况下,您必须在函数块中声明对此全局变量的访问:global $data。
  2. 您使用了引用。您可能希望将其转换为普通变量语义,但您必须小心处理假定引用语义的代码。 (PHP 手册有关于引用的部分,值得阅读。)

0

奇怪,我看到了相同的行为。但现在只限于特定的值。

// print "Entering getFieldVisibilityPermission(".$fld_module.",". $userid.",". $fieldname.") method ...";
// next line looses $userid only when it has value 12 for value 11 it has no problem
// require('user_privileges/user_privileges_' .$userid. '.php'); -> results in user_privileges_.php 
// require('user_privileges/user_privileges_' .$userid. '12.php'); -> results in user_privileges_1212.php

0
可能的原因:
  • $params 不是一个数组 - 你认为应该将其赋值为数组的脚本失败了 - 因此 if 表达式解析为 false。检查你的错误报告级别,确保它包括 E_ALL & E_NOTICE,并查看日志是否显示“非数组”错误。你还在你的脚本中后面调用 var_dump() 在 $data(在你清空所有数组值之后)或其他变量上,这会让你认为第二个 var_dump() 被调用了。
  • $params 一个数组,但这两个键都不存在于其中,因此 if 表达式解析为 false。你还在你的脚本中后面调用 var_dump()$data(在你清空所有数组值之后)或其他变量上,这会让你认为第二个 var_dump() 被调用了。
  • 你的 PHP 构建版本不是官方构建版本,并包含添加了 var_dump() 功能以按引用接收变量、同时保留键而清空所有数组值。或者它使得 if() 更改作用域。这似乎不是增值功能,所以最好不要使用非官方构建版本。
  • 你没有正确描述行为或者在这些行之间排除了代码,这有助于解释。你忽略了分号和 $params 中已知键的列表,因此可以安全地假定这不是真正的完整代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接