PDA

Просмотр полной версии : Не работает гостевая


Стефания
05.05.2006, 21:36
Вот такая вот проблема. На РНР написана гостевая. Так как на хостинге баз данных нет, то сохранение идет в тхт-файл и оттуда считывается. На виртуальном сервере работает нормально. Выкладываю в инет, в гостевую успешно добавляются только первых два сообщения, дальше сообщения не добавляются и в тхт-файл не записываются. При стирании этих двух сообщений и начинании сначала, опять добавляется только два сообщения. В чем может быть проблема? Я понимаю, что вопрос слишком абстрактный, но все же....хотя бы понять...это ошибка в моем коде или что-то у провайдера. Хотя, теоретически....если у меня на компе все работает, то, значит, ошибки не должно быть. Ломаю голову.... :молись:

RaZEr
05.05.2006, 21:45
Код в студию

Стефания
05.05.2006, 21:54
Н-дя.....теперь бы еще разобраться в своей писанине )))
<?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.'&nbsp;</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">&lt;&lt;'.$ii.'&gt;&gt;</font></strong></a>&nbsp;';
}
else {
echo '<a href="gost.php?p='.$ii.'"><strong><font color="#6666CC">'.$ii.'</font></strong></a>&nbsp;&nbsp;'; }
}
}
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="Отправить">&nbsp;&nbsp;&nbsp;
<input name="n5" type="reset" value="Очистить"> </td></tr>
</table>
</form>
<strong>Поля, помеченные знаком <span class="style1">*</span>, обязательны для заполнения.</strong>

RaZEr
05.05.2006, 22:12
У меня работает. Поэтому сложно искать ошибку которой нет. Включи вывод всех ошибок (error_reporting=E_ALL, display_errors=On), также выставь echo везде, где идёт присвоение "$x=0", возможно запись в файл даже не инициируется.

Стефания
05.05.2006, 22:17
А у тебя работает на компе? Или ты в инет выкладывал?
А в файл первые два сообщения записываются. А вот дальше......
А на компе хоть триста запиши....все записываются.....вот я и не понимаю....

RaZEr
05.05.2006, 22:24
А у тебя работает на компе? Или ты в инет выкладывал?И на компе работает, и если выкладывать.

Стефания
05.05.2006, 22:26
Значит, вопрос на хостинге. Спасибо. Буду связывать с провайдером, т.е. с тем, у кого хостинг куплен....не сильна я в терминологии :)
Потому как я тоже не вижу тут никакой ошибки. Ничего навороченного я ж не написала.

Kvarx
06.05.2006, 16:18
Стефания,
возможно у тебя закончилось место на аккаунте для хостинга.

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

Так что надо использовать фунцию flock(), хотя при большой посещаемости и это не всегда помогает.
_http://php.rinet.ru/manual/ru/function.flock.php - мануал про flock()

Стефания
06.05.2006, 20:47
Kvarx
Нет, места там еще дофига и трошки :biggrin: так что проблема не в этом.
Если будет большая посещаемость, я все-таки обзаведусь базами данных ))) А пока пусть будет в текстовом файле. Сегодня еще прикольнее....я могу добавить только одно сообщение. Написала хостинг-провайдеру (так я его обозвала?), сказали, будут смотреть.

кстати, а если прописать while(!($fp=fopen('guest1.txt','a'))); вместо $fp=fopen('guest1.txt','a'); это что-нибудь даст для оптимизации обращения к текстовому файлу?

Псих
08.05.2006, 13:37
Стефания:
кстати, а если прописать while(!($fp=fopen('guest1.txt','a'))); вместо $fp=fopen('guest1.txt','a'); это что-нибудь даст для оптимизации обращения к текстовому файлу?
если я есть нормальный, то не даст, лучше написать

if (!$fp)
$fp=fopen('guest1.txt','a')

А смысл цикл тут делать вообще не понятен

Hubbitus
09.05.2006, 17:47
Псих:
А смысл цикл тут делать вообще не понятен
Смысл цикл тут делать - ожидание момента, пока файл наконец сможет быть открыт. Например в случае блокировки другим процессом, банальное ожидание, пока он освободит файл.

Только конечно не в таком виде делать цикл - надо же хоть проверять почему файл не может быть открыт (а вдруг просто нету прав на его открытие?) тогда может быть просто бесконечный цикл (ну до таймаута максимального времени выполнения ПХП-скрипта)

Стефания
09.05.2006, 18:33
Hubbitus:
Только конечно не в таком виде делать цикл - надо же хоть проверять почему файл не может быть открыт
А можно с примером?
Я только учусь :)

BorLase
09.05.2006, 20:48
вообще, в этом случае надо было бы запись в файл вынести в отдельный класс, запросы на запись ставить в очередь этого класса - а писать на диск уже в самом классе

