ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Плоские файлы. Создание, заполнение, чтение, замена и удаление файла

Создание, заполнение, чтение, замена и удаление файла

Операции записи и чтения осуществляются быстрее при работе с файловой системой, по сравнению с иерархической базой данных и, конечно, быстрее, чем при работе с реляционной базой данных. Поэтому там, где нужна скорость(например, в поисковых системах), прибегают к плоским файлам — API(набор функций) к драйверу, обеспечивающему простейшие операции помещения записи в файл и извлечения их. То есть создается подобие примитивной базы данных, обеспечивающей работу с файлами как с набором строк. Зазумеется, в случае плоских файлов не может идти речь о поиске или каких-либо встроенных функциях — для этого предназначены реляционные базы данных, например MySQL, которая будет рассмотрена позднее.

Плоские файлы — это точно такие же файлы, как и рассмотренные нами ранее, но часто в двоичном или упакованном виде, позволяющем быстрее осуществлять операции извлечения, удаления и редактирования записей при помощи стандартного набора функций, избавляя программиста от забот о создании собственных библиотек для работы с текстовыми файлами. В состав РНР входит большое число расширений, позволяющих работать с различными видами плоских файлов и разновидностей баз данных Berkeley. Стандартным в настоящий момент считается доступ через расширение dba-функций(Database Abstraction Layer) — единый интерфейс к такого рода файлам.

Примечание. Для подключения расширения dba, которое, как и все остальные расширения, по умолчанию отключено, следует снять комментарий с директивы extension=php_dba.dll в конфигурационном файле php.ini.

Создание файла

Для открытия и создания плоского файла предназначена функция dba_open(), которая имеет следующий синтаксис:

resource dba_open(string name, string mode, string handler)

В качестве первого аргумента функция принимает параметр name с указанием имени файла. Второй параметр mode содержит символы, задающие режим открытия файла, и может принимать следующие значения:

  • r — чтение;
  • w — запись;
  • с — создание.

Последний параметр handler определяет тип базы данных или плоского файла и может принимать следующие значения: dbm, ndbm, gdbm, db2, db3, db4, cdb, cdb_make, flatfile, inifile, qdbm. В основном это различные разновидности баз данных Berkeley DB. Нас будет интересовать тип flatfile — плоский файл.

Примечание. Не все форматы доступны по умолчанию, ряд из них конфликтует друг с другом. Для того чтобы выяснить, какие базы данных доступны в системе, следует воспользоваться функцией dba_handlers(), которая не принимает никаких аргументов и возвращает массив из имен доступных баз данных. Самый простой способ получить список баз данных — выполнить команду print_r(dba_handlers()).

Примечание. Функция dba_list(), которая не принимает никаких аргументов, возвращает массив из полных путей к файлам, открытых в настоящий момент.

В случае успешного выполнения функция возвращает дескриптор открываемого файла, а в случае неудачи — false.

Рассмотрим пример создания плоского файла.

<?php
//создаем файл test.db
$id-=dba_open("test.db", "c", "flatfile");
//закрываем соединение
dba_close($id);
?>

Результатом работы будет пустой файл test.db. Обратите внимание, что как и обычные файлы, в конце скрипта следует закрыть соединение, для чего предназначена специальная функция dba_close().

Заполнение файла

После того как файл создан, можно приступить к заполнению его информацией. Для вставки в файл записей типа "ключ-значение" предназначена функция dba_insert(), которая имеет следующий синтаксис:

bool dba_insert(string key, string value, resource handle)

В качестве первого параметра key функция принимает строку с ключем записи, в качестве второго value — значение записи. Последний параметр определяет значение, которое передается дескриптору открытого функцией mda_open() файла. При успешном выполнении функция возвращает true, в случае неудачи — false.

Пример.

