За последние 24 часа нас посетили 20574 программиста и 1133 робота. Сейчас ищут 665 программистов ...

Как увеличивать значение переменной при каждом обращении?

Тема в разделе "PHP для новичков", создана пользователем Badnick, 1 янв 2013.

  1. Badnick

    Badnick Активный пользователь

    С нами с:
    27 дек 2012
    Сообщения:
    13
    Симпатии:
    0
    Приветствую всех, заглянувших на форум. Возникла нужда в небольшом скрипте, который будет увеличивать значение переменной, каждый раз, когда к ней обращаются (точнее к файлу, где отображается ее значение).
    В папке с самим скриптом лежит текстовый файл с именем file.txt, из переменной $a в него укладывается одна цифра, которая должна увеличиваться на 1, каждый раз, когда скрипт открывает этот файл (т.е. при обновлении страницы в браузере).
    Код (Text):
    1. $a = 1;
    2. if ($opens = fopen("file.txt", "w")){
    3. $an = fwrite($opens, $a + 1);
    4. }
    Таким способом увеличить значение не получилось, но открыть файл и записать туда просто 1 (стартовое значение переменной $a) удалось. Очень прошу помощи, может быть, кто-то догадывается, как можно увеличивать значение переменной $a и заносить его в file.txt с каждым открытием (а лучше закрытием) этого файла?
    Большое спасибо.
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Re: Как увеличивать значение переменной при каждом обращении

    Пора перебраться на базу данных уже 21 век наступил...

    Тут не вижу никакой проблемы. Как понимаю в файле только 1 значение - количество открытия файла.
    При обновлении страницы открываем файл если он пустой то пишем 1 если нет присваиваем переменной и увеличиваем ее. Затем пишем в файл.

    Думаю скрипт сам напишешь... а вообще забей, Новый Год, отмечать надо :)
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Re: Как увеличивать значение переменной при каждом обращении

    $a++;
    $an = fwrite($opens, $a);


    только всплывает проблема одновременной записи одного и того же числа разными скриптами, ибо читали они этот файл одновременно, и было там допустим 1. Отработали они каждый по разу, и оба запишут туда 2.
     
  4. Badnick

    Badnick Активный пользователь

    С нами с:
    27 дек 2012
    Сообщения:
    13
    Симпатии:
    0
    Re: Как увеличивать значение переменной при каждом обращении

    Спасибо всем, кто отписался в теме. smitt, базу данных буду использовать позже, пока нужно именно значение в файле. По поводу function refresh и вообще refresh в интернете ничего не нашел. Может у кого есть предположения по данному вопросу?

    Добавлено спустя 2 минуты 32 секунды:
    Re: Как увеличивать значение переменной при каждом обращении?
    Общий код имеет вид:
    Код (Text):
    1. $a++;
    2. if ($opens = fopen("file.txt", "w")){ // если открыли file.txt
    3. $an = fwrite($opens, $a); // записываем в него $a (которая должна увеличиваться на 1)
    4. }
    5. $get = file_get_contents("file.txt");
    6. echo $get;
    7. fclose($opens);
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Re: Как увеличивать значение переменной при каждом обращении

    Прежде чем увеличить значение, надо сначала получить текущее значение. Где чтение переменной из файла?
     
  6. Badnick

    Badnick Активный пользователь

    С нами с:
    27 дек 2012
    Сообщения:
    13
    Симпатии:
    0
    Re: Как увеличивать значение переменной при каждом обращении

    Код (Text):
    1.  
    2. $first = file_get_contents("file.txt"); //читаем из файла переменную (заранее указал 1 в файле)
    3. if (fopen("file.txt", "w")){
    4. fwrite("file.txt", $first++);
    5. echo Работает;
    6. }
    Выводится ошибка "Warning: fwrite(): supplied argument is not a valid stream resource in W:\domains\localhost\fnnd.php on line 4", а за ней слово:
    "Работает".
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    А может быть из тебя повар выйдет хороший или продавец?

    помоему программирование это не твоё!

    Как минимум, читай справки по аргументам функций, которые используешь. и книжку "пэхапэ для чайников" купи. Ну что, блеать, тебе интернет-сообщество должно каждую букву править чтоли?!!!

    1. Даже если тебе кажется, что php будет искать файл в той же папке где скрипт — явно укажи текущую папку. просто ВСЕГДА указывай папку, это сбережет много твоего и нашего ( :D ) времени.
    2. fopen возвращает значение-хэндлер, которое потом подставляется в другие файловые функции. Иначе он нафиг не нужен был бы. Читай справку!
    3. Что дает вывод слова "работает"? это чтоли заклинание такое, блин? А когда оно НЕ выведется, по твоему?
    4. Если есть *open, должен быть *close. Это не догма, но, блеять, ты не в том статусе, чтобы полагаться на неявные операции. Читай блин справку.
    5. Операция $var++ возвратит значение переменной ДО увеличения и только потом переменная будет увеличена. Читай справку по языку!
    То есть даже если БЫ твои операции реально писали БЫ в файл, то там ничего БЫ не изменилось. Умора!

    Ну и вообще есть неуклюжка некоторая: у PHP есть классические файловые функции, которые пришли из Си: fopen, fread, fgets и т.д., а есть свои упрощенные file_get_contents, file_put_contents. Ну используй или те или другие, ведь когда они стоят вместе, то очевидно, что ты не понимаешь как они работают и в чем разница.
     
  8. Badnick

    Badnick Активный пользователь

    С нами с:
    27 дек 2012
    Сообщения:
    13
    Симпатии:
    0
    Re: Как увеличивать значение переменной при каждом обращении

    artoodetoo, эм, у "профи" такой юмор странный... Если вам явно не хочется отвечать, зачем тогда это делаете? По поводу "читай справку", я и так, прежде чем взять функцию читаю справку, и примеры (которые потом для себя переписываю) беру от туда же.
    Я вписал echo, чтобы убедиться где заканчивается ошибка (можете шуткануть на эту тему).

    Из ваших воплей выше я так и не понял разницы между fopen и file_get_contents (еще одну уморительную шуточку, пожалуйста). В моем примере, где нужно лишь извлечь значение, и тот, и другой способ подходят.

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

    Раз уж дело до советов дошло: я приобретаю "пэхапэ для чайников", а вы "русскей язык для ПРО" =).
    По поводу проблемы: вопрос открыт, когда сработает (может кому понадобится), отпишусь.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Re: Как увеличивать значение переменной при каждом обращении

    это он просто очень сопереживает твоим усилиям так как умеет.
     
  10. Badnick

    Badnick Активный пользователь

    С нами с:
    27 дек 2012
    Сообщения:
    13
    Симпатии:
    0
    Re: Как увеличивать значение переменной при каждом обращении

    А, ну ясно тогда
     
  11. Badnick

    Badnick Активный пользователь

    С нами с:
    27 дек 2012
    Сообщения:
    13
    Симпатии:
    0
    Re: Как увеличивать значение переменной при каждом обращении

    Решение нашел. Всем спасибо за участие в беседе.
    Если кому понадобится:
    Код (Text):
    1.  
    2. $file = (file_get_contents('./file.txt'));
    3. echo $file;
    4. file_put_contents('./file.txt', 1+$file)
    А там уже легко под fopen, fwrite, fclose переделать. При записи в файл, рекомендую использовать режим "c", т.е.
    Код (Text):
    1. $newopen = fopen("./file.txt", "c");
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Re: Как увеличивать значение переменной при каждом обращении

    Меньше суток ушло!
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Re: Как увеличивать значение переменной при каждом обращении

    Для филолога очень хороший результат.
     
  14. Badnick

    Badnick Активный пользователь

    С нами с:
    27 дек 2012
    Сообщения:
    13
    Симпатии:
    0
    Re: Как увеличивать значение переменной при каждом обращении

    Только проблема: результат увеличивается не на +1, а на +2. Т.е. запись в файл идет так: 1-3-5-7.... Может у кого есть предположения? При чем такая ситуация наблюдается с разными режимами открытия файла.
     
  15. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Re: Как увеличивать значение переменной при каждом обращении

    Ну видимо вы плюсуете во время записи и после))
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Re: Как увеличивать значение переменной при каждом обращении

    prefetch?
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
  18. win

    win Активный пользователь

    С нами с:
    21 окт 2012
    Сообщения:
    9
    Симпатии:
    0
    Re: Как увеличивать значение переменной при каждом обращении

    Используй http://ru.wikipedia.org/wiki/Инкремент инкремент переменной в постефиксной форме
     
  19. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Re: Как увеличивать значение переменной при каждом обращении

    суть не столько в увеличении числа, а в выводе на экран в этот момент. Используется особенность print всегда возвращать 1 и определение порядка операций с помощью скобок. Echo тут не сгодится.
     
  21. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Re: Как увеличивать значение переменной при каждом обращении

    да как бы там ни было, есть задача, есть ее решение )
     
  22. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Не оч красиво с echo.
    Код (PHP):
    1. file_put_contents('file.txt', ($a=file_get_contents('file.txt')) + 1);
    2. echo $a; 
    ну хотя смотря где ниже надо выводить это и в скольких местах =)
     
  23. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
  24. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Мужик.. Бери и не смотри никуда больше...
    Код (PHP):
    1. $fl = "file.txt";
    2. $a = file_get_contents($fl);
    3. $a++;
    4. $fp = fopen($fl,"w+");
    5. $fw = fwrite($fp,$a);
    6. fclose($fp); 
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Re: Как увеличивать значение переменной при каждом обращении

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