Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Плоские файлы
 
 автор: Евгений Петров   (29.06.2005 в 19:17)   письмо автору
 
 

Не могли бы вы подробнее рассказать о плоских файлах, а именно их открытие создание удаление и т.д. Я заметил, что если открыть такой файл с параметром с, то если он уже существует то он не перезаписывается и из него можно читать и в него можно записывать данные.

   
 
 автор: cheops   (29.06.2005 в 19:24)   письмо автору
 
   для: Евгений Петров   (29.06.2005 в 19:17)
 

Подробнее о плоских файлах можно почитать в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=549

   
 
 автор: Евгений Петров   (29.06.2005 в 19:27)   письмо автору
 
   для: cheops   (29.06.2005 в 19:24)
 

Эту тему я уже читал. Впринципе все понятно, но все таки по поводу открытия/закрытия/создания при при создании файла из него/в него можно читать/записывать это впоследствии ни к чему плохому не приведет.

   
 
 автор: cheops   (30.06.2005 в 11:42)   письмо автору
 
   для: Евгений Петров   (29.06.2005 в 19:27)
 

А в смысле ничего не происходит? Не очень понятно...

   
 
 автор: Евгений Петров   (30.06.2005 в 14:17)   письмо автору
 
   для: 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
{прим. [] - это непечатаемые символы (квадраты)}

Насколько я понял данные не удаляются а только заносятся. Почему такое происходит, где я ошибся? Заранее спасибо.

   
 
 автор: cheops   (01.07.2005 в 00:23)   письмо автору
 
   для: Евгений Петров   (30.06.2005 в 14:17)
 

А условие
<?php
if($time+$timeout time())
?>

точно срабатывает? Если его убрать ситуация такая же? Вроде всё должно работать...

   
 
 автор: Евгений Петров   (01.07.2005 в 00:29)   письмо автору
 
   для: cheops   (01.07.2005 в 00:23)
 

Да точно срабатывает. Я обратил внимание что тот скрипт который вы приводили не помню где, таже история. Может php_dba.dll глючный?

   
 
 автор: cheops   (01.07.2005 в 01:00)   письмо автору
 
   для: Евгений Петров   (01.07.2005 в 00:29)
 

Погодите ка... а вы же после удаления опять заносите запись с точно таким же номером?
<?php
    
// !удаляем! значение 
    
dba_delete("1",$conf); 
    
// заносим новое 
    
dba_insert("1",time(),$conf);
?>

   
 
 автор: Евгений Петров   (01.07.2005 в 01:03)   письмо автору
 
   для: cheops   (01.07.2005 в 01:00)
 

Ну да мне надо её заменить, я же старую ужаляю а новую заношу. Поидее в файле должна быть постоянно одна запись (я так думаю :) ) а они постоянно добавляются.

   
 
 автор: cheops   (01.07.2005 в 01:12)   письмо автору
 
   для: Евгений Петров   (01.07.2005 в 01:03)
 

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

   
 
 автор: Евгений Петров   (01.07.2005 в 01:15)   письмо автору
 
   для: cheops   (01.07.2005 в 01:12)
 

А если учесть что записи будут добавляться каждыве 10-20 секунд, то какой смысл использования плоских файлов?

   
 
 автор: cheops   (01.07.2005 в 01:23)   письмо автору
 
   для: Евгений Петров   (01.07.2005 в 01:15)
 

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

   
 
 автор: Евгений Петров   (01.07.2005 в 14:45)   письмо автору
 
   для: cheops   (01.07.2005 в 01:23)
 

Я прбовал ставить вместо flatfile другие типы (которые вы приводили), но не один ен работал

   
 
 автор: cheops   (01.07.2005 в 20:04)   письмо автору
 
   для: Евгений Петров   (01.07.2005 в 14:45)
 

Некоторые требуют подключать расширения.

   
 
 автор: Евгений Петров   (02.07.2005 в 15:06)   письмо автору
 
   для: cheops   (01.07.2005 в 20:04)
 

А как это сделать?

   
 
 автор: cheops   (02.07.2005 в 17:32)   письмо автору
 
   для: Евгений Петров   (02.07.2005 в 15:06)
 

Да вы просто посмотрите какие ваша система поддерживает при помощи фукнции dba_handlers(), которая возвращает список дескрипторов, доступных в системе
<? 
  
echo "<pre>";
  
print_r(dba_handlers());
  echo 
"</pre>";
?>

   
 
 автор: Евгений Петров   (03.07.2005 в 18:44)   письмо автору
 
   для: cheops   (02.07.2005 в 17:32)
 

Функция выдала:
Array
(
    [0] => cdb
    [1] => cdb_make
    [2] => db3
    [3] => inifile
    [4] => flatfile
)

но у всех у них одна и та же проблема, записи не удаляются.

   
 
 автор: Евгений Петров   (05.07.2005 в 01:25)   письмо автору
 
   для: Евгений Петров   (03.07.2005 в 18:44)
 

