![]() |
Не работает гостевая
Вот такая вот проблема. На РНР написана гостевая. Так как на хостинге баз данных нет, то сохранение идет в тхт-файл и оттуда считывается. На виртуальном сервере работает нормально. Выкладываю в инет, в гостевую успешно добавляются только первых два сообщения, дальше сообщения не добавляются и в тхт-файл не записываются. При стирании этих двух сообщений и начинании сначала, опять добавляется только два сообщения. В чем может быть проблема? Я понимаю, что вопрос слишком абстрактный, но все же....хотя бы понять...это ошибка в моем коде или что-то у провайдера. Хотя, теоретически....если у меня на компе все работает, то, значит, ошибки не должно быть. Ломаю голову.... :молись:
|
Код в студию
|
Н-дя.....теперь бы еще разобраться в своей писанине )))
<?php if(isset($x)) { if(empty($n1)) { echo 'не введено имя пользователя<br>'; $x=0; } if(empty($n3)) { echo 'не заполнено поле текст сообщения<br>'; $x=0; } else { if(strlen($n3)>2000) { echo 'слишком длинное сообщение<br>'; $x=0; } } if ($x!=0) { $n3=htmlspecialchars($n3); $fk=fopen('guest1.txt','r'); clearstatcache(); $s=fread($fk,filesize('guest1.txt')); $fk=fclose($fk); if(strrpos($s,$n3)>0) { $x=0; } } } else { $x=0; } if($x==1) { if(filesize('guest1.txt')>1) { $z='&#&'; } else { $z=''; } $d=date("H:i d/m/Y"); $fk=fopen('guest1.txt','a'); $c=$z.'<tr><td><hr><font color="#CD1E6B"><strong>Дата: '.$d.'</font></strong></td></tr>'.'<tr><td>'. '<font color="#CD1E6B"><strong>Имя: </font></strong>'.$n1.'</td></tr> <tr><td><font color="#CD1E6B"><strong>E-mail: </font></strong>'.'<a href="mailto:'.$n6.'">' .'<strong><font color="#6666CC">'.$n6.'</font></strong></a>'.'<font color="#CD1E6B"><strong> Домашняя страничка: </font></strong>'.'<a href="'.$n8.'" target="_new"><strong><font color="#6666CC">'.$n8.'</font></strong></a></td></tr><tr><td>' .'<font color="#CD1E6B"><strong>Страна: </font></strong>'.$n2.', <strong><font color="#CD1E6B">Город: </font></strong>'.$n7.'</strong><p></p></td></tr><tr><td>' .$n3.' </td></tr>'."\r\n"; fwrite($fk,$c); fclose($fk); } $fk=fopen('guest1.txt','r'); clearstatcache(); $s=fread($fk,filesize('guest1.txt')); $a=explode('&#&',$s); $a=array_reverse($a); fclose($fk); /* расчет левых и правых границ вывода сообщений */ $cp=intval(count($a)/10); if($cp*10<count($a)) { $cp+=1; } function pocazat($cp,$tp) { echo 'Страницы: '; for($ii=1;$ii<=$cp;$ii+=1) { if ($ii==$tp) { echo '<a href="gost.php?p='.$ii.'"><strong><font color="##6666CC"><<'.$ii.'>></font></strong></a> '; } else { echo '<a href="gost.php?p='.$ii.'"><strong><font color="#6666CC">'.$ii.'</font></strong></a> '; } } } if(!isset($h)) { $h=1; } pocazat($cp,$h); $l=($h-1)*10; $r=$l+9; if($r>=count($a)) { $r=count($a)-1; } echo '<table width="100%" border="0">'; echo '<tr><td><img src="pol1.jpg" width="100%"></td></tr>'; for($i=$l;$i<=$r;$i++) { echo $a[$i]; } echo '<tr><td><hr><img src="pol1.jpg" width="100%"></td></tr></table>'; pocazat($cp,$h); ?> <form action="gost.php?x=1" method="post"> <table width="100%" border="0"> <tr><td width="17%"><strong>Ваше имя<span class="style1">*</span></strong></td> <td width="83%"><input name="n1" type="text" size="50"></td></tr> <tr><td><strong>E-mail</strong></td><td><input name="n6" type="text" size="50"></td></tr> <tr><td><strong>Страна</strong></td><td><input name="n2" type="text" size="50"></td></tr> <tr><td><strong>Город</strong></td><td><input name="n7" type="text" size="50"></td></tr> <tr><td><strong>Домашняя страничка</strong></td><td><input name="n8" type="text" value="http://" size="50"></td></tr> <tr><td height="125" valign="top"><strong>Текст сообщения <span class="style1">*</span></strong></td><td> <textarea name="n3" cols="50" rows="8"></textarea><br> </td></tr> <tr><td></td><td><input name="n4" type="submit" value="Отправить"> <input name="n5" type="reset" value="Очистить"> </td></tr> </table> </form> <strong>Поля, помеченные знаком <span class="style1">*</span>, обязательны для заполнения.</strong> |
У меня работает. Поэтому сложно искать ошибку которой нет. Включи вывод всех ошибок (error_reporting=E_ALL, display_errors=On), также выставь echo везде, где идёт присвоение "$x=0", возможно запись в файл даже не инициируется.
|
А у тебя работает на компе? Или ты в инет выкладывал?
А в файл первые два сообщения записываются. А вот дальше...... А на компе хоть триста запиши....все записываются.....вот я и не понимаю.... |
Цитата:
|
Значит, вопрос на хостинге. Спасибо. Буду связывать с провайдером, т.е. с тем, у кого хостинг куплен....не сильна я в терминологии :)
Потому как я тоже не вижу тут никакой ошибки. Ничего навороченного я ж не написала. |
Стефания,
возможно у тебя закончилось место на аккаунте для хостинга. А для будущего такой совет: надо текстовый файл лочить при доступе к нему. Представь, что если у тебя несколько процессов будут пытаться записать в файл, а другие прочитать? :biggrin: Так что надо использовать фунцию flock(), хотя при большой посещаемости и это не всегда помогает. _http://php.rinet.ru/manual/ru/function.flock.php - мануал про flock() |
Kvarx
Нет, места там еще дофига и трошки :biggrin: так что проблема не в этом. Если будет большая посещаемость, я все-таки обзаведусь базами данных ))) А пока пусть будет в текстовом файле. Сегодня еще прикольнее....я могу добавить только одно сообщение. Написала хостинг-провайдеру (так я его обозвала?), сказали, будут смотреть. кстати, а если прописать while(!($fp=fopen('guest1.txt','a'))); вместо $fp=fopen('guest1.txt','a'); это что-нибудь даст для оптимизации обращения к текстовому файлу? |
Цитата:
Код:
if (!$fp) |
Цитата:
Только конечно не в таком виде делать цикл - надо же хоть проверять почему файл не может быть открыт (а вдруг просто нету прав на его открытие?) тогда может быть просто бесконечный цикл (ну до таймаута максимального времени выполнения ПХП-скрипта) |
Цитата:
Я только учусь :) |
вообще, в этом случае надо было бы запись в файл вынести в отдельный класс, запросы на запись ставить в очередь этого класса - а писать на диск уже в самом классе
тогда отпадет головная боль с многопоточным программированием вот только не уверен, есть ли возможность в РНР создать singleton... :confused: |
Что самое интересное....от хостинг-провайдера тишина.....а написала им еще в пятницу.....точнее в четверг....в пяницу они мне прислали ответ, что мол напишите как называется файл гостевой и тхт-шный файл куда должны записываться сообщения. Я им ответила и......тишина. В нашей стране в праздники никто не работает :biggrin: ладно, подожду завтра. Ну мне интересно же.
Ладненько, давайте пока про запись в файл поговорим. Вот тут спросили зачем while.....а затем, чтоб если одновременно несколько человек обращаются к файлу, то чел все-таки дождался своей очереди. Так как лучше сделать, чтоб, например, десять человек сидят на гостевой и общаются. Мне нужно их как-то выстроить в очередь чтоли.....или просто написать, что пока один не закончит, другой становился бы в очередь. Чем не подходит while? Мне кажется, что это самое то :) |
Примеров много тут для подобного, в пользовательских комментариях, от функций, до классов:
http://ru.php.net/manual/ru/function.flock.php Цитата:
В МАНе рекомендуют использовать для этого и пущей надежности файл-флаг: Цитата:
|
Получила сегодня ответ от хостинг-провайдера....."Такой файл существует, htdocs/guest1.txt, права 644. Так что проблем с записью в него быть не должно. Если никаких ошибок PHP не выдает при открытии файлового дескриптора, то проблема где-то в коде этой гостевой книги." Просто замечательно :biggrin:
Что делать? :молись: |
Цитата:
Цитата:
|
Стефания, пара наводящих вопросов...
- проблема возникает, когда ты одна работаешь, или при параллельной работе нескольких человек? - всегда ли повторяется ситуация одинаково? или бывает по-разному? - не обращала внимания - атрибуты файла не меняются? вдруг у тебя после двух сообщений он почему-то RO становится... :) - можно линк на гостевую (+включенные все ошибки)? |
BorLase
-Проблема возникает не зависимо ни от чего, т.е. постоянно. -в первый день у меня давало записать два сообщения, сейчас - только одно -этот вопрос не совсем поняла, что такое RO? -линк могу дать (лучше в личку тебе его скину, не хочу чтоб пока кто-то смотрел мой сайт), но как включить все ошибки я не знаю. А при отправке сообщения, ошибки не выдает. Просто как будто сообщение отправляется, но на экране не показывается и в тхт-файл не записывается. (я просто ну совсем начинающий писатель сайтов :) ) Ссылку смотри у себя в личном ящике. |
в начале своего скрипта пишешь error_reporting(E_ALL); - это ты включаешь полный отчет об ошибках
какого размера получается твой файл? нет ли на сайте лимита на размер файла (вопрос не о свободном месте, а именно о размере единичного файла)? RO - read only - только для чтения... вряд ли, конечно... но вдруг операция записи меняет атрибуты/владельца файла так, что последующая запись становится невозможной... о! а попробуй так - первое сообщение писать в текст1.тхт, второе - в текст2.тхт и тд - так отработает? будем думать дальше... :) |
Цитата:
Цитата:
Цитата:
|
Цитата:
у тебя там есть строка $d=date("H:i d/m/Y"); вот и пиши файл текстЧЧММСС.тхт - какая разница... главное, чтобы файлы разные были вообще, очень странная ситуевина, скажем прямо... :idontnow: |
Цитата:
|
А теперь нужен такой хелп, strstr проверяет ВСЕ сообщения, которые есть на данный меент в гостевой и если такое уже есть, то оно его не выводит и не записывает. Как сделать, чтоб проверка была только на последнее сообщение, т.е. сообщение отправленное до этого? Т.е. смысл в том, чтоб не было повторной отправки одного и того же сообщения.
|
Стефания, сделай проще ;)
заведи два файла - полная гостевая и последнее сообщение. т.е. алгоритм такой 1) сравниваем пс.тхт и сообщение 2) если отличаются, добавляем в гост.тхт сообщение и перезаписываем пс.тхт 3) иначе, игнорируем как флуд и ничего не делаем т.е. смысл в том, чтоб не выискивать, где у нас там последняя запись в гостевой, а держать ее (точнее, копию, т.к. она в полном тексте тоже пусть будет) отдельно - именно для сравнений |
BorLase
Интересная мысль. Спасибо. Попробую реализовать :) Т.е. веденное сообщение должно записываться в два файла, потом при отправке следующего сообщения должно проверить на наличие такого же в том файле, куда записывается последнее сообщение, если оно не такое же, то просто перезаписывает его. Т.е. в одном (основном файле) будет вся гостевая, а во втором только последнее собщение. Так? И еще такой вопросик: чем различаются функции strrpos и strstr? Я так понимаю, что первая проверяет все сообщение, а вторая только строчку. Или не так? |
BorLase
Спасибо, у меня получилось! :yees: Так а можно все-таки узнать в чем разница между strrpos и strstr? Не....наврала я...опять та же ситуевина....у меня на серваке все работает, а на сайте работать не хочет :ржать: |
Цитата:
Цитата:
|
Цитата:
|
Похоже, без примера не обойтись:)
Нумерация символов в строках в PHP происходит с 0 (т.е. номера символов в строке 'abc': a - нулевой символ, b - первый символ, c - второй). Пример со strrpos и strpos: PHP код:
|
Часовой пояс GMT +4, время: 17:31. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.