Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к текстовой базе, и поиск заданных данных 
:(
    Опции темы
Alex55
  Дата 18.6.2004, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Здравствуйте !
есть маленький вопросик/задача ;)
-Схема такая sad.gifскрипт поиска) есть форма с двумя полями "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 "<center>";
echo "results pages: [$res] [$stranica]&nbsp;"; //должно показывать количество найденых результатов и текущую страницу.

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></center>"; // также если мы будем переходить на следующую страницу тут могут
} // находится параметры поиска (&city=magadan&country=russia)

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

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

пожулуй это и есть весь маленикий вопрос smile.gif
Буду очень рад каким либо вариациям рабочих примеров .
rolleyes.gif
PM MAIL   Вверх
Akina
Дата 18.6.2004, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 5
Всего: 454



По тексту у тебя не
Цитата
ищет в нём все записи с совпадшими значениями "Country" и "City", и выводит рёзультат на несколько страниц к примеру по 5 результатов на страницу
а совсем даже другое - выводим по странице на каждые 5 записей, причем если запись не соответствует, ее не выводим.
Соответственно тебе нужно перестроить либо алгоритм, либо (что имхо правильнее) перейти на хранение данных в БД (скажем MySQL).



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Alex55
Дата 18.6.2004, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Всё дело в том что это нужно проделывать с именно с файлом т.к базы нет.

Есть примеры/варианты алгоритма. ?

Просто у меня уже голова кипит от этого . Творческое истощение наверно adv/help.gif
PM MAIL   Вверх
Alex55
Дата 18.6.2004, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



ну неужель не кто не подскажет sad.gif
PM MAIL   Вверх
Master
Дата 18.6.2004, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



оч просто... читаеш файл через file() в массив... перебираеш его...
потом если строка найдена, то копируеш эту строчку в массив с результатами и работаеш с этим массивом.


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
Alex55
Дата 18.6.2004, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Если возможно то опиши это пожалуста
в кодовом виде а не в словах
adv/help.gif
PM MAIL   Вверх
Secandr
Дата 18.6.2004, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Код

$file_content=file('1.txt');
foreach ($file_content as $str){
if (strpos($str,'find text')!='')
{
  $out[]=$str;
}
}
//теперь у нас массив $out содержит строки в которых встречается find text
// А как обработать этот массив уже твоя задача

А вывод постранично делаешь не массива $file_content, а массива $out.
Можно при первом поиске запихнуть массив $out в сессию и больше не читать файл.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Alex55
Дата 18.6.2004, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



хм ... ща попробую

какие ещё варианты будут
PM MAIL   Вверх
Master
Дата 18.6.2004, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



а можно сделать и кеш на поиск в основном для постраничной прокрутке... создавая временный файл с определенными параметрами по поиску в основном для страничной прокрутке что бы не нагружать сервер лишний раз и если дата обновления файла меньше прокешированного результата по этим параметрам поиска выводить результат уже от туда smile.gif


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
Secandr
Дата 18.6.2004, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Alex55
Я думаю что наилучший вариант: найти один раз все совпадения и запомнить их в сессии(зачем мучиться создавать файлы если это за тебя сделает пхп). В результате потеряешь время на генерирование первой страницы, но за-то остальные будут работать гораздо быстрее.

Хотя лучший вариант - БД.

P.S. Я взял самое элементарное условие поиска:
Код
(strpos($str,'find text')!='')

делать fgetcsv каждый раз нет смысла для больших файлов, проще проверить есть ли вообще искомая подстрока в строке. Можно ещё искать так:
Код
(strpos(';'.$str.';',';find text;')!='')

А затемуже проверять: какое поле совпало.
Есть смысл сделать "индексное поле", т.е. в первом поле хранить данные которые чаще ищешь, тогда проверка будет:
Код
$a=strpos(';'.$str.';',';find text;');
(($a!='')and($a==0))



--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Akina
Дата 18.6.2004, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 5
Всего: 454



На этом пути тебя ждет непростая задача - при решении "в лоб" тебе придется на каждый переход по страницам читать и парсить весь файл. Если речь идет сотнях записей - это не так страшно, но если это десятки тысяч... имеет смысл подумать о создании сессии и связанного с ней временного файла номеров строк, отобранных первым запросом на поиск.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Secandr
Дата 18.6.2004, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Akina Достаточно зарегистрировать переменную, в моём примере $out, в $_SESSION и потом обращаться к ней.
Хотя если результат поиска будет 100000 строк sad.gif

Alex55 Ещё один момент, всё же лучше не использовать file, а читать через fopen. Если много данных будешь кушать много памяти за зря.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Alex55
Дата 18.6.2004, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



да данных много может 5000 строк может и более.
чтоже всё таки лучше .и быстрее
PM MAIL   Вверх
IZ@TOP
Дата 18.6.2004, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



быстрее работает file. Но имхо памяти жрет немеренно. Правда разница зхаметна на файлах более 5мб.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Master
Дата 18.6.2004, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1530
Регистрация: 13.5.2003
Где: Mother Russia

Репутация: 8
Всего: 10



Цитата(Alex55 @ 18.6.2004, 11:52)
да данных много может 5000 строк может и более.
чтоже всё таки лучше .и быстрее

Использовать MySQL


--------------------
Вавилон, Вавилон
Что ты построил, что разрушил?
Вавилон, Вавилон
Плавятся души дьявольским огнем.
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.