А как можно подключить другие расширения?

   
 
 автор: cheops   (05.07.2005 в 01:34)   письмо автору
 
   для: Евгений Петров   (05.07.2005 в 01:25)
 

Обратите внимание на dBase функции, которые позволяют работать с dbf-файлами. Расширение - php_dbase.dll.

   
 
 автор: Евгений Петров   (05.07.2005 в 01:42)   письмо автору
 
   для: cheops   (05.07.2005 в 01:34)
 

А что это такое и как с ними работать?

   
 
 автор: cheops   (05.07.2005 в 01:53)   письмо автору
 
   для: Евгений Петров   (05.07.2005 в 01:42)
 

Это достаточно популярный формат (был по крайней мере) - для просмотра файлов этого формата можно найти массу программ. Вот несколько тем, посвящённых работе с этим расширением
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=752
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=955
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=4386

   
 
 автор: Евгений Петров   (06.07.2005 в 18:33)   письмо автору
 
   для: 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. Заранее огромное спасибо.

   
 
 автор: cheops   (06.07.2005 в 22:24)   письмо автору
 
   для: Евгений Петров   (06.07.2005 в 18:33)
 

При создании файла определяется его структура
<?php
  $db_name 
"tbl.dbf"
  
$def 
    array( 
        array(
"date",     "C"50), 
        array(
"number",   "N"110), 
        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() не совпадают...

   
 
 автор: Евгений Петров   (07.07.2005 в 00:54)   письмо автору
 
   для: cheops   (06.07.2005 в 22:24)
 

А какие существуют типы полей? С - это я так понял строковый тип, N - числовой (кстати в вашем примере два параметра, что они значат).

   
 
 автор: cheops   (07.07.2005 в 01:02)   письмо автору
 
   для: Евгений Петров   (07.07.2005 в 00:54)
 

Существует несколько типов
L - логический
M - memo (чёрт знает что такое, но это и не важно, так как PHP его всё-равно не поддерживает)
D - дата, котора сохраняется в формате YYYYMMDD
N - числовой формат
С - строковый формат

Первые три формата не имеют дополнительных параметров и по моему опыту с ними лучше не связываться... С имеет дополнительный параметр в котором указывается длина. В N первый параметр также указывает число символов, отводимых под число, а второй параметр, число символов отводимых под дробную часть - т.е. в примере двумя постами выше объявляется по сути целое число.

   
 
 автор: Евгений Петров   (07.07.2005 в 01:06)   письмо автору
 
   для: cheops   (07.07.2005 в 01:02)
 

А вообще при написании скриптов стоит делать его "сбоеустойчивым", т.е. если вдруг кто то удалит какой то файл или БД, то скрипт сам создаст его; или все таки вероятность того, что кому нибудь удастся удалить что нибудь низка и поэтому создания БД, таблиц, файлов и т.д. можно проделать один раз?

   
 
 автор: cheops   (07.07.2005 в 01:11)   письмо автору
 
   для: Евгений Петров   (07.07.2005 в 01:06)
 

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

   
 
 автор: Евгений Петров   (07.07.2005 в 01:14)   письмо автору
 
   для: cheops   (07.07.2005 в 01:11)
 

Для форума это конечно "страшно", но если для чата, то в принципе не очень т.к. все равно все сообщения не отображаются сразу. Другое дело если архив захочется просмотреть.

   
 
 автор: Евгений Петров   (07.07.2005 в 16:40)   письмо автору
 
   для: Евгений Петров   (07.07.2005 в 01:14)
 

А как извлекать записи из файла? И что значит второй параметр в функции dbase_open()?

   
 
 автор: cheops   (07.07.2005 в 17:45)   письмо автору
 
   для: Евгений Петров   (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($dbh5);
  
// Закрываем dbf-файл 
  
dbase_close($dbh); 
?>

2) Второй параметр функции dbase_open() означает режим доступа к файлу: 0 - только для чтения, 1 - только для записи, 2 - и для чтения и для записи.

   
 
 автор: Евгений Петров   (08.07.2005 в 13:35)   письмо автору
 
   для: cheops   (07.07.2005 в 17:45)
 

Хелп!. Как можно удалить и изменить запись в файле. Есть функции dbase_delete_record и dbase_remove_reocrd но они у меня что то не работают?

   
 
 автор: cheops   (10.07.2005 в 11:55)   письмо автору
 
   для: Евгений Петров   (08.07.2005 в 13:35)
 

Эти функции только помечают изменения, для того, чтобы они вступили в силу - требуется вызвать функцию dbase_pack().

   
 
 автор: Евгений Петров   (10.07.2005 в 16:54)   письмо автору
 
   для: cheops   (10.07.2005 в 11:55)
 

Спасибо, я уже сам разобрался.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования