Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2012, 16:24   #1
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию Странное поседение скрипта

Написал простенький скрипт.
Скрипт должен считывать из файла вещественное число, декрементировать его и снова записывать в файл.
Всё работает, но когда значение доходит до xxx.1.
Например 200.1, 199.1 и т.д. декремент не выполняется.
Ума не приложу, в чём проблема.
Код:
<HTML>
<?php
$patch = $_SERVER['DOCUMENT_ROOT'].'/recipes/Russia/date.txt';
$prdate;
$fh = fopen($patch,'r+') or die($php_errormsg);// Открываем файл
rewind($fh); $prdate = trim(file_get_contents($patch));// Читаем с начала файла
if($prdate != 0)$prdate = $prdate - 0.1;// Декрементируем
fwrite($fh,$prdate);// Записываем значение
fclose($fh) or die($php_errormsg);// Закрываем файл
?>
</HTML>
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 15.04.2012 в 19:52.
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.04.2012, 20:46   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

честно говоря не очень ясно использование file_get_contents ... fread чем плох?
PHP код:
$fh fopen($patch,'r+') or die($php_errormsg);// Открываем файл
$prdate trim(file_get_contents($patch));// Читаем с начала файла
if($prdate != 0)$prdate $prdate 0.1;// Декрементируем
rewind($fh); // !!!! в начало перед записью
fwrite($fh,$prdate);// Записываем значение
fclose($fh) or die($php_errormsg);// Закрываем файл 
я думаю так лучше будет.... ну и включить вывод на экран... посмотреть трассировку .. значения переменных чтобы понять где ошибка
ADSoft вне форума Ответить с цитированием
Старый 16.04.2012, 06:53   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
честно говоря не очень ясно использование file_get_contents ... fread чем плох?
И так и так пробовал. Результат не меняется. Скорее всего загвоздка с типами переменных. Ни как не могу поймать эту "загвоздку".
Попробую открыть файл в бинарном режиме.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 16.04.2012, 10:54   #4
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Забавная бага. В винде (Вы ведь в ней тестировали?) есть проблемы с режимами открытия файла. В итоге у Вас получалось вот что
2000.2 (6 байт) => 2000.1 (6 байт)
2000.1 (6 байт) => 2000 (4 байта)
т.е. число нормально уменьшалось, но перезаписывались только первые 4 байта файла, а .1 оставалось на месте

Вот рабочий код (путь к файлу поменял)
Код:
<?php
$patch = $_SERVER['DOCUMENT_ROOT'].'/date.txt';
$fh = fopen($patch,'rt') or die($php_errormsg);// Открываем файл
$prdate = fread($fh, 32);// Читаем с начала файла
var_dump($prdate);
if($prdate != 0) $prdate = $prdate - 0.1;// Декрементируем
var_dump($prdate);
fclose($fh);
$fh = fopen($patch,'wt') or die($php_errormsg);
fwrite($fh,$prdate);// Записываем значение
fclose($fh) or die($php_errormsg);// Закрываем файл
?>
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 16.04.2012, 11:39   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Я тестировал на сервере Агава. PHP 5.1 Apach.
Возможно так оно и есть, как Вы говорите, но тестировал я и с меньшими числами.
Вышел из положения таким образом:

Код:
<?php
static $dat;
$patch = $_SERVER['DOCUMENT_ROOT'].'/date.txt';
$fh = fopen($patch,'r') or die($php_errormsg);// Открываем файл
rewind($fh);// К началу
$dat = fread($fh,100);// Читаем 100 байт
if($dat != 0)$dat1  = ($dat - 0.1);// Проверяем на 0, если не 0 то вычитаем
fclose($fh) or die($php_errormsg);// Закрываем файл
$fh = fopen($patch,'w') or die($php_errormsg);// Открываем файл
fwrite($fh,$dat1);// Записываем значение
fclose($fh) or die($php_errormsg);// Закрываем файл
?>
Почему код не захотел работать с "r+", ума не приложу.
А что означает var_dump?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 16.04.2012 в 11:43.
Smitt&Wesson вне форума Ответить с цитированием
Старый 16.04.2012, 11:52   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

вывод: юзать БД и не париться с файлами )))
ADSoft вне форума Ответить с цитированием
Старый 16.04.2012, 11:53   #7
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Если честно, уже не помню, что там за баги с режимами открытия, давно ничего в файлы не писал, всё в бд Но помню что глюки были. Как минимум в Винде надо писать режим - текстовый или бинарный
А это неважно - меньше больше. Трабла именно в том, что остаётся кусок старого файла, что Вы и обошли, открыв его заново на запись.
var_dump - вывод значения и типа переменной
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 16.04.2012, 12:00   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
вывод: юзать БД и не париться с файлами )))
Вообще-то предполагается рабтать с БД, но это тестовая заглушка для отладки обращения к скрипту из программы на Борланде.
Дело в том, что хост, на котором висит мой сайт, не позволяет обращаться к БД напрямую, только через PHP-скрипт. Поэтому сокеты тут не катят.

В идеале это будет работать так.
Программа на Борланде обращается к скрипту на сервере через виртуальный CppWebBrowser.
В запросе передаются логин и пароль пользователя (известные программе).
Скрипт ищет этого пользователя в базе данных и если он зарегистрирован и у него не нулевой баланс, формирует файл с суммой баланса. Соответственно производит действия с базой данных.
Для каждого пользователя с ненулевым балансом формируется свой файл, с уникальным именем (по логину).
Поскольку логин известен и программе, она этот файл считывает и отображает текущий баланс (ну и делает всё, что с ним связано).
Вот, примерно так.

Может кто знает способ получше? Буду рад, если подскажете.
Цитата:
Сообщение от Greblin Посмотреть сообщение
var_dump - вывод значения и типа переменной
Спасибо за пояснение. PHP занимаюсь не так долго (около полугода). Не всё ещё ясно.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 16.04.2012 в 12:22.
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное отоброжение MaRKer.nsk HTML и CSS 1 31.03.2012 18:00
Странное поведение gets alex_alpha Общие вопросы C/C++ 3 27.03.2010 18:21
Странное решение Syltan Общие вопросы C/C++ 9 01.09.2009 21:01
Че-то странное .... ~Brilliant~ Безопасность, Шифрование 9 27.04.2009 13:57
Странное закрытие joker Win Api 18 29.03.2008 07:45