![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Alex55 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.6.2004 Репутация: нет Всего: нет |
Здравствуйте !
есть маленький вопросик/задача ;) -Схема такая пользователь заполняет эти поля нажимает 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] "; //должно показывать количество найденых результатов и текущую страницу. 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 дотех пор пока не дойдёшь до нужной строки с нужним результатом. как сделать чтобы он читал пока не найдёт . дополнительно : как лучше сделать чтобы он читал файл с конца а не с начала ? пожулуй это и есть весь маленикий вопрос Буду очень рад каким либо вариациям рабочих примеров . |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 5 Всего: 454 |
По тексту у тебя не
Соответственно тебе нужно перестроить либо алгоритм, либо (что имхо правильнее) перейти на хранение данных в БД (скажем MySQL). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Alex55 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.6.2004 Репутация: нет Всего: нет |
Всё дело в том что это нужно проделывать с именно с файлом т.к базы нет.
Есть примеры/варианты алгоритма. ? Просто у меня уже голова кипит от этого . Творческое истощение наверно |
|||
|
||||
| Alex55 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.6.2004 Репутация: нет Всего: нет |
ну неужель не кто не подскажет
|
|||
|
||||
| Master |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1530 Регистрация: 13.5.2003 Где: Mother Russia Репутация: 8 Всего: 10 |
оч просто... читаеш файл через file() в массив... перебираеш его...
потом если строка найдена, то копируеш эту строчку в массив с результатами и работаеш с этим массивом. -------------------- Вавилон, Вавилон Что ты построил, что разрушил? Вавилон, Вавилон Плавятся души дьявольским огнем. |
|||
|
||||
| Alex55 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.6.2004 Репутация: нет Всего: нет |
Если возможно то опиши это пожалуста
в кодовом виде а не в словах |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
А вывод постранично делаешь не массива $file_content, а массива $out. Можно при первом поиске запихнуть массив $out в сессию и больше не читать файл. |
|||
|
||||
| Alex55 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.6.2004 Репутация: нет Всего: нет |
хм ... ща попробую
какие ещё варианты будут |
|||
|
||||
| Master |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1530 Регистрация: 13.5.2003 Где: Mother Russia Репутация: 8 Всего: 10 |
а можно сделать и кеш на поиск в основном для постраничной прокрутке... создавая временный файл с определенными параметрами по поиску в основном для страничной прокрутке что бы не нагружать сервер лишний раз и если дата обновления файла меньше прокешированного результата по этим параметрам поиска выводить результат уже от туда
-------------------- Вавилон, Вавилон Что ты построил, что разрушил? Вавилон, Вавилон Плавятся души дьявольским огнем. |
|||
|
||||
| Secandr |
|
||||||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
Alex55
Я думаю что наилучший вариант: найти один раз все совпадения и запомнить их в сессии(зачем мучиться создавать файлы если это за тебя сделает пхп). В результате потеряешь время на генерирование первой страницы, но за-то остальные будут работать гораздо быстрее. Хотя лучший вариант - БД. P.S. Я взял самое элементарное условие поиска:
делать fgetcsv каждый раз нет смысла для больших файлов, проще проверить есть ли вообще искомая подстрока в строке. Можно ещё искать так:
А затемуже проверять: какое поле совпало. Есть смысл сделать "индексное поле", т.е. в первом поле хранить данные которые чаще ищешь, тогда проверка будет:
|
||||||
|
|||||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 5 Всего: 454 |
На этом пути тебя ждет непростая задача - при решении "в лоб" тебе придется на каждый переход по страницам читать и парсить весь файл. Если речь идет сотнях записей - это не так страшно, но если это десятки тысяч... имеет смысл подумать о создании сессии и связанного с ней временного файла номеров строк, отобранных первым запросом на поиск.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
Akina Достаточно зарегистрировать переменную, в моём примере $out, в $_SESSION и потом обращаться к ней.
Хотя если результат поиска будет 100000 строк Alex55 Ещё один момент, всё же лучше не использовать file, а читать через fopen. Если много данных будешь кушать много памяти за зря. |
|||
|
||||
| Alex55 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.6.2004 Репутация: нет Всего: нет |
да данных много может 5000 строк может и более.
чтоже всё таки лучше .и быстрее |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
быстрее работает file. Но имхо памяти жрет немеренно. Правда разница зхаметна на файлах более 5мб.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Master |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1530 Регистрация: 13.5.2003 Где: Mother Russia Репутация: 8 Всего: 10 |
Использовать MySQL -------------------- Вавилон, Вавилон Что ты построил, что разрушил? Вавилон, Вавилон Плавятся души дьявольским огнем. |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |