Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проверка в файле


Автор: alligator 28.1.2004, 00:54
$id=$_GET['id'];
$ip=getenv("REMOTE_ADDR");
$dd="$ip#$id"."\n";
$ids=fopen("id.dat","a+");
fwrite($ids, "$dd");
Народ помогите пожалуйста 3 день с проверкой маюсь =(( thumbs-up.gif
Вопрос вот в чем мне нужно сделать проверку на существование данных в файле ($ip и $id)
что функция сначала проверяла данные а потом записывала в файл но если будет повторный запрос с такого ip и с таким же id тогда уже не записывалось в файл ничего как сделать ааа confused.gif??
Помогите очень нужно !!!

Автор: Skywalker 28.1.2004, 06:46
смотри функцию fseek().
Вообще еще можно так: построчно считываешь файл и в каждой строке смотришь не находиться ли ip & id внутри.
Код

int strpos ( string haystack, string needle [, int offset])
Returns the numeric position of the first occurrence of needle in the haystack string. Unlike the strrpos(), this function can take a full string as the needle parameter and the entire string will be used.

Автор: Skywalker 28.1.2004, 07:29
тебе алгоритм поподробнее рассказать? или написать код?

Автор: Baster 28.1.2004, 14:34
fseek - имхо не есть гут !
просто открой файл блин file(); и потом просто in_array !

Автор: MuToGeN 28.1.2004, 15:20
1) вместо fwrite($ids, "$dd") лучше fwrite($ids, $dd)
2) Baster, это легче, но то, что лучше - не факт.

Автор: alligator 28.1.2004, 18:20
Это все хорошо конечно но я с ПхП работаю можно сказать токо 4 дня и хотелбы лучше увидеть пример кода с комментами если можно! confused.gif

Автор: Baster 28.1.2004, 20:44
Код
<?php
$file = "text.txt";
$data = file($file);
if(in_array($ip,$data) {
   print "This IP exists in this file";
} else {
$fp = fopen($file,"a");
fwrite($ip,$fp);
fclose($file);
}

могут быть ошибки smile.gif писал быстро ....

Автор: Sardar 28.1.2004, 21:15
Вот чуть побольше, но ИМXО "лучше":
Код

$id=$_GET['id'];
//проверим на прокси
if($ip=getenv("HTTP_CLIENT_IP"));
elseif($ip=getenv("HTTP_X_FORWARDED_FOR"));
elseif($ip=getenv("X_REAL_IP"));
elseif($ip=getenv("HTTP_X_FORWARDED"));
elseif($ip=getenv("HTTP_VIA"));
elseif($ip=getenv("HTTP_X_COMING_FROM"));
elseif($ip=getenv("HTTP_COMING_FROM"));
$ip_addr=getenv("REMOTE_ADDR");
if(empty($ip)) $ip=$ip_addr;
/*
else {
$is_ip = ereg('^([0-9]{1,3}\.){3,3}[0-9]{1,3}', $ip, $regs);
if ($is_ip&&(count($regs)<=0)) {} //поле от прокси есть но лажевое
}
*/
$dd=$ip."#".$id;
do {
//никаких функций file() - в виду параллельности выполнения
if(!($ids=fopen("id.dat","r+"))) {trigger_error("Can't open file",E_USER_WARNING); break;}
@flock($ids,LOCK_EX); //в FAT работать не будет
$cont=fread($ids,filesize("id.dat"));
$cont=explode("\n",$cont);
if(!in_array($dd,$cont)) {
 fseek($ids,0,SEEK_END);
 fwrite($ids, $dd."\n");
 }
//else
fclose($ids);
} while(false);

echo "Done: ".$dd;

Автор: Baster 28.1.2004, 22:42
ну ясен пень лучше smile.gif я просто сделал скелет , алгоритм smile.gif

Автор: alligator 28.1.2004, 23:00
Спасибо буду разбираться

Автор: alligator 29.1.2004, 00:24
Решил попробовать поставить что попроще для начала
Код

$p=$_GET['p'];
$ip=getenv("REMOTE_ADDR");
$file = "x.dat";
$data = file($file);
$aa =$ip.":".$p."\n";

if(in_array($aa,$data)){ // Бастер сдесь нехватало скобки =))
print "This data exists in this file";
} else {
$fp=fopen($file,"a+");
fputs($aa, $fp); //пишет что ошибка сдесь
fclose($file); // и сдесь
}

Посмотри мож я где намудрил что хотя вроде все верно

Автор: alligator 29.1.2004, 00:40
Так ошибки вроде поправил !выводит что типа уже существует ip но всё равно продолжает писать в файл $Ip.":".$p =((

Автор: Sardar 29.1.2004, 00:56
Елы палы...
Читаем: http://www.pwp.net/fputs, http://www.php.net/fclose

Я запостил работающий код(для этого специально поднял апача smile.gif), тебе осталось скопировать его как есть и получать результаты. Где непонятно спрашивай(по функциям на www.php.net!). Половина кода это правильное получение IP пользователя, закоментированные участки кода это:
1) предупреждение, что чел. зашел через прокси но с лажевым IP, не понял - игнорируй smile.gif
2) что сделать если IP уже в базе - пока ничего

Ручаюсь что при любой нагрузке скрипт не упадет, знающие люди пусть поправят если что не так.

Автор: alligator 29.1.2004, 01:30
Ошибку с fputs и fclose я поправил!
Что твой скрипт пашет это я уже проверил но мне не нужно определение прокси у меня не человек заходит на сайт а программа передает данные с компа на котором она находиться передает в GET запросе $p=порт открытый ей и $id=уникальный номер проги
все что мне надо чтоб когда она обращаеться при каждом обращении не было дуплей в файле и все и надеюсь что скрипт будет выдерживать большие нагрузки!до примерно 50-70 запросов в сек

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)