Здравствуйте, уважаемые! Подскажите, plz, как возможно организовать постраничный вывод ИЗБРАННЫХ строк из файла. По функциональности аналогично SQL запросу [sql]SELECT name FROM sites WHERE flag=1 LIMIT ".($onpage*$p).",".$onpage[/sql]. Важно чтобы при каждом вызове скрипта не нужно было бы считывать все строки, т.к. файл может достигать больших размеров...
база данных - это средство хранения данных в файлах + инструменты оптимальной обработки. http://ru2.php.net/manual/ru/function.fopen.php для того чтобы добраться до конца файла придется его перебрать.
Хм, не обязательно перебирать все. Использование fseek и freed позволяет считывать только необходимые строки, используя смещения...
Ну, например, считываем $onpage количество строк с условилем, что если строка не подходит, то $onpage++. В результате каждый раз функция перебирает разное кол-во строк, в зависимости от того сколько ненужных строк попалось в конкретной выборке. Проблема в том, что невозможно знать конкретую точку входа при каждом обращении
Придётся считывать LIMIT строк поочерёдно, начиная от OFFSET. И при считывании каждой строки проверять условие. Если подходит, то заносим строку в результирующий массив, иначе читаем дальше. ЗЫ Каким образом данные вобще хранятся в файле?
Да собственно об этом я и говорю. Только вот кол-во строк, считанных за каждую итерацию разное... Данные храняться так: Строка состоит из нескольких полей строго определенной длины; как следствие стоки тоже статичной длины. Каждая строка имеет уникальный инкремент ключ и битовое поле с возможными значениями 0 или 1 (выводить/не выводить).
Дак ещё проще. fseek'ом прыгаем через (длина_строки*номер строки) байт. За одну итерацию прыгаем на одну строку. PHP: $offset = 4; $limit = 3; $strlen = 50; for ($i = $offset; $i < ($offset + $limit); $i++) { // прыгаем через $i*$strlen байт // читаем строку // проверяем её // заносим в общий массив } Если длины строк разные, то в отдельном файле можно хранить длину каждой строки и учитывать это при работе с fseek.
Да, так оно и есть, но...если $page= например, 2,3,4... все равно читать с конца? Хотя, думаю, другого выхода нет...
Я для чего ввёл переменную $offset? Для того, чтобы не читать с начала! Мы прочитаем только $limit*$strlen байт.
Ошибся словом я просто С конца, конечно... Т.е. получиться если нажать последнюю страницу скрипт переберет все строки
Как я понял, $limit это количество строк...Так? И если запросить последнюю страницу скрипт будет с конца перебирать строки, отбирать нужные, пока не считает все и отдаст последние $onpage
У меня кста где-то валялись наброски файловой БД. Тока там было немного всё по другому. Данные в отдельном файле кучей. В отдельном файле имена столбцов и размер каждого ряда. Только вот скорость...
Ну длины полей лучше первой строкой в самом файле указывать. А зарубаться с названиями полей и язык запросов составлять ненужная работа. Еще и парсить потом это...
В файле с данными нет такого понятия, как новая строка для отделения рядов. Сами данные могут содержать переводы строк. Навигация осуществлялась благодаря известным длинам строк. ЗЫ да и PHP давно предоставил нам SQLite.