2010-06-03 3 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 просто бросает данные в переменные, если они действительно большие? (Я так не думал, так как раньше у меня не было этой проблемы)

Если да, то обходной путь?

Спасибо!

Редактировать: также стоит упомянуть, что между этими утверждениями отсутствует код. Я также просто попробовал его с более короткой строкой, и я получаю правильный вывод для обоих вызовов var_dump.

+1

Что произойдет, если у вас есть короткая строка в $ data? Просто чтобы посмотреть, не исчезла ли проблема. – Phliplip

+0

Не могли бы вы добавить еще один var_dump после if-statement, чтобы узнать, что такое вывод? – mqchen

+0

Пробовал делать короткую строку в переменной $ data, и я получаю вывод из обоих var_dumps. Hm .. –

ответ

3

Этого никогда не должно быть. $ data очищается где-то между var_dumps. Трудно сказать, где $ data изменяется, не видя кода, но у меня были подобные проблемы, когда я работал со старым кодом, который злоупотреблял. Например,

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

Это было близко к моей проблеме ... переменная использовалась за пределами тех мест, которые, как я думал, она используется, и это вызывает проблемы. благодаря –

3

Нет, PHP определенно не удаляет произвольные переменные. Некоторые причины, которые могут привести к такому поведению:

  • Вы используете переменную $data для чего-то еще между двумя вызовами var_dump()
  • Если $data глобален может быть изменен другой функцией.
  • У вас есть еще var_dump(), что вы думаете, это одна печать $data, но на самом деле печатает другой переменной
  • $data является reference (назначенный =&) и ссылки переменной изменяется.
2

Пахнет, как один из:

  1. Вы используете $ данные за его рамки. Например. он глобальный, но вы используете его в блоке function(). В этом случае вы должны объявить доступ к этому глобальному в своем функциональном блоке: данные globabl $.
  2. Вы используете ссылки. Вероятно, вы захотите преобразовать это в обычную семантику переменных, но вам нужно быть осторожным, если будет установлен соответствующий код, который предполагает ссылочную семантику. (В руководстве PHP есть раздел, посвященный ссылкам, его стоит прочитать.)
0

Возможные причины:

  • $params не является массивом - сценарий вы думали, должен был назначить его несостоявшимся массив - поэтому выражение if решает ложно. Проверьте свой уровень отчетности об ошибках, чтобы убедиться, что он включает в себя E_ALL & E_NOTICE и посмотрите, появляются ли ошибки «не массива» в вашем журнале. Вы также вызываете var_dump() на $ data (после того, как вы опустошите все значения массива) или по какой-либо другой переменной, позже, позже по вашему сценарию, заставив вас подумать, вызывается второй 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