Strict Standards: Resource ID#33 used as offset, casting to integer (33) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#35 used as offset, casting to integer (35) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#36 used as offset, casting to integer (36) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: Чтение из файла всех строк
ТвойWeb » WebMaster класс » PHP/Perl » Чтение из файла всех строк

Страниц (1): [1]
 

1. Alone - 22 Апреля, 2007 - 10:31:03 - перейти к сообщению
Что-то не получается читать все строки в файле.
Ситуация такая:

Вот я записываю в файл строки с инфой:

CODE:
$text="$text|$name|$email|$date|$time|$today|";
$date=date("d.m.Y");
$time=date("H:i:s");
$today=mktime();

$file = fopen ("file.dat","a");
flock ($file,LOCK_EX);

fwrite ($file, "$text\r\n");

fflush ($file);
flock ($file,LOCK_UN);
fclose ($file);


В результате в файле file.dat появляются типа такие строки:

CODE:
бла-бла-бла|Николай|nik@mail.ru|20:12:34|35435435|
бла-бла-бла|Олег|nik@mail.ru|20:12:34|35435435|
бла-бла-бла|Лена|nik@mail.ru|20:12:34|35435435|
бла-бла-бла|Света|nik@mail.ru|20:12:34|35435435|
бла-бла-бла|Катя|nik@mail.ru|20:12:34|35435435|


Дальше я хочу чтобы если постят "бла-бла-бла|Николай|" - то выдавалось сообщение о том, что такая запись уже есть.

Я делаю следующее:

CODE:
$lines=file("file.dat");

$i=count($lines)-1;

$dtf=explode("|",$lines[$i]);
$txtback="$dtf[0]|$dtf[1]|";

$dtb=explode("|",$text);
$txtflud="$dtb[0]|$dtb[1]|";

if (($lastmsg+9)>$today)

if ($txtflud==$txtback)
echo "Кончай флудить!!!";


В этом случае читает только самую нижнюю сторку и сравнение идёт только с нею. А мне нужно чтобы сравение шло со всеми строками файла "file.dat". Пробовал делать через так: "for($i=0;$i<count($file);$i++)" но что-то не получается...

Блин, как сделать чтобы сравнение шло по всем сторкам?
2. awep - 24 Апреля, 2007 - 14:48:56 - перейти к сообщению
объясняю на словах:
1.хранишь данные как в exbb - в сериализованном виде.
2.когда идет проверка данных для записи, пробегаешь циклом по массиву и смотришь, есть ли совпадения.

аналогичный механизм реализован в процессе регистрации юзера в форуме ExBB.

Если не знаешь как сделать, скажи - поможем.
3. Alone - 24 Апреля, 2007 - 16:33:17 - перейти к сообщению
Да блин, мне просто надо чтобы скрипт видел не одну строчку (последнюю) а все.

В ExBB - там по другому.
4. Ray Wen - 25 Апреля, 2007 - 01:41:01 - перейти к сообщению
Alone
Ну а ты сам посмотри что ты делаешь...

CODE:
$i=count($lines)-1;

Равен последнему элементу в массиве, его-то ты и просматриваешь...

CODE:
for($i=0;$i<count($lines);$i++)
5. Alone - 25 Апреля, 2007 - 02:08:04 - перейти к сообщению
Потому и просматриваю что по другому не работает.
6. Ray Wen - 25 Апреля, 2007 - 03:30:32 - перейти к сообщению
Alone
Ну так циклом просматривай... Улыбка Не работать может только если что-то не так делаешь... в этом можешь быть на 100% уверен...
7. Alone - 25 Апреля, 2007 - 04:08:27 - перейти к сообщению
Ну вот я дел так:
CODE:
$lines=file("file.dat");

for($i=0;$i<count($lines);$i++)
{
$dtf=explode("|",$lines[$i]);
$txtback="$dtf[0]|$dtf[1]|";

$dtb=explode("|",$text);
$txtflud="$dtb[0]|$dtb[1]|";

if ($txtflud==$txtback)
echo "Кончай флудить!!!";
}

Вот этого не происходит:
CODE:
if ($txtflud==$txtback)
echo "Кончай флудить!!!";


Т.е. не понятно где он вообще смотрит...
8. awep - 25 Апреля, 2007 - 13:13:03 - перейти к сообщению
просто для самоудовлетворения написал аналог твоего скриптика:
CODE:
$text='бла-бла-бла|Николай|nik@mail.ru|20:12:34|35435435|';#это то, что поступает для записи в файл
#Заменяй строчкой из твоего скрипта

$lines=file('text.dat');#меняй имя файла на какой тебе нада
$lines_cnt=count($lines);

$texts=explode('|',$text,6);
$bad_text=$texts[0].'|'.$texts[1];
for($i=0; $i<($lines_cnt-1); $i++){
$dtf=explode('|',$lines[$i],6);
$i_have=$dtf[0].'|'.$dtf[1];
if($i_have==$bad_text){
die('dont floood!');
break;
}
}
echo 'если видишь эту надпись, значит не флудят';
этот скрипт работает. проверил.
У тебя может что-то не работать из-за проверки данных. То есть, возможно, в файле у тебя записаны проверенные и отформатированные данные, а ты их пытаешься сравнить с "сырыми"
9. Alone - 25 Апреля, 2007 - 14:04:21 - перейти к сообщению
awep

Уф... всё сенкс, заработало, а то голова уже чуть не сломалась Улыбка

awep пишет:
У тебя может что-то не работать из-за проверки данных.


Да, не... всё проверял нормально.

Вот при этом решении стало работать:
CODE:
for($i=0; $i<($lines_cnt-1); $i++)

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0312]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33