переменная NULLтся

Статус
В этой теме нельзя размещать новые ответы.

shkura

Новичок
переменная NULLтся

include('notepad.txt'); - инклудю массивы вида:
<?
$np_msg[0] = 'dfhdfhd';
$np_msg[1] = 'gdfhdfhdf';
$np_msg[2]='fghfgh';
$np_msg[3]='fghfgh';
$np_msg[4] = 'gdfhdfhdf';
?>
вывожу echo count($np_msg); //выводит 5, всё верно
делаю запись в файл, предварительно открыв его и импортив данные в $a;
заменяю символ ?> следующим элементов массива $notepad_save = str_replace('?>', $new_msg, $a); заранее сформировав $new_msg;
далее записываю $notepad_save в тот же файл, только уже с w+ атрибутом:
if (fwrite($file_notepad, $notepad_save) === FALSE) { $error .= 'Невозможно добавить сообщение<br>'; }
потом перезагружаю страницу, закрывая файл:
fclose($file_notepad); header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); exit;
вывожу всё функцией:
$notepad ='';
for ($i = count($np_msg); $i >= (count($np_msg)-50); $i--) {
if (isset($np_msg[$i])){
$notepad .= "<tr><td>{$np_msg[$i]}</td></tr>";
}
}

echo '<table><tr>'.$notepad.'</tr></table>';
самое интересное, что дописывается:
<?
$np_msg[0] = 'dfhdfhd';
$np_msg[1] = 'gdfhdfhdf';
$np_msg[2]='fghfgh';
$np_msg[3]='fghfgh';
$np_msg[4] = 'gdfhdfhdf';
$np_msg[1] = 'TEST TEST TEST';
?>
Отсюда я сделал вывод, что переменная онуляется, как такое возможно, если строчкой выше я её выводил и она равна количеству $np_msg элементов массива, в чём может быть ошибка?
 

shkura

Новичок
$new_msg = "\$np_msg[".count($np_msg)."]='TEST TEST';\n\r?>";
онуляется count($np_msg)


UPTADE:
попробывал сейчас упростить с нуля для теста, получилось это:
<?
ini_set('display_errors',1);

include('notepad.txt');

echo count($np_msg); //выводит 5(как надо) первые 2 раза

$file_notepad = fopen('notepad.txt', 'r+');
while (!feof($file_notepad)) {
$a .= fread($file_notepad, 9999999);
} //11 строчка, я в шоке...
fclose($file_notepad);


$file_notepad = fopen('notepad.txt', 'w+');
$a = str_replace('?>', count($np_msg).' ?>', $a);
fwrite($file_notepad, $a);
fclose($file_notepad);
?>
после двух нажатий F5 в браузере вывелось:
Parse error: syntax error, unexpected T_LNUMBER in /var/www/vhosts/maryjane.ru/subdomains/ostgur/httpdocs/notepad.txt on line 11
файл notepad.txt до запуска скрипта:
<?
$np_msg[0] = 'dfhdfhd';
$np_msg[1] = 'gdfhdfhdf';
$np_msg[2]='fghfgh';
$np_msg[3]='fghfgh';
$np_msg[4] = 'gdfhdfhdf';
?>
файл notepad.txt после 2х запуска скрипта:
<?
$np_msg[0] = 'dfhdfhd';
$np_msg[1] = 'gdfhdfhdf';
$np_msg[2]='fghfgh';
$np_msg[3]='fghfgh';
$np_msg[4] = 'gdfhdfhdf';
5 5 ?>
 

whirlwind

TDD infected, paranoid
shkura Вы уверены что она обнуляется именно там, где генерируется новый хвост?
 

whirlwind

TDD infected, paranoid
Я уверен, что читающие этот топ шокированы не меньше Вашего

ЗЫ. закрывая глаза на все прочее, не проще ли так?

PHP:
$np_msg = unserialize(file_get_contents('notepad.txt'));

$np_msg[] = 'test test test';

file_put_contents('notepad.txt',serialize($np_msg));
 

shkura

Новичок
12 строчек кода, 2 раза срабатывает, потом ошибка - вот шок, вас, надеюсь, такое не касалось.
 

Michael_X

Новичок
а какой смысл вообще читать то-же самое, если у тебя это все проинклудилось?

include('notepad.txt');

и у тебя в $np_msg есть все, что тебе надо...
захотел - добавил что надо...

потом
$file_notepad = fopen('notepad.txt', 'w+');
fwrite($file_notepad, "<?php");
foreach($np_msg as $key=>$val){
fwrite($file_notepad, "\$np_msg[".$key."]=".$val.";\n");
}
fwrite($file_notepad, "?>");
fclose($file_notepad);
?>

а ты, получается, пишешь в конец количество элементов, которые у тебя есть... потому фаил и не инклудиться...

$a = str_replace('?>', count($np_msg).' ?>', $a); // может про замену надо почитать? или сам фаил инклудить не надо тогда...
 

shkura

Новичок
спасибо, whirlwind.

Апокалипсис
выводит a:1:{i:0;s:14:"test test test";}
в браузере при обновлении прибавляются циферки...
а это как то не очень поддаётся моей неокрепшей логики, но как я понял этот способ лучше, но что он даёт пока не уловил.

Michael_X
Как не инклудя файл я смогу узнать кол-во переменных в массиве $np_msg?

есть файл, туда надо добавлять переменные через форму, потом их надо выводить(в этом же php-файле), задача простая, а я разобраться не могу :(
 

Michael_X

Новичок
shkura
еще раз подумай над следующим вопросом... если у тебя будет в конце просто цифра, то как файл сможет проинклудится?

ты инклудь файл, но не записывай в конец файла общее количество єлементов масива... вот и вся причина твоего бага...

а получить количество строк не пробовал? Это разве не будет то-же самое, что и количество элементов (правда надо будет обрезать первую и последнюю строчку)?

что-то где-то в структуре ты не продумал...
 

shkura

Новичок
Michael_X, понял, большое спасибо, просто забывал, когда упрощал.
file_get_contents заменяет и include и fopen? кажется я немного разобрался, этот вариант уже лучше мне нравится.
 

Michael_X

Новичок
file_get_contents

http://ua2.php.net/manual/en/function.file-get-contents.php - может в мануал?
 

shkura

Новичок
Help - и так всегда открыт, просто я недопонимаю каким образом переменная туда записывается, как я понял эта штука(file-get-contents) делает из файла массив, а $np_msg = file_get_contents('notepad.txt'); - это всеголишь обман, по-сути дела, какой-то с назначением $np_msg значений из файла.
У меня же было всё понятно, я тупо брал переменные и кидал их в файл, как код. Но вот, что-то не пошло у меня с этим :(
Ну допустим принял file-get-contents за истинный путь.
Есть форма -> отправляем переменные(их штуки 3) -> получаем, обрабатываем -> записываем в файл...
тут возникает проблема, как file-get-contents записать несколько перменных, чтобы потом их выковырять в виде простых массивов, потому как я потом определяю кол-во массивов по -> через оператор for вывожу 50 штук, выводя схожие элементы по ID, но разные по "массивности"(имя, дата, ICQ - например)

господа, свершилось чудо:
... $np_msg[5]='test'; $np_msg[6]='test'; $np_msg[7]='test'; $np_msg[8]='test'; $np_msg[9]='test'; ?>
добавлятся новые элементы, аж страшно теперь, что делать... как всё это перенести на исходный(неупрощённый) код, думаю буду добвалять в этот постепенно из того, чтоб наверняка, вот рабочий код:
ini_set('display_errors',1);

include('notepad.txt');
$file_notepad = fopen('notepad.txt', 'r+');
while (!feof($file_notepad)) {
$a .= fread($file_notepad, 9999999);
}
fclose($file_notepad);
$file_notepad = fopen('notepad.txt', 'w+');
echo count($np_msg); //специально вывожу
$a = str_replace('?>', '$np_msg['.count($np_msg)."]='test'; ?>", $a);
fwrite($file_notepad, $a);
fclose($file_notepad);
только вот не пойму, почему он заработал, алгоритм действий был тот же, что и когда начал исходный писать...
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума

shkura

Новичок
я про конкретный пример говорил, что мне whirlwind дал,.
"делает из файла массив", это конечно же, образно говоря опять же про пример.
Описание
Данная функция идентична функции file() с той только разницей, что содержимое файла возвращается в строке, начиная с указанного смещения offset и до maxlen байтов. В случае неудачи, file_get_contents() вернёт FALSE.
думаю и так вам известно.
просто я уже к своему примеру привык, поэтому не могу адаптироваться к чему-то новому, целый день над такой фигней простой просидел, рад был бы если толк какой вышел с этого.
 

Beavis

Banned
shkura
закрой на часик форум и почитай описания функций, которых тебе посоветовали использовать, посмотри примеры, и после этого вряд ли останутся вопросы
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху