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

Форум PHP

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

 

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

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

тема: Проектирование фотогалереи
 
 автор: Keyses   (08.07.2009 в 00:04)   письмо автору
 
 

Некоторое время назад потребовалось создать фотогалерею для сайта, брать готовую не очень хотелось. Попробовать что-то сделать самому впервые всегда намного интереснее.
Всё вроде бы не плохо работает, но есть один нюанс, по поводу которого, собственно говоря я и хотел бы проконсультироваться у форумчан.
Для каждого альбома создаётся директория и фото хранятся там в виде (Xm.jpg - превьюшка Xb.jpg - оригинал, где X - номер фото). Есть ли более удобный способ хранить файлы? Или мой способ тоже не плох?

  Ответить  
 
 автор: Trianon   (08.07.2009 в 00:16)   письмо автору
 
   для: Keyses   (08.07.2009 в 00:04)
 

что происходит с нумерацией при удалении / добавлении фотографии?

Способ как способ, если при этом вся остальная функциональность не страдает...

  Ответить  
 
 автор: Keyses   (08.07.2009 в 00:24)   письмо автору
 
   для: Trianon   (08.07.2009 в 00:16)
 

При удалении просто удаляется 2 файла с текущим номером.
При добавлении я делал так:
for($count=0; $count<count(glob($dir.'[0-9]*'.($w == 800?'b':'m').'.{jpeg,jpg,gif,png}', GLOB_BRACE)); $count++);
$file = ($count+1).($w == 800?'b':'m').'.jpg';


Неудобство состоит в том, что когда приходит время выводить альбом, то цикл идёт от 1 до (*m.jpg) и приходится делать для каждой фото перед выводом проверку на существование.

  Ответить  
 
 автор: sim5   (08.07.2009 в 00:32)   письмо автору
 
   для: Keyses   (08.07.2009 в 00:24)
 

