IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   Не работает гостевая (http://www.imho.ws/showthread.php?t=103342)

Стефания 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

Цитата:

Сообщение от RaZEr
Включи вывод всех ошибок (error_reporting=E_ALL, display_errors=On).

А куда это прописать в моем коде?

Цитата:

Сообщение от RaZEr
И на компе работает, и если выкладывать.

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

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 код:

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

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



Часовой пояс GMT +4, время: 17:31.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.