Как хранить имена файлов в базе?

Silentland

Новичок
Хранить только имя, а каталог брать потом из настроек или хранить полный путь?

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

Тут все на любителя или есть какие-то рекомендации?
 

Silentland

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

fixxxer

К.О.
Партнер клуба
Эээ.
ты что вообще под полным путем понимаешь?
 

Silentland

Новичок
filefolder/sdf79sad.png
т.е. тот путь который можно в <img src=""> вставлять и он будет работать
 

Silentland

Новичок
Хм... Идея здравая. У меня есть html-блок с img. От сервера получаю массив с именами картинок. Яваскрипт берет и копирует эти блоки под каждую картинку, вставляя в src нужный адрес. Если же в src уже что-то будет, ему придется вынимать это, прибавлять имя и записывать обратно. Впрочем, может быть так и лучше будет. Не пробовал еще)

P.S. У меня даже еще круче. В src шаблона адрес ГИФ-спинера, чтобы крутился пока загрузка идет. Придется парсить, вытаскивать адрес...
 

Фанат

oncle terrible
Команда форума
омг
ляг поспи, утром поймешь, что проблема примитивная, уровня 2х2, решения не требует вообще
ничего ниоткуда парсить не надо
 

Фанат

oncle terrible
Команда форума
а, главное, проблема хранения картинок никакого вообще не имеет отношения к проблеме показа их жс-ом.
ну ни малейшего.
и иметь в принципе не может
 

Silentland

Новичок
Спал уже неоднократно)
Опять же если взять многострадальный пример: http://tamtakoe.ru/photoalbum/, пхпэшка там такая: https://github.com/tamtakoe/photoalbum/blob/master/jQueryFileUploadDemo/action.php отдает только данные в json. Соответственно, если яваскрипт не имеет никакого отношения к хранению картинок, то он должен получать сразу готовый адрес. Получается, что его должен генерировать пхп, увеличивая в два раза объем передаваемых данных...

P.S. на счет парсинга уже на стену лезу эта штука /.+(?!/)/g ну никак не хочет вычленять имя файла из всего пути!
 

fixxxer

К.О.
Партнер клуба


Если тебя так волнует этот оверхед - ну так отдавай в json
PHP:
{
   'prefix': '/path/to/images',
   'images': [
        '/image1.jpg',
        '/image2.jpg',
   ]
}
В чем проблема то?
 

Silentland

Новичок
В чем проблема то?
В том, что это утяжелит код как сервера, так и клиента. Если выдать тупо список имен из базы то, можно даже использовать библиотечную функцию. Потом ответ приходит по двум-трем копиям картинки, т.е. уже будет так:
PHP:
[
{
   'prefix': '/path/to/images',
   'images': [
        '/image1.jpg',
        '/image2.jpg',
   ]
},
{
   'prefix': '/path/to/originals',
   'images': [
        '/image1.jpg',
        '/image2.jpg',
   ]
},
{
   'prefix': '/path/to/thumbs',
   'images': [
        '/image1.jpg',
        '/image2.jpg',
   ]
}
]
Не слишком красиво, хотя не знаю, лучше так или добавить ЖС строчкой парсинга...

P.S. И как уже упоминал в шаблоне с src и так прописан нужный путь к прелоадеру

P.P.S. А регулярка совсем простой оказалась /[^/]+$/
 

Silentland

Новичок
Ладно, убедили, нафиг регулярки! Сделаю как было: в выборке из БД дополню имена путями. Когда трафик имен файлов перевалит за террабайт, задумаюсь над оптимизацией.

Еще тогда попутный вопрос. Сейчас имена расширяются так:
PHP:
$res = mysql_query("select * from `" . $this->prm['tableName'] . "` order by `pos`" );
$list = array();
while ($row = mysql_fetch_assoc($res)) {
    foreach ($this->prm['files'] as $file) {
        $row[$file['field']] =  $file['dir'] . $row[$file['field']];
    }
    $list[] = $row;
}
return $list;
Хотелось бы использовать библиотечную функцию выгрузки из базы. Тогда получится так:
PHP:
$list = $this->prm['sql']->get();
for ($i = 0; $i < count($list); $i++) {
    foreach ($this->prm['files'] as $file) {
        $list[i][$file['field']] =  $file['dir'] . $list[i][$file['field']];
    }
}
return $list;
Т.е. перебор массива два раза. Стоит ли так делать?
 

fixxxer

К.О.
Партнер клуба
а почему нет? зачем на спичках экономить?

если это ВДРУГ КОГДА-ТО станет узким местом (на что укажут бенчмарки) - надо не копипастить говнокод вида mysql_query, а добавить библиотечную функцию, которая будет читать строки с заданной постобработкой.

например
$list = $this->db->getRowsProcessedWith(function(&$row) {
$row['full_path'] = $row['dir'] . $row['file'];
});
 

Фанат

oncle terrible
Команда форума
Ладно, убедили, нафиг регулярки! Сделаю как было: в выборке из БД дополню имена путями. Когда трафик имен файлов перевалит за террабайт, задумаюсь над оптимизацией.
О, слава богу, разумная мысль. Я уж и не ждал.
 

Silentland

Новичок
Вопрос на схожую тему.

Запрашиваю у сервера данные: выборку товаров из базы + кое-какие настройки (например, стиль каталога). Проще всего отправить два аякс запроса: первый для товаров, второй (в колбеке первого) для настроек. Второй вариант: запросить все одним запросом, но тогда на сервере придется писать код для объединения, а на клиенте, для разъединения данных.

Как тут лучше поступить? Пожертвовать кол-вом запросов в угоду чистоты кода или наоборот?
 

WMix

герр M:)ller
Партнер клуба
вариант нр2 звучит умнее но геморойней, вариант 1 звучит проще но тормознутей... ты за легкость или за скорость спрашиваешь?

зы обработать 2 вызова нужна тоже логика и клиента и сервера
 

Silentland

Новичок
Я за простоту, но там где это приемлемо. А так, конечно, фиг знает чем каждый из способов может в будущем аукнуться, опыта у меня нет. Может быть, вообще потом придется все микрозапросы (которых у меня уйма) складывать в очередь и отправлять по таймеру... А может быть и не будет тормозов из-за этого... Что ваш опыт подсказывает?
 

WMix

герр M:)ller
Партнер клуба
допиши как проще, и подумай есть ли смысл оптимизировать!
нужна будет прокладка, перепишешь кусок... и так всю жизнь...
 

Silentland

Новичок
Блин, кто бы книжку написал, а то так всю жизнь эксперементировать с велосипедами... ))
 
Сверху