<?php
//открываем файл test.db
$id=dba_open("test.db", "w", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//функция dba_insert() принимает три параметра:
//первый - ключ, второй -значение, третий - дескриптор
dba_insert("1", "Привет, всем!", $id);
dba_insert("2", "Тест на заполнение файла", $id);
//закрываем файл
dba_close($id);
?>

Cкрипт заносит в ранее созданный файл test.db две записи.

Примечание. Формат flatfile не позволяет помещать записи с одинаковыми значениями ключей. Если в файл необходимо поместить несколько записей с одинаковыми ключами, следует воспользоваться форматом, поддерживающим такое поведение, например, cdb.

Примечание. Плоские файлы не допускают вставку нескольких значений для одной записи. Для того, чтобы сохранить в одной записи несколько значений, следует разместить их в массиве и упаковать его в строку при помощи функции serialize(), а при извлечении записи распаковать обратно в массив при помощи функции unserialize().

Чтение информации из файла

После того как файл создан, из него можно извлекать занесенную ранее информацию. Для этого предназначен набор функций, первой из которых является функция dba_exists(), которая проверяет существование ключа в плоском файле и имеет следующий синтаксис:

bool dba_exists(string key, resource handle)

Функция принимает в качестве первого аргумента ключ key, а в качестве второго — дескриптор файла, возвращаемый функцией mda_open(). Если ключ key найден в файле, возвращается true, в противном случае — false.

Рассмотрим пример работы функции dba_exists().

<?php
//открываем файл test.db
$id=dba_open("test.db", "r", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//функция dba_insert() принимает три параметра:
//первый - ключ, второй -значение, третий - дескриптор
if(dba_exists("1", $id)) echo "Ключ существует <br>";
else echo "Такой ключ отсутствует <br>";
if (dba_exists("4", $id)) echo "Ключ существует <br>";
else echo "Такой ключ отсутствует<br>";
//закрываем файл
dba_close($id);
?>

Первый вызов функции приводит к выводу строки "Ключ существует", т.к. ранее в файл test.db нами была добавлена запись с ключем "1". Проверка на существование записи с ключем "4" приводит к выводу записи "Такой ключ отсутствует".

После того как существование ключа проверено, можно осуществлять извлечение записи. Для этого предназначена функция dba_fetch(), которая по ключу извлекает из файла соответствующее ему значение и имеет следующий синтаксис:

string dba_fetch(string key, resource handle)

В качестве первого аргумента key передается ключ файла, в качестве второго — дескриптор, возвращаемый функцией dba_open(). Функция возвращает значение, соответствующее ключу.

Примечание. Если используемая база данных, поддерживающая создание записей с одинаковыми ключами, например cdb, после параметра key допускается использование дополнительного параметра skip, задающего число записей с ключем key, которые следует пропустить.

Пример.

<?php
//открываем файл test.db
$id=dba_open("test.db", "r", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
$key="2";
//если ключ существует
if(dba_exists($key, $id))
{
//извлекаем соответствующее ему значение
echo dba_fetch($key, $id);
}
//закрываем файл
dba_close($id);
?>

В результате работы скрипта в окно браузера будет выведена строка "Тест на заполнение файла ".

Если ключи плоского файла заранее не известны, имеется возможность последовательного извлечения записей из файла, начиная с первой записи. Функция dba_firskey() возвращает ключ первой записи и имеет следующий синтаксис:

string dba_firskey(resource handle)

Функция принимает дескриптор открытого файла handle и возвращает ключ первой записи файла. Вслучае неудачи возвращает false.

Функция dba_nextkey() возвращает ключ следующей записи. Последовательным вызовом данной функции можно перебрать весь файл. После того как функция вернет ключ последней записи, щна возвращает false .

Пример.

<?php
//открываем файл test.db
$id=dba_open("test.db", "r", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//извлекаем ключ первой записи
$key=dba_firstkey($id);
//выводим значение первой записи
echo dba_fetch($key, $id). "<br>";
//в цикле извлекаем следующие записи
while($key=dba_nextkey($id))
{
echo dba_fetch($key, $id). "<br>";
}
//закрываем файл
dba_close($id);
?>

В результате работы скрипта происходит последовательное чтение плоского файла — в цикле выводится значение всех записей.

Замена записи

По ключу можно заменить значение уже существующей записи на новое. Для этого предназначена функция dba_replace(), которая имеет следующий синтаксис:

bool dba_replace(string key, string value, resource handle)

Функция принимает в качестве первого параметра key ключ записи, в качестве второго value — значение, в качестве третьего handle — дескриптор, возвращенный функцией dba_open(). Функция возвращает true в случае успешного выполнения и false в случае неудачи.

Примечание. Если в качестве ключа key функции dba_replace() будет передан ключ несуществующей записи, такая запись будет создана.

Пример.

<?php
//открываем файл test.db
$id=dba_open("test.db", "r", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//извлекаем ключ первой записи
$key=dba_firstkey($id);
//выводим значение первой записи
echo dba_fetch($key, $id). "<br>";
//в цикле извлекаем следующие записи
while($key=dba_nextkey($id))
{
echo dba_fetch($key, $id). "<br>";
}
//закрываем файл
dba_close($id);
?>

В результате работы скрипта в окно браузера будет выведена строка "Повторяем тестирование".

Удаление записи

Последней операцией, которую поддерживают плоские файлы, является операция удаления записей. Для удаления записей предназначена функция dba_delete(), которая имеет следующий синтаксис:

bool dba_delete(string key, resourse handle)

Функция принимает в качестве первого параметра значение ключа key удаляемой записи, а в качестве второго параметра handle — дескриптор открытого файла. В случае удачного выполнения функция возвращает true, а в случае неудачи — false.

В примере производится удаление всех записей из файла test.db.

<?php
//открываем файл test.db
$id=dba_open("test.db", "w", "flatfile");
//проверяем корректность открытия файла
if(!$id) exit("Невозможно открыть файл");
//извлекаем ключ первой записи
$key=dba_firstkey($id);
//удаляем первую запись
dba_delete($key,$id);
//удаляем запись
while($key=dba_nextkey($id))
{
dba_delete($key, $id);
}
//закрываем файл
dba_close($id);
?>