count(glob($dir.'[0-9]*'.($w == 800?'b':'m')..... лучше высчитывать до цикла, а не в теле его, ведь у вас это связано со сканированием дериктории, а значит происходит с каждой итерацией цикла. А разве только способом for и по его номеру итерации можно вывести изображения?

  Ответить  
 
 автор: Keyses   (08.07.2009 в 00:38)   письмо автору
 
   для: sim5   (08.07.2009 в 00:32)
 

ну можно ещё while использовать, а что есть другие предложения? :)
Можно по подробнее, почему count(glob($dir.'[0-9]*'.($w == 800?'b':'m')..... будет вычисляться с каждой итерацией цикла?

  Ответить  
 
 автор: Trianon   (08.07.2009 в 00:47)   письмо автору
 
   для: Keyses   (08.07.2009 в 00:38)
 

потому что оно вычисляется как часть выражения $count<count(glob(...))
а это выражение вычисляется перед каждым повтором цикла.
Уж коль скоро Вы получили от glob() массив, то почему по этому массиву не пройтись?
Между прочим, если номер фото держать с ведущими нулями (000035), то по циклу даже бежать не потребуется - нужно будет просто взять последний элемент массива.

UPD. Как я понимаю, галерея без БД, и не поддерживает ни комментарии к фотографиям, ни оценки .
Основная масса казусов начнется при попытке прикрутить к ней дополнительные возможности.

  Ответить  
 
 автор: Keyses   (08.07.2009 в 02:28)   письмо автору
 
   для: Trianon   (08.07.2009 в 00:47)
 

Галерея с БД, там есть подписи к фото, названия альбомов. А какой смысл проходится по массиву, если есть count()?
Держать фото с ведущими нулями - это ограничение на количество фото, хотя врядли их будет в альбоме больше чем 999 999 :)

  Ответить  
 
 автор: Trianon   (08.07.2009 в 08:41)   письмо автору
 
   для: Keyses   (08.07.2009 в 02:28)
 

Если галерея с БД, то обычно генерация ключа любого объекта возложена на БД.
Имя фото определяется ключом записи таблицы.
И выполнять ресурсоемкие операции по сканированию каталогов не требуется.

>Держать фото с ведущими нулями - это ограничение на количество фото, хотя врядли их будет в альбоме больше чем 999 999 :)

и поскольку в ограничения диска Вы упретесь раньше, им спокойно можно пренебречь.

  Ответить  
 
 автор: Keyses   (08.07.2009 в 14:25)   письмо автору
 
   для: Trianon   (08.07.2009 в 08:41)
 

>Если галерея с БД, то обычно генерация ключа любого объекта возложена на БД.
>Имя фото определяется ключом записи таблицы.
>И выполнять ресурсоемкие операции по сканированию каталогов не требуется.

А можно подробнее? Дело в том, что подписи имеются не к каждой фотографии.

  Ответить  
 
 автор: Trianon   (08.07.2009 в 14:33)   письмо автору
 
   для: Keyses   (08.07.2009 в 14:25)
 

>Дело в том, что подписи имеются не к каждой фотографии.

А можно подробнее? подписи подписями, но фотографии-то имеются все?

  Ответить  
 
 автор: Keyses   (08.07.2009 в 14:42)   письмо автору
 
   для: Trianon   (08.07.2009 в 14:33)
 

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

  Ответить  
 
 автор: Trianon   (08.07.2009 в 14:48)   письмо автору
 
   для: Keyses   (08.07.2009 в 14:42)
 

>фотографии-то имеются все, но хранятся они не в БД. у меня в базе описание привязывается к номеру фото, под которой оно сохранено.

А нужно сделать наоборот.
Чтобы фото привязывалось к записи в таблице.
Поле описания в этой записи можно оставить пустым (или пустой строкой), если что.
Генерация html-кода при этом окажется менее затратной.

  Ответить  
 
 автор: Keyses   (08.07.2009 в 15:16)   письмо автору
 
   для: Trianon   (08.07.2009 в 14:48)
 

Получается что я выигрываю только в том, что могу взять количество записей в БД для конкретного альбома, а не сканировать директорию на количество файлов, верно?

  Ответить  
 
 автор: Trianon   (08.07.2009 в 16:25)   письмо автору
 
   для: Keyses   (08.07.2009 в 15:16)
 

Когда Вы строите HTML-код с со страницей галереи, Вы сканируете каталог с изображениями?
Не для вывода количества - для вывода самих <img src=... > ?
Да, потому как иначе их имена взять Вам негде.
В случае первичности БД Вам не придется это делать.

  Ответить  
 
 автор: Keyses   (08.07.2009 в 18:59)   письмо автору
 
   для: Trianon   (08.07.2009 в 16:25)
 

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

Стоит ли оно вообще того? Насколько больше я выйграю в скорости между сканированием директории glob() и одним запросом к БД mysql_query()?

  Ответить  
 
 автор: Trianon   (08.07.2009 в 19:17)   письмо автору
 
   для: Keyses   (08.07.2009 в 18:59)
 

>Стоит ли оно вообще того?

А это уж Вам решать.

  Ответить  
 
 автор: sim5   (08.07.2009 в 19:26)   письмо автору
 
   для: Keyses   (08.07.2009 в 18:59)
 

Это как посмотреть еще.... Все завист от того, что ваша галерея показывает - либо гольные картинки, либо еще в довесок контент к ним и прочие вкусности.

  Ответить  
 
 автор: Keyses   (08.07.2009 в 19:37)   письмо автору
 
   для: sim5   (08.07.2009 в 19:26)
 

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

  Ответить  
 
 автор: Trianon   (08.07.2009 в 19:41)   письмо автору
 
   для: Keyses   (08.07.2009 в 19:37)
 

Вы проконсультировались.
Я изложил Вам альтернативный подход.
Вам он не нужен.
Он понадобится тому, кто будет переделывать галерею после Вас.
Совершенно очевидно, что при нормализованной схеме хранения данных этот разработчик будет материться [на порядок-два] меньше, чем при той, что сейчас.

что может быть добавлено к возможностям, я тоже указал. Оценки, отзывы, голосования.
Ограничения в правах доступа к. Объединения в ленты.
Всё это потребует четкой организации данных, которую без аккуратной схемы БД достичь очень тяжело.

  Ответить  
 
 автор: Keyses   (08.07.2009 в 20:02)   письмо автору
 
   для: Trianon   (08.07.2009 в 19:41)
 

Да спасибо Вам большое!
Я подумаю, и может-таки переделаю ;) Просто дело в том что сайт информационного характера и в комментариях и оценках фото нет никакого смысла в данном случае. А на будущее обязательно учту сей полезный факт.

  Ответить  
 
 автор: sim5   (08.07.2009 в 00:48)   письмо автору
 
   для: Keyses   (08.07.2009 в 00:38)
 

А как вы думаете? Условия прописанные в for будут вычислятся при каждой итерации цикла, и если они затратные, то не стоит загружать этими вычислениями цикл.

  Ответить  
 
 автор: Keyses   (08.07.2009 в 00:50)   письмо автору
 
   для: sim5   (08.07.2009 в 00:48)
 

Ясно, просто думал что условие выхода из цикла считается один раз на первой итерации

  Ответить  
 
 автор: Trianon   (08.07.2009 в 00:54)   письмо автору
 
   для: Keyses   (08.07.2009 в 00:50)
 

Тогда оно окажется истинным и (если его не пересчитывать) цикл никогда не закончится.

  Ответить  
 
 автор: sim5   (08.07.2009 в 00:58)   письмо автору
 
   для: Keyses   (08.07.2009 в 00:50)
 

$i=0; $i<35; $i++ - можете писать, и на быстродействие это не скажется, но вот $i<чего там Х, будет вычисляться, и если это внутри функции происходит, а не вне ее, скажется на быстродействии. Можете проверить два варианта и сравнить.

  Ответить  
 
 автор: Keyses   (08.07.2009 в 02:28)   письмо автору
 
   для: sim5   (08.07.2009 в 00:58)
 

уже осознал :)

  Ответить  
Rambler's Top100
вверх

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