тогда отпадет головная боль с многопоточным программированием

вот только не уверен, есть ли возможность в РНР создать singleton... :confused:

Стефания
09.05.2006, 21:01
Что самое интересное....от хостинг-провайдера тишина.....а написала им еще в пятницу.....точнее в четверг....в пяницу они мне прислали ответ, что мол напишите как называется файл гостевой и тхт-шный файл куда должны записываться сообщения. Я им ответила и......тишина. В нашей стране в праздники никто не работает :biggrin: ладно, подожду завтра. Ну мне интересно же.
Ладненько, давайте пока про запись в файл поговорим. Вот тут спросили зачем while.....а затем, чтоб если одновременно несколько человек обращаются к файлу, то чел все-таки дождался своей очереди. Так как лучше сделать, чтоб, например, десять человек сидят на гостевой и общаются. Мне нужно их как-то выстроить в очередь чтоли.....или просто написать, что пока один не закончит, другой становился бы в очередь. Чем не подходит while? Мне кажется, что это самое то :)

Hubbitus
10.05.2006, 10:14
Примеров много тут для подобного, в пользовательских комментариях, от функций, до классов:
http://ru.php.net/manual/ru/function.flock.php

Стефания:
Мне нужно их как-то выстроить в очередь чтоли.....или просто написать, что пока один не закончит, другой становился бы в очередь. Чем не подходит while? Мне кажется, что это самое то :)
А кто сказал что он не подходит? Подходит впринципе, только не совсем как приведено было в примере выше. Просто если на открытие делать цикл, то он скорее всего будет бесполезным - файл будет сразу из разных мест просто открываться и данные будут портиться.

В МАНе рекомендуют использовать для этого и пущей надежности файл-флаг:
MAN:
Замечание: Из-за того, что функции flock() необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать путём открытыя его в режиме записи (используя "w" или "w+" в качестве аргумента функции fopen()).
....
В некоторых операционных системах flock() реализован на уровне процессов. При использовании многопоточных серверных API, таких как ISAPI, вы не можете полагаться на flock() для защиты ваших файлов от дугих PHP-скриптов, которые работают в параллельном потоке на том же сервере!

Стефания
10.05.2006, 19:08
Получила сегодня ответ от хостинг-провайдера....."Такой файл существует, htdocs/guest1.txt, права 644. Так что проблем с записью в него быть не должно. Если никаких ошибок PHP не выдает при открытии файлового дескриптора, то проблема где-то в коде этой гостевой книги." Просто замечательно :biggrin:
Что делать? :молись:

Стефания
10.05.2006, 23:47
Включи вывод всех ошибок (error_reporting=E_ALL, display_errors=On).А куда это прописать в моем коде?

И на компе работает, и если выкладывать.Кстати, я выложила на другой хостинг....тоже не работает :(

BorLase
11.05.2006, 00:15
Стефания, пара наводящих вопросов...
- проблема возникает, когда ты одна работаешь, или при параллельной работе нескольких человек?
- всегда ли повторяется ситуация одинаково? или бывает по-разному?
- не обращала внимания - атрибуты файла не меняются? вдруг у тебя после двух сообщений он почему-то RO становится... :)
- можно линк на гостевую (+включенные все ошибки)?

Стефания
11.05.2006, 00:25
BorLase
-Проблема возникает не зависимо ни от чего, т.е. постоянно.
-в первый день у меня давало записать два сообщения, сейчас - только одно
-этот вопрос не совсем поняла, что такое RO?
-линк могу дать (лучше в личку тебе его скину, не хочу чтоб пока кто-то смотрел мой сайт), но как включить все ошибки я не знаю. А при отправке сообщения, ошибки не выдает. Просто как будто сообщение отправляется, но на экране не показывается и в тхт-файл не записывается. (я просто ну совсем начинающий писатель сайтов :) )
Ссылку смотри у себя в личном ящике.

BorLase
11.05.2006, 00:48
в начале своего скрипта пишешь error_reporting(E_ALL); - это ты включаешь полный отчет об ошибках

какого размера получается твой файл? нет ли на сайте лимита на размер файла (вопрос не о свободном месте, а именно о размере единичного файла)?
RO - read only - только для чтения... вряд ли, конечно... но вдруг операция записи меняет атрибуты/владельца файла так, что последующая запись становится невозможной...

о! а попробуй так - первое сообщение писать в текст1.тхт, второе - в текст2.тхт и тд - так отработает?

будем думать дальше... :)

