|
|
|
| Не могли бы вы подробнее рассказать о плоских файлах, а именно их открытие создание удаление и т.д. Я заметил, что если открыть такой файл с параметром с, то если он уже существует то он не перезаписывается и из него можно читать и в него можно записывать данные. | |
|
|
|
|
|
|
|
для: Евгений Петров
(29.06.2005 в 19:17)
| | Подробнее о плоских файлах можно почитать в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=549 | |
|
|
|
|
|
|
|
для: cheops
(29.06.2005 в 19:24)
| | Эту тему я уже читал. Впринципе все понятно, но все таки по поводу открытия/закрытия/создания при при создании файла из него/в него можно читать/записывать это впоследствии ни к чему плохому не приведет. | |
|
|
|
|
|
|
|
для: Евгений Петров
(29.06.2005 в 19:27)
| | А в смысле ничего не происходит? Не очень понятно... | |
|
|
|
|
|
|
|
для: cheops
(30.06.2005 в 11:42)
| | Объясните пожалуйста что деалет функция dba_delete(), она удаляет из файла запись или нет? Потому что в результате работы следующего кода:
<?
// если файл не существует - создаем
if(!file_exists("data/chatconf.db"))
{
$conf=dba_open("data/chatconf.db","cd","flatfile");
// добавляем значение и закрываем
dba_insert("1",time(),$conf);
dba_close($conf);
}
$conf=dba_open("data/chatconf.db","wd","flatfile");
// извлекаем значение
$time=dba_fetch("1",$conf);
if($time+$timeout < time())
{
// !удаляем! значение
dba_delete("1",$conf);
// заносим новое
dba_insert("1",time(),$conf);
}
// закываем
dba_close($conf);
?>
|
файл chatconf.db открытый в WordPad'e представляет примерно следующее:
1
[]10
11200678441
[]10
11200678681
[]10
1200678961
...
[]10
11201560751
110
1120156099
{прим. [] - это непечатаемые символы (квадраты)}
|
Насколько я понял данные не удаляются а только заносятся. Почему такое происходит, где я ошибся? Заранее спасибо. | |
|
|
|
|
|
|
|
для: Евгений Петров
(30.06.2005 в 14:17)
| | А условие
<?php
if($time+$timeout < time())
?>
|
точно срабатывает? Если его убрать ситуация такая же? Вроде всё должно работать... | |
|
|
|
|
|
|
|
для: cheops
(01.07.2005 в 00:23)
| | Да точно срабатывает. Я обратил внимание что тот скрипт который вы приводили не помню где, таже история. Может php_dba.dll глючный? | |
|
|
|
|
|
|
|
для: Евгений Петров
(01.07.2005 в 00:29)
| | Погодите ка... а вы же после удаления опять заносите запись с точно таким же номером?
<?php
// !удаляем! значение
dba_delete("1",$conf);
// заносим новое
dba_insert("1",time(),$conf);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(01.07.2005 в 01:00)
| | Ну да мне надо её заменить, я же старую ужаляю а новую заношу. Поидее в файле должна быть постоянно одна запись (я так думаю :) ) а они постоянно добавляются. | |
|
|
|
|
|
|
|
для: Евгений Петров
(01.07.2005 в 01:03)
| | Да... добавляются, но зато выводится то, что нужно - последний вариант, хотя куча бесхозных записей - малоприятное явление... | |
|
|
|
|
|
|
|
для: cheops
(01.07.2005 в 01:12)
| | А если учесть что записи будут добавляться каждыве 10-20 секунд, то какой смысл использования плоских файлов? | |
|
|
|
|
|
|
|
для: Евгений Петров
(01.07.2005 в 01:15)
| | Может это особенность движка "flatfile" и стоит попытаться использовать другие - их ведь там до чёрта, этот самый простейший... | |
|
|
|
|
|
|
|
для: cheops
(01.07.2005 в 01:23)
| | Я прбовал ставить вместо flatfile другие типы (которые вы приводили), но не один ен работал | |
|
|
|
|
|
|
|
для: Евгений Петров
(01.07.2005 в 14:45)
| | Некоторые требуют подключать расширения. | |
|
|
|
|
|
|
|
для: cheops
(01.07.2005 в 20:04)
| | А как это сделать? | |
|
|
|
|
|
|
|
для: Евгений Петров
(02.07.2005 в 15:06)
| | Да вы просто посмотрите какие ваша система поддерживает при помощи фукнции dba_handlers(), которая возвращает список дескрипторов, доступных в системе
<?
echo "<pre>";
print_r(dba_handlers());
echo "</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(02.07.2005 в 17:32)
| | Функция выдала:
Array
(
[0] => cdb
[1] => cdb_make
[2] => db3
[3] => inifile
[4] => flatfile
)
|
но у всех у них одна и та же проблема, записи не удаляются. | |
|
|
|
|
|
|
|
для: Евгений Петров
(03.07.2005 в 18:44)
| | А как можно подключить другие расширения? | |
|
|
|
|
|
|
|
для: Евгений Петров
(05.07.2005 в 01:25)
| | Обратите внимание на dBase функции, которые позволяют работать с dbf-файлами. Расширение - php_dbase.dll. | |
|
|
|
|
|
|
|
для: cheops
(05.07.2005 в 01:34)
| | А что это такое и как с ними работать? | |
|
|
|
|
|
|
|
|
для: cheops
(05.07.2005 в 01:53)
| | Перечитал все ссылки, но почти ничего не понял. Сразу возникает вопрос: как работать с такими файлами? как с обычными файлами (открыть/закрыть, записать/считать) или как с базой данных (создавать таблицы, выбирать записи, вставлять записи)? Как работают функции dbase_add_record() и dbase_get_record()? Почему то при вызове первой PHP ругается Warning: dbase_add_record() [function.dbase-add-record]: Wrong number of fields specified in D:\SERVER\www\www.php on line 15. Заранее огромное спасибо. | |
|
|
|
|
|
|
|
для: Евгений Петров
(06.07.2005 в 18:33)
| | При создании файла определяется его структура
<?php
$db_name = "tbl.dbf";
$def =
array(
array("date", "C", 50),
array("number", "N", 11, 0),
array("podrazd", "C", 50),
array("uchastok", "C", 50),
array("mehanizm", "C", 50),
array("kol_vo", "C", 50),
array("usl_podr", "C", 50),
array("usl_uch", "C", 50)
);
// Создаём таблицу в
if (!dbase_create($db_name, $def))
{
echo "Ошибка при создании dbf-таблицы";
exit();
}
?>
|
Массив $def определяет поля и их тип, которые будут в файле - в этом плане эти файлы похожи на примитивную базу данных - имеется таблица.
После создания файла его уже можно открывать/закрывать, записывать/считывать. Указанное предупреждение говорит о том, что число полей в файле и передаваемое при помощи функции dbase_add_record() не совпадают... | |
|
|
|
|
|
|
|
для: cheops
(06.07.2005 в 22:24)
| | А какие существуют типы полей? С - это я так понял строковый тип, N - числовой (кстати в вашем примере два параметра, что они значат). | |
|
|
|
|
|
|
|
для: Евгений Петров
(07.07.2005 в 00:54)
| | Существует несколько типов
L - логический
M - memo (чёрт знает что такое, но это и не важно, так как PHP его всё-равно не поддерживает)
D - дата, котора сохраняется в формате YYYYMMDD
N - числовой формат
С - строковый формат
Первые три формата не имеют дополнительных параметров и по моему опыту с ними лучше не связываться... С имеет дополнительный параметр в котором указывается длина. В N первый параметр также указывает число символов, отводимых под число, а второй параметр, число символов отводимых под дробную часть - т.е. в примере двумя постами выше объявляется по сути целое число. | |
|
|
|
|
|
|
|
для: cheops
(07.07.2005 в 01:02)
| | А вообще при написании скриптов стоит делать его "сбоеустойчивым", т.е. если вдруг кто то удалит какой то файл или БД, то скрипт сам создаст его; или все таки вероятность того, что кому нибудь удастся удалить что нибудь низка и поэтому создания БД, таблиц, файлов и т.д. можно проделать один раз? | |
|
|
|
|
|
|
|
для: Евгений Петров
(07.07.2005 в 01:06)
| | Хм... но если таблица можно восстановить, то записи часто не подлежат восстановлению - допустим можно восстановить работу форума, но он будет пустой - в такой ситуации лучше вообще не возобновлять работу форума, до тех пор пока его база не будет восстановлена из резервных источников. Если речь идёт о временной таблице, данные в которой не представляют интереса, то вероятность её умышленного удаления мала, так как злоумышленик прекрасно понимает, что большого вреда он этим не нанесёт - поэтому здесь подстараховка только усложнит код и затруднит его сопровождение. | |
|
|
|
|
|
|
|
для: cheops
(07.07.2005 в 01:11)
| | Для форума это конечно "страшно", но если для чата, то в принципе не очень т.к. все равно все сообщения не отображаются сразу. Другое дело если архив захочется просмотреть. | |
|
|
|
|
|
|
|
для: Евгений Петров
(07.07.2005 в 01:14)
| | А как извлекать записи из файла? И что значит второй параметр в функции dbase_open()? | |
|
|
|
|
|
|
|
для: Евгений Петров
(07.07.2005 в 16:40)
| | 1) Извлекать записи следуе при помощи функций dbase_get_record() или dbase_get_record_with_names(). Первая возвращает обычный массив, вторая ассоциативный, где ключи - имена столбцов.
<?php
// Открываем созданный dbf-файл
$dbh = dbase_open("tbl.dbf",2)
or die("Ошибка - невозможно открыть '$db_name'");
// Читаем 5 запись в массив $arr
$arr = dbase_get_record($dbh, 5);
// Закрываем dbf-файл
dbase_close($dbh);
?>
|
2) Второй параметр функции dbase_open() означает режим доступа к файлу: 0 - только для чтения, 1 - только для записи, 2 - и для чтения и для записи. | |
|
|
|
|
|
|
|
для: cheops
(07.07.2005 в 17:45)
| | Хелп!. Как можно удалить и изменить запись в файле. Есть функции dbase_delete_record и dbase_remove_reocrd но они у меня что то не работают? | |
|
|
|
|
|
|
|
для: Евгений Петров
(08.07.2005 в 13:35)
| | Эти функции только помечают изменения, для того, чтобы они вступили в силу - требуется вызвать функцию dbase_pack(). | |
|
|
|
|
|
|
|
для: cheops
(10.07.2005 в 11:55)
| | Спасибо, я уже сам разобрался. | |
|
|
|