2010-06-03 104 views
1

我遇到了PHP在变量中丢失数据的问题。变量中有相当多的数据,因为它基本上包含一个二进制文件,但我想知道这是否会导致它完全丢失它的信息。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真的很大,PHP是否会将数据放入变量中? (我不这么认为,因为我以前从未遇到过这个问题)

如果是这样,任何解决方法?

谢谢!

编辑:还值得一提的是,这些陈述之间没有代码缺失。我也只是用一个较短的字符串尝试它,我得到正确的输出为这两个var_dump调用

+1

如果$ data中有一个短字符串,会发生什么?只是为了看问题是否存在。 – Phliplip 2010-06-03 21:51:18

+0

您可以在if语句之后添加另一个var_dump来查看输出是什么? – mqchen 2010-06-03 22:06:14

+0

尝试在$ data变量中创建一个短字符串,并从var_dumps中获取输出。嗯.. – 2010-06-04 01:22:37

回答

3

它永远不会发生。 $ data在var_dumps之间的某处被净化。很难说在没有看到代码的情况下$ data被更改的地方,但是当我使用包含过度使用的旧代码时,我遇到了类似的问题。 例如,

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

这很接近我的问题......变量被用在我认为正在使用的地方之外,这是造成问题的地方。谢谢 – 2010-06-04 01:36:22

3

不,PHP绝对不会删除任意变量。有些原因可能会导致这种行为:

  • 您使用的是var_dump()
  • 变量$data了两个电话之间别的东西如果$data是全球性的,可能被另一个函数修改。
  • 你有另一个var_dump(),你认为是一个印刷$data,但实际打印另一个变量
  • $data是(通过=&指定)一个reference和引用变量修改。
2

闻起来像之一:

  1. 你使用它的范围之外$的数据。例如。它是全局的,但是你可以在函数()块中使用它。在这种情况下,您必须在您的功能块中声明对此全局的访问:globabl $ data。
  2. 您使用参考。您可能希望将其转换为普通变量语义,但您必须小心谨慎,假定引用语义的代码已相应修复。 (PHP手册有一个参考部分,值得一读。)
0

可能的原因:

  • $params不是阵列 - 你以为剧本本来是给它分配一个数组失败 - 所以if表达式解析为false。检查您的错误报告级别,确保它包含E_ALL & E_NOTICE并查看日志中是否显示“不是阵列”错误。您还在$ data上(在您清空所有数组值之后)或其他某个变量上再次调用var_dump(),让您认为第二个var_dump()被调用。
  • $params一个数组,但它们中都不存在这些键,所以if表达式解析为false。您也在var_dump()$data(在您清空所有数组值之后)或其他一些变量再次在您的脚本中再次下来,使您认为第二个var_dump()被调用。
  • 您的PHP版本不是官方版本,并包含var_dump()的附加功能,以通过引用接受该变量,并在保留密钥的同时清空所有数组值。或者它可能会使if()更改范围。这看起来不像增值功能,所以最好不要使用除官方版本之外的任何内容。
  • 您不正确地描述行为或排除了可帮助解释它的行之间的代码。您在$ param中缺少分号和已知键的列表,因此可以认为这不是真正的完整代码。
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