Стефания
11.05.2006, 01:05
BorLase:
какого размера получается твой файл? нет ли на сайте лимита на размер файла (вопрос не о свободном месте, а именно о размере единичного файла)?
Одно сообщение где-то 600, так что размер файла маленький, ограничений на размер единичного файла, думаю, нет. BorLase:
RO - read only - только для чтения... вряд ли, конечно... но вдруг операция записи меняет атрибуты/владельца файла так, что последующая запись становится невозможной...
Посмотрела, стоит "Архивный".BorLase:
о! а попробуй так - первое сообщение писать в текст1.тхт, второе - в текст2.тхт и тд - так отработает?

будем думать дальше... Ок, завтра попробую :) Тогда вопрос: мне в скрипте прописать, чтоб на каждое сообщение создавался отдельный файл или просто после каждого сообщения в скрипте менять сохраняемый файл? (второе для меня проще :) ).

BorLase
11.05.2006, 11:07
Тогда вопрос: мне в скрипте прописать, чтоб на каждое сообщение создавался отдельный файл или просто после каждого сообщения в скрипте менять сохраняемый файл? (второе для меня проще :) ).
не обязательно по номеру...

у тебя там есть строка
$d=date("H:i d/m/Y");

вот и пиши файл текстЧЧММСС.тхт - какая разница... главное, чтобы файлы разные были

вообще, очень странная ситуевина, скажем прямо... :idontnow:

Стефания
12.05.2006, 00:42
BorLase:
вообще, очень странная ситуевина, скажем прямо...
Вроде разобралась, ошибка была при проверке strrpos. Завтра проверю еще раз.....так сказать, на свежую голову. Почему-то оно все последующие сообщения считало идентичными первому и не записывало их.

Стефания
13.05.2006, 20:47
А теперь нужен такой хелп, strstr проверяет ВСЕ сообщения, которые есть на данный меент в гостевой и если такое уже есть, то оно его не выводит и не записывает. Как сделать, чтоб проверка была только на последнее сообщение, т.е. сообщение отправленное до этого? Т.е. смысл в том, чтоб не было повторной отправки одного и того же сообщения.

BorLase
13.05.2006, 20:54
Стефания, сделай проще ;)

заведи два файла - полная гостевая и последнее сообщение. т.е. алгоритм такой

1) сравниваем пс.тхт и сообщение
2) если отличаются, добавляем в гост.тхт сообщение и перезаписываем пс.тхт
3) иначе, игнорируем как флуд и ничего не делаем

т.е. смысл в том, чтоб не выискивать, где у нас там последняя запись в гостевой, а держать ее (точнее, копию, т.к. она в полном тексте тоже пусть будет) отдельно - именно для сравнений

Стефания
13.05.2006, 21:57
BorLase
Интересная мысль. Спасибо. Попробую реализовать :)
Т.е. веденное сообщение должно записываться в два файла, потом при отправке следующего сообщения должно проверить на наличие такого же в том файле, куда записывается последнее сообщение, если оно не такое же, то просто перезаписывает его. Т.е. в одном (основном файле) будет вся гостевая, а во втором только последнее собщение. Так?

И еще такой вопросик: чем различаются функции strrpos и strstr? Я так понимаю, что первая проверяет все сообщение, а вторая только строчку. Или не так?

Стефания
15.05.2006, 00:01
BorLase
Спасибо, у меня получилось! :yees:
Так а можно все-таки узнать в чем разница между strrpos и strstr?

Не....наврала я...опять та же ситуевина....у меня на серваке все работает, а на сайте работать не хочет :ржать:

Hubbitus
15.05.2006, 10:45
Стефания:
И еще такой вопросик: чем различаются функции strrpos и strstr? Я так понимаю, что первая проверяет все сообщение, а вторая только строчку. Или не так?
Цитируем МАН :cool: :
strrpos -- Возвращает позицию последнего вхождения символа
strstr -- Находит первое вхождение подстроки

Стефания
17.05.2006, 20:33
Hubbitus:
strrpos -- Возвращает позицию последнего вхождения символа
strstr -- Находит первое вхождение подстроки
А можно.... тоже самое....тока на понятном для девушки языке? :rolleyes:

Al-x
17.05.2006, 20:41
Похоже, без примера не обойтись:)
Нумерация символов в строках в PHP происходит с 0 (т.е. номера символов в строке 'abc': a - нулевой символ, b - первый символ, c - второй).
Пример со strrpos и strpos:

<?php
$mystring = 'abcba';//строка в которой ищем
$findme = 'b'; //символ, который ищем
$pos = strstr($mystring, $findme);
echo $pos;
//будет выведен bcba, так как поиск символа ведётся с начала строки - находим b и выводим всё до конца строки

$pos = strrpos($mystring, $findme);
echo $pos;
//будет выведено число 4, так как поиск символа ведётся с конца строки - находим первый нужный символ с конца и выводим его номер
?>