Чтение текстовой базы

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Ответить
Alex55
Сообщения: 5
Зарегистрирован: 18 июн 2004, 08:37

Здравствуйте !
есть маленький вопросик/задача ;)
-Схема такая :( скрипт поиска) есть форма с двумя полями "Country" и "City" ,
пользователь заполняет эти поля нажимает submit, всё это передётся в скрипт (search.php),
скрипт открывает файл базы(base.txt) и ищет внём все записи с совпадшими значениями "Country" и "City",
и выводит рёзультат на несколько страниц к примеру по 5 результатов на страницу, также должны присутствовать
ссылки типа "next-previous".

-Что есть: есть файл базы "base.txt" формат записей такой :
userid1;number1;country1;city1
userid2;number2;country2;city2
...
userid15;number15;country15;city15

-Проблема: когда скрипт начинает искать он перебирает каждую строку и сравнивает её c передонным значением из
поля "Country" и "City"
тоесть
$h= fopen("base.txt","r");
$data = fgetcsv($h,2000,";");
if ($data[2] == $country and $data[3] == $city)
{
echo "userid:".$data[0];
echo "number:".$data[1];
}
и так по 5 результата на страницу!
примерный скрипт :
//*************cut********
$h = fopen("base.txt","r");
if( isset($_GET['ln']) ) $line = intval($_GET['ln']); // $line - номер линии с которой надо читать
else $line = 0;
for($c=0; $c < $line; $c++)
fgetcsv($h,2000,";");
$number=5; //** Пропускаем 5

for(; $c < $line+$number; $c++)
{
$data = fgetcsv($h,2000,";");
if ($data[2] == $country and $data[3] == $city)
{
echo "userid:".$data[0];
echo "number:".$data[1];
}

}
fclose($h);
$bc=$line-$number; //** Для ссылки previous

echo "
";
echo "results pages: [$res] [$stranica]"; //должно показывать количество найденых результатов и текущую страницу.

if ($line-$number>=0)
{
echo "<a href=testz.php?ln=$bc>previous </a>";
}

if ($res >=$line+1)
{ //$c - это номер линии с которой надо читать дальше.
echo "<a href=testz.php?ln=$c>next </a>
"; // также если мы будем переходить на следующую страницу тут могут
} // находится параметры поиска (&city=magadan&country=russia)

//*************cut********

проблема в том что он читает 5 строк и если он не находит там точто надо он выводит пустую страничку
и ты должен нажимать next дотех пор пока не дойдёшь до нужной строки с нужним результатом.
как сделать чтобы он читал пока не найдёт .
дополнительно : как лучше сделать чтобы он читал файл с конца а не с начала ?

пожулуй это и есть весь маленикий вопрос :)
Буду очень рад каким либо вариациям рабочих примеров .
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Если файл не большой, то я бы загнал ВСЁ в ассоциированный массив, а там - хоть спереди, хоть сзади ...

//----------cut-----------//
$number=0; // Подготавливаем к пропуску
//...
if (($data[2] == $country)&&($data[3] == $city))
{
$number++;
//...
}
//----------cut-----------//

В код не сильно вчитывался, но интуитивно - должно быть что-то такое ...
Alex55
Сообщения: 5
Зарегистрирован: 18 июн 2004, 08:37

да дело втом что файл то большой . так что использовать file() нехочу . да кстати это тоже вариант сначала пощитать а потом уже выводить результат . щас попробую .

PS неужели больше некто незнает как это ожно сделатьь ?
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Alex55, вообще-то я имел ввиду одновременно считать и выводить.

PS Ты думаешь кто-то захочет бесплатно читать твой код? ;-)
Задачу нужно поконкретнее ставить ))
Alex55
Сообщения: 5
Зарегистрирован: 18 июн 2004, 08:37

в таком случае будут выводится все найденые результаты писка в одну страницу ;( а мне надо чтобы на стрваице было по 5 результатов
Alex55
Сообщения: 5
Зарегистрирован: 18 июн 2004, 08:37

я вообще то думал что форум это место где ты можеш задать вопрос на который незнаешь ответ а другие учасники форума помогут .
но не место заработка ;-)
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Код: Выделить всё

<?php
$h = fopen("base.txt","r"); 
if( isset($_GET['ln']) ) $line = intval($_GET['ln']);

for($c=0; $c <= $line; $c++) fgetcsv($h,2000,";"); 

$number=$line;

while(($number<$line+5)&&(!feof($h)))
{ 
  $data = fgetcsv($h,2000,";"); 
  if ($data[2] == $country and $data[3] == $city) 
  { 
    echo "userid:".$data[0]; 
    echo "number:".$data[1]."
\n"; 
    $number++;
  } 
} 
fclose($h); 

if ($line>=5) 
{ 
echo "<a href=index.php?country=country2&city=city2&ln=".($line-5).">previous </a>"; 
} 

if ($number>=($line+5))
{ 
echo " <a href=?country=country2&city=city2&ln=".($line+5).">next </a>"; 
} 

?>
Но это глупость ...
Всё равно ведь записи из файла ДО строки $line+5 читаются ...
А если строка в конце .... Тогда ясно, зачем тебе было чтение с конца ))
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Выход .... считать один раз это всё, а дальше обрабатывать javascriptом, чтобы не перегружать каждый раз страницу (не читать каждый раз файл)....
+я бы загнал ВСЁ в ассоциированный массив
Alex55
Сообщения: 5
Зарегистрирован: 18 июн 2004, 08:37

да кстати вариант неплох. спасибо.
а насчёт "javasкриптом" можно подробнее ?.
только надо расчитывать чтобы это всё быстро и удобно было т.к в файле окола 8000 строк.

...жалко sql нет на хосте.
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Alex55, в целях изучения xml, я обращался к БД лишь один раз, а потом JS-функциями менял представление данных.
Но, посколько xml ещё не достаточно сильно распространён и для просмотра страниц клиенту требуется устанавливать дополнительный софт, то ...
1. Если страница локальная - где можно заставить всех поставить xml-парсер - вперёд и с песней.
2. Если же нет, то можно попробовать реализовать только необходимую функциональность на JS.
Как? :-)
Массивы, циклы -> создание страницы на лету ... На фреймовой структуре было бы просто.
А может и слоями как-то можно.
А может можно и из записей на php генерировать картинки (jpg), а js-ом менять их ;-)
Да мало ли чего можно ))) Было бы желание...

P.S. Потом ногами меня не пинать )) Ибо всё, что я предлагаю - это не стандартные решения и мне просто интересно: а вдруг заработает )))
P.P.S. Но я бы помог ..
Ответить