PHP теряет переменные данные - PullRequest
1 голос
/ 04 июня 2010

У меня проблема с тем, что 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

Ответы [ 5 ]

3 голосов
/ 04 июня 2010

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

$data = "my_data";
include "file1.php"  // $data can be changed here !
print($data); // not "my_data"  anymore. 
3 голосов
/ 04 июня 2010

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

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

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

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

Странно, я вижу такое же поведение. Но теперь только для определенного значения

// 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 голосов
/ 04 июня 2010

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

  • $params не является массивом - скрипт, который, как вы думали, должен был назначить его как массив, не удался - поэтому выражение if преобразуется в ложное. Проверьте уровень отчетов об ошибках, чтобы убедиться, что он включает E_ALL & E_NOTICE, и посмотрите, не появляются ли ошибки «не в массиве» в вашем журнале. Вы также вызываете var_dump() для $ data (после того, как вы опустошите все значения массива) или для какой-либо другой переменной позже в вашем скрипте, заставляя вас думать , когда вызывается вторая var_dump().
  • $params является массивом, но ни один из этих ключей не существует в нем, поэтому выражение if преобразуется в false. Вы также вызываете var_dump() для $data (после того, как вы опустошите все значения массива) или для какой-либо другой переменной позже в вашем скрипте, заставляя вас думать , когда вызывается второй var_dump().
  • Ваша сборка PHP не является официальной сборкой и содержит дополнительные функции var_dump(), позволяющие получить переменную по ссылке и очистить все значения массива при сохранении ключей. Или, возможно, if() меняет сферу действия. Это не похоже на добавленную стоимость, поэтому лучше не использовать ничего, кроме официальной сборки.
  • Вы неправильно описали поведение или исключили код между строк, который мог бы объяснить его. Вам не хватает точек с запятой и списка известных ключей в $ param, поэтому можно с уверенностью предположить, что это не настоящий, полный код.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...