Консультация № 47152
23.06.2006, 19:13
0.00 руб.
0 4 4
Здравствуйте уважаемые эксперты! В процессе создания сайта на бесплатном хостинге оказалось что базу данных мне предоставлять не хотят, только php. В связи с чем возникли вопросы:
1)как можно получить массив с именами всех файлов в папке?
2)Насколько безопасно делать админку с веб-интерфейсом в движке, построенном на файлах.
3)Насколько целесообразно прочитывать все файлы через цикл для получения имен статей и их описания для странички оглавления, если значения разделены скажем последовательностью "<!--split-->", или все таки лучше вынести заголовки и описания в отдельный файл, если так то опять таки встает второй вопрос.
Заранее спасибо за ответ.

Обсуждение

Неизвестный
23.06.2006, 21:46
общий
это ответ
Здравствуйте, Bolzamo!
1. Открыть каталог функцией opendir. В цикле while просто вывести имена всех файлов. Примерно так:
while ($d==readdir($dirhandle))
{
echo $dir;
}

2. База данных в любом случае безопаснее чем файлы. Но если встаёт такой вопрос, то Вам нужно в первую очередь позаботиться о блокировках файла. То есть, скажем, писать в файл не так:

$file=fopen("file.txt", "w");
fwrite($file, "строка");
fclose($file);

А так:

$file=fopen("file.txt", "w");
flock($file, LOCK_EX);
fwrite($file, "строка");
flock($file, LOCK_UN);
fclose($file);

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

3. Мне кажется что лучше вынести их в отдельный файл. В принципе, конечно, и так и так морока. С базой было бы гораздо легче. Но если из двух зол выбирать меньшее, я бы посоветовал вынести имена статей и их описания в отдельный файл.

Надеюсь что хоть немножко прояснил Вам ситуацию. Если что, пишите в мини-форум.
Удачи!
Неизвестный
24.06.2006, 10:14
общий
это ответ
Здравствуйте, Bolzamo!

Q1) как можно получить массив с именами всех файлов в папке?
A1)
<?
$dir_name=$_SERVER[‘DOCUMENT_ROOT‘].‘/‘;
$d=opendir($dir_name) or die($php_errormsg);
while( false !==($f=readdir($d))){
if (is_file("$dir_name$f")){
$f_arr[]=$f;
}
}
closedir($d);

foreach( $f_arr as $name ){
echo "$name
\n";
}
?>

Q2)Насколько безопасно делать админку с веб-интерфейсом в движке, построенном на файлах.
A2)Если интересует возможность потери данных (когда используется один и тот же файл), то при одном администраторе таких проблем не возникает (никто больше не пытается получить монопольный доступ к файлу) - просто используем блокировку файла:
$f=fopen(‘name.txt‘,‘a‘);
flock( $f, LOCK_EX );
fwrite( $f, ‘text‘ );
fflush( $f );
fclose( $f );

Q3)Насколько целесообразно прочитывать все файлы через цикл для получения имен статей и их описания для странички оглавления, если значения разделены скажем последовательностью "<!--split-->", или все таки лучше вынести заголовки и описания в отдельный файл, если так то опять таки встает второй вопрос.
A3) (также касается Q2)
Используя хранение всей информации (заголовок, описание, статья...) в одном файле облегчает реализацию создания/редактирования статьи, но при создании списка необходимо прочитать заголовки всех файлов, что не повышает производительности.
Так же приходиться использовать имя файла как передаваемый параметр, что использовать не безопасно - возможно выполнение произвольного кода и т.д. и т.п., за этим глаз и глаз нужен. Во втором варианте можно ввести поле ID и передавать его и такая проблема отпадает. В принципе этот вариант возможен и в первом случае, но реализуется сложнее (да и работает намного медленней).
P.S. Сам когда-то реализовывал движок со вторым вариантом и использовал подобие формата dBase(.dbf): выравнивал поля по ширине (позволило редактировать описание и т.д. не перезаписывая весь файл, а только нужную строку), записи не удалялись, а помечались "#" в начале строки (тоже весь файл не перезаписываем). И не забудь перед открытием файла со статьей проверять его наличие: if (file_exists(‘filename.txt‘))

Ну в общих чертах это все, удачи!!!
Неизвестный
24.06.2006, 10:27
общий
это ответ
Здравствуйте, Bolzamo!
1)
array glob(string $filter) e.g. foreach(glob(*.*) as $nextfile) print $nextfile;
http://php.net/manual/ru/function.glob.php
2)
если нет другого выхода.
хотя можно использовать SQLite
http://php.net/manual/ru/ref.sqlite.php
3)
лучьше конечно хранить каждую статью в отдельном файле.
что бы потом редактировать было проще
Неизвестный
25.06.2006, 01:23
общий
это ответ
Здравствуйте, Bolzamo!

Я бы всё-таки заполучил хостинг с БД, избавитесь от многих проблем. Например на hut.ru.

С уважением,
Антон Цепковский
Форма ответа