Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Автосохранение переменных
Форумы портала PHP.SU » » Вопросы новичков » Автосохранение переменных

Страниц (2): [1] 2 »
 

1. morph-x - 18 Октября, 2011 - 01:35:02 - перейти к сообщению
У меня есть переменная $var в которой находиться информация. Можно как либо сделать чтобы после каждого изменения этой переменной она автоматически сохранялась в файл (где-то слышал что действие к событию можно прицепить) или же это нереально?

Заранее большое спасибо!
2. morosit - 18 Октября, 2011 - 06:38:43 - перейти к сообщению
morph-x пишет:
действие к событию можно прицепить
вам PHP или JS
логика (на ПХП) примерно такая:
0. записываем переменную в файл, или базу.
1. в нужном месте проверяем равно ли значение переменной значению из файла.
2. если равно продолжаем работу, else записываем последнее значение и продолжаем работу.

как делать проверку, сравнение, запись, чтение файла читайте в уроках http://www.php.su/lessons/
3. Данил_123 - 18 Октября, 2011 - 12:44:42 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $var="one_text";
  3. mysql_connect("localhost", "root", "12345") or die ("no connect server");
  4. mysql_select_db(dbname) or die ("no connect base");
  5. $query="INSER INTO `tablename` values('$var') ";
  6. $result=mysql_query($query);
  7. if(!$result) echo "Не записало";
  8. $num = mysql_query("SELECT * FROM `tablename` WHERE `var` = '$var' LIMIT 1");
  9. if(mysql_num_rows($num)==0) $query";
  10. $results=mysql_query($query);
  11. if(!$results) echo "Не записано";
  12. mysql_close();
  13. ?>


Вроде так, не провераял
4. morph-x - 18 Октября, 2011 - 13:15:30 - перейти к сообщению
morosit пишет:
вам PHP или JS

Мне PHP. Как сравнивать значения, читать из файла и т.д. я уже знаю. Мне как раз нужно что бы не вызывать функцию перезаписи переменной после каждого ее изменения. Мне нужно чтобы к событию изменения переменной ($var = 'new_value';) прицепить действие которое уже будет записывать ее в файл. Но я тут подумал, можно же сохранять читать ее из файл в начале скрипта и сохранять в файл в конце. При следующем запуске скрипта, вначале, она будет иметь то значение, которое имела в конце предыдущего запуска скрипта. Но вопрос все одно остается открытым Улыбка
5. Данил_123 - 18 Октября, 2011 - 13:52:17 - перейти к сообщению
morph-x пишет:
morosit пишет:
вам PHP или JS

Мне PHP. Как сравнивать значения, читать из файла и т.д. я уже знаю. Мне как раз нужно что бы не вызывать функцию перезаписи переменной после каждого ее изменения.[color=red][/color] Мне нужно чтобы к событию изменения переменной ($var = 'new_value';) прицепить действие которое уже будет записывать ее в файл. Но я тут подумал, можно же сохранять читать ее из файл в начале скрипта и сохранять в файл в конце. При следующем запуске скрипта, вначале, она будет иметь то значение, которое имела в конце предыдущего запуска скрипта. Но вопрос все одно остается открытым Улыбка


Сообщением выше сказано, а если нужно с выводом, то вот:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $var="one_text";
  3. mysql_connect("localhost", "root", "12345") or die ("no connect server");
  4. mysql_select_db(dbname) or die ("no connect base");
  5. $query="INSER INTO `tablename` values('$var') ";
  6. $result=mysql_query($query);
  7. if(!$result) echo "Не записало";
  8. $num = mysql_query("SELECT * FROM `tablename` WHERE `var` = '$var' LIMIT 1");
  9. if(mysql_num_rows($num)==0) $query";
  10. $results=mysql_query($query);
  11. if(!$results) echo "Не записано";
  12. //вывод 1(стандартный)
  13. print '$var';
  14. //вывод 2(из базы)
  15. $rows=mysql_query("SELECT * FROM `table`");
  16. while($row=mysql_fetch_array($rows));
  17. echo $row['var']; //Заметь кавычки не нужны
  18. mysql_close();
  19. ?>
6. morph-x - 18 Октября, 2011 - 14:13:49 - перейти к сообщению
Данил_123 пишет:
Сообщением выше сказано, а если нужно с выводом, то вот...

Я так понимаю этот код сначала записывает значение $var в БД, а затем выводит его (сначала обычно потом из БД). Но к чему все это? Вы наверное не так меня поняли. Скорее всего то что я задумал невозможно сделать, но мне вполне хватит читать переменную из файла (или БД) в начале скрипта, а в конце скрипта записывать ее обратно в файл (или БД).
7. illy - 18 Октября, 2011 - 14:23:45 - перейти к сообщению
если что - можно и через аякс сделать
8. Данил_123 - 18 Октября, 2011 - 14:43:07 - перейти к сообщению
morph-x, возможно и не понял, но как понял так и сделал.. Что при каждом изменение(+выполнения скрипта) переменная будет проверяться если такую водили, то скрипт промолчит и просто выведет переменную $var если переменная $var изменила значение, то это значение записывается в базу и выводится на экран.. Я так понял
morph-x пишет:
но мне вполне хватит читать переменную из файла (или БД) в начале скрипта
Рад, то что писал не впустую)
Только вывод из базы 15-17 строки (т.е конец)
9. morosit - 18 Октября, 2011 - 15:00:01 - перейти к сообщению
если вопрос остается открытым, может расскажете что сделать хотите (вдруг кто предложит вариант получше)
10. EuGen - 18 Октября, 2011 - 15:09:20 - перейти к сообщению
Насколько я понял, нужно отслеживание изменения переменной прямо в скрипте.
В этом случае обычное присваивание слуедует заменить некоторой пользовательской функцией, например:
PHP:
скопировать код в буфер обмена
  1. function assign(&$mVar, $value, $logfile='file.log')
  2. {
  3.    if($mVar!==$value)
  4.    {
  5.       file_put_contents($logfile, $value);
  6.    }
  7.    return $mVar=$value;
  8. }
  9.  
  10. $test = 'foo';
  11. $test = assign($test, 'bar');
  12. //var_dump($result);
  13. assign($test,'baz');
  14. //var_dump($result);

И не присваивать значение "напрямую", вместо чего всегда использовать подобную функцию.
11. Данил_123 - 18 Октября, 2011 - 15:28:35 - перейти к сообщению
Объясните подробней, что и при чем должно выполняться? Если мой вариант не подошел напишите это.
Спойлер (Отобразить)
12. morph-x - 19 Октября, 2011 - 23:38:45 - перейти к сообщению
morosit пишет:
если вопрос остается открытым, может расскажете что сделать хотите (вдруг кто предложит вариант получше)


Нужно создать что-то типа маленькой CMS. Хранить данные я решил в переменной $_DB. Просто у меня система работает (точнее работала, теперь я ее немного изменил) так, что скрипт может прерваться во многих местах, и не дойдет до конца. А писать функцию сохранения данных в файл после каждого действия как-то не правильно.

EuGen пишет:
Насколько я понял, нужно отслеживание изменения переменной прямо в скрипте. В этом случае обычное присваивание слуедует заменить некоторой пользовательской функцией, например...


Я как-то не подумал (торможу немного). Большое спасибо!


Данил_123 пишет:
Объясните подробней, что и при чем должно выполняться? Если мой вариант не подошел напишите это.


Мне нужно то, что постом выше написал EuGen.
13. Stierus - 20 Октября, 2011 - 09:43:32 - перейти к сообщению
Я не уверен, что правильно вас понял, но попробую высказаться Улыбка
Как бы делал я:

Написал бы класс, который и будет реализовывать доступ к переменным и при их изменении записывать в файл:
PHP:
скопировать код в буфер обмена
  1. class VarCollection{
  2.         private $varCollection = array();
  3.         private $filePath = '/tmp/varCollection';
  4.  
  5.         public function __construct(){
  6.                 //тут чтение файла и заполнение $varCollection
  7.                 $handle = fopen($this->filePath, "r");
  8.                 $contents = '';
  9.                 while (!feof($handle)) {
  10.                   $contents .= fread($handle, 8192);
  11.                 }
  12.                 fclose($handle);
  13.                 $this->varCollection = json_decode($contents, false);
  14.         }
  15.  
  16.         public function __set($varName, $varValue){
  17.                 if(key_exists($varName, $this->varCollection) && $this->varCollection[$varName] === $varValue){
  18.                         //на самом деле переменная не меняется, не за чем лишний раз писать в файл
  19.                         return;
  20.                 }
  21.                 $this->varCollection[$varName] = $varValue;
  22.                 $this->saveVars(); //это можно убрать в деструктор - сами смотрите
  23.         }
  24.  
  25.         public function __get($varName){
  26.                 if(key_exists($varName, $this->varCollection)){
  27.                         return $this->varCollection[$varName];
  28.                 }
  29.                 else{
  30.                         return Null;
  31.                 }
  32.         }
  33.  
  34.         private function saveVars(){
  35.                 $file= fopen($this->filePath, 'w');
  36.                 fwrite($file, json_encode($this->varCollection));
  37.                 fclose($file);
  38.         }
  39. }
  40.  
  41. //как оно работает:
  42. $collection = new VarCollection();
  43.  
  44. $collection->testVar1 = "its work";
  45. echo $collection->testVar1;


код писался на коленк, тут надо добавить проверку всяких исключительных ситуаций (объекты так сохранять далеко не все можно + что если запись в файл запрещена, но ход моих мыслей был бы таким)
14. EuGen - 20 Октября, 2011 - 10:09:15 - перейти к сообщению
Stierus, оно-то конечно да.. А еще обработку исключений, а еще отдельный обработчик того, как работать с логом (а вдруг мы захотим в БД писать вместо файла.. или почту слать?)
и еще много-много всяких полезных вещей. Только автору, думаю, понять это сложно будет.
15. Stierus - 20 Октября, 2011 - 10:15:31 - перейти к сообщению
Именно поэтому я не стал грузить рассказами о том, что ему надо делать, а выложил готовое решение Улыбка. Я очень надеюсь, что автору топика будет интересно понять, как он работает ... что автор топика пойдет на php.net и посмотрит про все эти замечательные функции перегрузки свойств (Property overloading .. эт я тип намекаю, что гуглить). Ну а если нет - пусть тупо скопипастит код и забудет как страшный сон.
(Добавление)
особенно, учитывая
Цитата:
Нужно создать что-то типа маленькой CMS

(Добавление)
ps
Кстати, синглтоном его делать не стал по той же причине - был бы перебор (а так, по хорошему, нужно сделать синглтоном этот класс)

 

Powered by ExBB FM 1.0 RC1