2010-06-03 9 views
1

J'ai un problème avec PHP qui perd des données dans une variable. Il y a pas mal de données dans la variable, car elle contient essentiellement un fichier binaire, mais je me demande si c'est la cause de perdre complètement ses informations.PHP Perdre des données variables

Regarder un extrait de mon code qui est utilisé pour traiter les pièces jointes:

var_dump($data); 
if (array_key_exists('filename', $params) || array_key_exists('name', $params)) { 
    var_dump($data); 
... 
} 

La première var_dump donne la sortie désirée du fichier:

"string(283155) " 
--Apple-Mail-5-930065543 ... etc 

tandis que le second donne une sortie de:

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

Une idée pourquoi cela se passe-t-il? PHP supprime-t-il simplement les données dans les variables si elles sont vraiment grandes? (Je ne pensais pas, comme je n'ai jamais eu ce problème avant)

Si oui, une solution de contournement?

Merci!

Editer: il convient également de mentionner qu'il n'y a pas de code manquant entre ces instructions. Je l'ai également essayé avec une chaîne plus courte et j'obtiens la bonne sortie pour les deux appels var_dump

+1

Que se passe-t-il si vous avez une chaîne courte dans $ data? Juste pour voir si le problème persiste. – Phliplip

+0

Pourriez-vous ajouter un autre var_dump après l'instruction if pour voir ce que la sortie est alors? – mqchen

+0

J'ai essayé de créer une chaîne courte dans la variable $ data, et je reçois les deux var_dumps. Hm .. –

Répondre

3

Cela ne devrait jamais arriver. $ data est purifié quelque part entre var_dumps. Il est difficile de dire où $ data est changé sans voir le code, mais j'ai eu des problèmes similaires quand j'ai travaillé avec de l'ancien code qui a été trop utilisé. Par exemple,

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

C'était proche de mon problème ... la variable était utilisée à l'extérieur des endroits où j'avais pensé qu'elle était utilisée et cela posait problème. Merci –

3

Non, PHP ne supprime définitivement pas les variables arbitraires. Certaines raisons qui pourraient conduire à ce comportement:

  • Vous utilisez la variable $data pour quelque chose d'autre entre les deux appels à var_dump()
  • Si $data est mondiale, il peut être modifié par une autre fonction.
  • Vous avez une autre var_dump() que vous pensez est une impression $data, mais qui imprime en fait une autre variable
  • $data est un reference (attribué par =&) et la variable référencée est modifiée.
2

Ça sent comme l'un:

  1. Vous utilisez $ données en dehors de son champ d'application. Par exemple. c'est global mais vous l'utilisez dans un bloc function(). Dans ce cas, vous devez déclarer l'accès à ce global dans votre bloc fonctionnel: globabl $ data.
  2. Vous utilisez des références. Vous voudrez probablement convertir ceci en sémantique variable ordinaire, mais vous devrez faire attention à ce que le code qui suppose une sémantique de référence soit corrigé en conséquence. (Le manuel PHP a une section sur les références, ça vaut le coup de lire.)
0

raisons possibles:

  • $params est pas un tableau - le script que vous pensiez était censé lui assigner comme un tableau a échoué - donc l'expression if décide de faux. Vérifiez votre niveau de signalement des erreurs pour vous assurer qu'il inclut E_ALL & E_NOTICE et vérifiez si les erreurs "pas un tableau" s'affichent dans votre journal. Vous appelez également var_dump() sur $ data (après avoir vider toutes les valeurs de tableau) ou sur une autre variable plus tard dans votre script, vous faisant pensez le second var_dump() est appelé.
  • $paramsest un tableau, mais aucune de ces clés n'existe à l'intérieur, donc l'expression if résout à false. Vous appelez également var_dump() sur $data (après avoir vidé toutes les valeurs de tableau) ou sur une autre variable plus tard dans votre script, vous faisant pensez le second var_dump() est appelé.
  • Votre build PHP n'est pas la version officielle et contient des fonctionnalités supplémentaires de var_dump() pour prendre la variable par référence, et vider toutes les valeurs du tableau tout en préservant les clés. Ou peut-être cela fait if() changer la portée. Cela ne semble pas être une fonctionnalité à valeur ajoutée, il vaut donc mieux ne pas utiliser autre chose que la version officielle.
  • Vous ne décrivez pas correctement le comportement ou avez exclu le code entre les lignes qui pourrait aider à l'expliquer. Il vous manque des points-virgules et la liste des clés connues dans $ param, donc il est prudent de supposer que ce n'est pas le vrai code complet.
0

Étrange Je vois le même comportement. Mais maintenant seulement pour une valeur spécifique

// 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 
Questions connexes