Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Фотогалерея на PHP и MySQL (http://forum.oszone.net/showthread.php?t=59031)

Plutonium 239 06-01-2006 10:40 389714

Фотогалерея на PHP и MySQL
 
Мне нужно сделать скрипт фотогалереи, чтобы к каждой фотке был комментарий, название и некоторые параметры, и чтобы можно было оценивать фотки, и чтобы можно было все это сортировать по любому параметру. Подскажите, плз, как это лучше сделать?
И вот еще, как лучше сделать для нескольких разрешений хранить несколько копий фотографии в разных разрешениях или одну в максимальном и при выборе разрешения, чтобы PHP фотку ресайзил? Мне больше нравиться второй вариант из-за экономии места, я примерно представляю как это сделать, но только примерно

Vlad Drakula 07-01-2006 10:56 389970

Plutonium 239
Цитата:

И вот еще, как лучше сделать для нескольких разрешений хранить несколько копий фотографии в разных разрешениях или одну в максимальном и при выборе разрешения, чтобы PHP фотку ресайзил? Мне больше нравиться второй вариант из-за экономии места, я примерно представляю как это сделать, но только примерно
а сервер достаточно мощьный???

Цитата:

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

Plutonium 239 07-01-2006 11:01 389973

Цитата:

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

а так всегда... никто не знает как что то деать точно... просто берут и делают... главное знать нужное направление!!!
так я и примерно не знаю, мне бы узнать это направление...

Plutonium 239 07-01-2006 17:54 390016

Кто-нибудь подскажите почему эта строчка
PHP код:

$db = new mysqli('localhost''plutonium''03jDn01''plutonium'); 

вызывает ошибку:
Цитата:

Fatal error: Cannot instantiate non-existent class: mysqli
и что нужно сделать, чтобы она заработала?

vadimiron 07-01-2006 20:31 390064

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

Igor_I 07-01-2006 23:07 390108

Цитата:

чтобы PHP фотку ресайзил
Это зря. Потому как GD сначала изображение распаковывает, то есть делает из него .bmp. А ты сам знаешь сколько они весят.
Вариант предложенный vadimiron лучше.
Насколько я понял mysqli создано для PHP5, оно есть на хостинге? Скорее всего там PHP4. А значит надо использовать mysql
Хотя если ты взял готовую систему, тогда надо было выбрать другой файл для базы.

Plutonium 239 08-01-2006 06:47 390206

Цитата:

Насколько я понял mysqli создано для PHP5, оно есть на хостинге? Скорее всего там PHP4. А значит надо использовать mysql
На хостинге MySQL 3 и PHP 4, а я читал учебник по пятым версиям:( Как теперь это все переделать?
Вот такая таблица у меня получилась:
PHP код:

create table foto
(    fotoid int unsigned not null auto_increment primary key,
    
file char(50not null,
    
name char(50not null,
    
authorid int unsigned,
    
date date not null,
    
foto_date date,
    
area tinyint unsigned
); 

Цитата:

а все варианты (то есть большая и маленькая картинка), должны знать скрипты, то есть просто создаём маленькую картинку с тем же самым именем, что и основная и храним в спец папке (типа "little_img")
Так и сделаю, а ресайз делать вообще не буду, пускай все картинки будут в максиальном разрешении.

Plutonium 239 08-01-2006 07:41 390213

Переделал код, но все равно не работает:( Пишет, что все нормально, один ряд добавлен, а в базе ничего не меняется:( В чем здесь ошибка?
PHP код:

$db mysql_connect("localhost""plutonium""03jDn01""plutonium");
    if (
mysqli_connect_errno($db))
    {
        echo 
"Не удалось подключиться к базе данных";
        exit;
    }
    
$query "insert into foto
                (file, name, authorid, area)
            values
                ($file, $name, $authorid, $area)"
;
    
$result mysql_query($query$db);
    echo 
mysql_affected_rows($db) . "записей добавлено";
    
mysql_close($db); 


Igor_I 08-01-2006 12:30 390254

Я был не прав. Вот небольшая статья о mysqli http://phpclub.ru/detail/article/mysqli
Цитата:

Так и сделаю, а ресайз делать вообще не буду, пускай все картинки будут в максиальном разрешении.
Это смотря сколько они весят и какие размеры картинок у тебя будут. Может сделать ручной ресайз будет сделать намного проще.
Цитата:

char(50)
Интересно почему - 50? Цифра круглая? :) VARCHAR (255) на мой взгляд - лучшее решение. Никто не знает какое имя файла будет в будущем.
http://dev.mysql.com/doc/refman/4.0/ru/char.html
Цитата:

В чем здесь ошибка?
В таких случаях пишу echo $query копирую сам запрос и бегом в phpMyAdmin - там выполняю этот запрос.
Хотя может http://php.rinet.ru/manual/ru/function.mysql-error.php было бы правильнее.

Plutonium 239 09-01-2006 07:59 390480

Переправил
PHP код:

$db mysql_connect("localhost""plutonium""03jDn01""plutonium"); 

на
PHP код:

$db mysql_connect("localhost""plutonium""03jDn01") or die("Could not connect : " mysql_error());
mysql_select_db("plutonium") or die("Could not select database"); 

и все заработало.
Цитата:

Это смотря сколько они весят и какие размеры картинок у тебя будут. Может сделать ручной ресайз будет сделать намного проще.
Все картинки 1600*1200 и весят 200-400Кб, я их решил ресайзить при загрузки вот этим кодом
PHP код:

$image $upfile;
  
$max_width 160;
  
$max_height 120;
  
  
$size GetImageSize($image);
  
$width $size[0];
  
$height $size[1];

  
$x_ratio $max_width $width;
  
$y_ratio $max_height $height;

  if ( (
$width <= $max_width) && ($height <= $max_height) ) {
    
$tn_width $width;
    
$tn_height $height;
  }
  else if ((
$x_ratio $height) < $max_height) {
    
$tn_height ceil($x_ratio $height);
    
$tn_width $max_width;
  }
  else {
    
$tn_width ceil($y_ratio $width);
    
$tn_height $max_height;
  }

  
$src ImageCreateFromJpeg($image);
  
$dst ImageCreate($tn_width,$tn_height);
  
ImageCopyResized($dst$src0000,
      
$tn_width,$tn_height,$width,$height); 

Цитата:

Интересно почему - 50? Цифра круглая?
Да, именно по этому:) Имена файлов будут типа 1.jpg 2.jpg и т.д. так, что бумаю 50 вполне хватит. А чем VARCHAR лучше, чем CHAR я не понял:unsure:

Еше нужно преобразовать дату из любого формата в формат MySQL, сделал вот так
PHP код:

$foto_date date('Y-m-d'strtotime($_POST['foto_date'])); 

но почему-то это не работает:unsure:

Underson 09-01-2006 12:49 390529

Цитата:

"plutonium", "03jDn01"
ты это серьезно если это твои реальные логины и пароли... УБЕЙ СЕЙ ЧАС ЖЕ... в текстах тоесть еще скажи где твой сайт расположен и тода вооще всем хорошо будет...
Цитата:

, что бумаю 50 вполне хватит. А чем VARCHAR лучше, чем CHAR я не понял
как те сказать просто varchar делает запись той длинны какой длинны у тя занечение переменной... а Char всегда максимальной в этом и разница... нагрузка на сервак увеличивается но размер базы уменьшается...
"1.jpg" в varchar(255) будет занимать 5 байт, а в char(50) ----> 50 б... а 255 это максимальная длинна записи...
поправте меня если я не прав

Plutonium 239 09-01-2006 15:51 390573

Цитата:

ты это серьезно если это твои реальные логины и пароли... УБЕЙ СЕЙ ЧАС ЖЕ... в текстах тоесть еще скажи где твой сайт расположен и тода вооще всем хорошо будет...
Да нет, это для теста, а сайт пока только у меня на компе расположен.

Igor_I 09-01-2006 20:41 390636

ImageDestroy() не забудь в таком случае.

Plutonium 239 14-01-2006 08:54 392229

Подскажите как сделать рейтинк картинок? Около кажной картинки 5 ссылок: от очень плохо до очень хорошо, как все это расчитывать чтобы получился грамотный рейтинг, а то у меня кроме средного бала ничего не выходит:(

XCodeR 14-01-2006 11:31 392262

Как сделал бы я:
В таблице фотографий добавил 2 поля - Mark и TotalVote.
При выводе результата(рейтинга) округлял цисло содержащееся в Mark и сравнивал его:
если 1 - ужасно, 2 - плохо, 3 - ..... и т.д.
При голосовании,
в переменные om и ov - содердимое тех полей
ms = om*ov;
ms = om + <новая оценка>;
nv=ov+1;//добавляем 1 к проголосовавшим
nm = ms/nv; // вычисоляем среднее арифметическое

nm & nv - в таблицу.

Или чтобы не заниматся округлением в таблице можно сделать типы полей INT

Есть другой вариант - сделать графический рейтинг(полоска с градиентом от красного - до зеленого)... немного ложнее, но красивше...

vadimiron 14-01-2006 12:57 392292

Я бы наверно сделал бы отельную таблицу с рейтингами, то есть ID картинки, ID юзера и выбранный рейтинг
Потом просто выбираем картинку которая нужна, и уже делим или суммируем, короче всё что угодно, также можно вывести статистику, сколько процентов каждый из рейтингов был выбран для той картинки, например сколько 2-ек или сколько 5-ок
Так как чаще всего сумма поделённое на количество нужно, я бы сделал VIEW, где бы хранил уже вычисленные средние значения, в 5-ом MySQL возможно даже такое можно автоматизировать с помощью тригеров, но здесь я уже не специалист.....

Plutonium 239 14-01-2006 18:15 392355

Сделал отдельно систему оценок и систему рейтинга. К таблице фоток добавил три поля: общая оценка, количество проголосовавших и рейтинг.
По количеству проголосовавших и общему количеству балов расчитывается средняя оченка.
Оценка выставляется от -1 до 1, и прибавляется к значению поля рейтинга, потом по нему тоблица сортируется.
А для его отображения расчитывается процентный рейтинг
PHP код:

$l $foto_rate_max $foto_rate_min;
$pr round(((($l - ($foto_rate_max $foto_rate)) / $l) * 100), 2); 

как-то запутано получилось, но рейтинг показывается в процентах, у картинки с самым низким рейтингом 0% с самым большим 100%.
А показывается все так:

Igor_I 14-01-2006 23:38 392445

Чего-то я ни фига не врубился в рейтинг ...
И как - оценка выставляется от -1 до 1, а средний балл - 6.46

Plutonium 239 15-01-2006 00:24 392467

Цитата:

Чего-то я ни фига не врубился в рейтинг ..
Я сам в нем путаюсь:)
Просто там балы отдельно от рейтинга. Балы выставляются 2-4-6-8-10 ужастно-плохо-средне-хорошо-отлично рейтинг -1 -0,5 0 0,5 1 соответственно.
Если за картинку проголосует один чел на отлично у нее средний бал будет 10, а ретинг ~50%.
Может и дизайн за одно зацените :shuffle: он правда по шаблону сделан, на большее времени нет
http://i29.photobucket.com/albums/c2...9/08bea896.jpg

Igor_I 15-01-2006 01:35 392494

Почему 50%? А 100% когда будет?

Plutonium 239 15-01-2006 07:28 392530

Цитата:

Почему 50%? А 100% когда будет?
проценты высчитываються исходя из того что 0% это картинка с самым низким значением рейтинга, а 100% - с самым низким, остальные между ними.
вопрос по дизайну: у меня есть два файла header.inc и footer.inc в них везде прописаны пути к картинкам так img/****.gif а подразделы находятся в разных каталогах и в них картинки не работают, как можно сделать чтобы пути в этих файлах менялись в зависимости от того где находится файл в который они вставлены.

Igor_I 15-01-2006 13:04 392593

плясать от начала сайта
<img src="../image/ .... > ../
либо пересмотреть скрипты, переместив их все в одну папку
http://www.htmlbook.ru/content/?id=9

vadimiron 15-01-2006 13:35 392603

Plutonium 239
используй абсолютные пути, папка с картинками у тебя же не меняется
создай файл с константами, который будет инклудится в каждый скрипт
там создай константу, типа SITE_ROOT, значение которой является $_SERVER['DOCUMENT_ROOT'] и ещё что то, если сайт лежит не в самом 'DOCUMENT_ROOT', далее нужна константа с путём к картинка, например
define("IMG_DIR",SITE_ROOT."/img");
и так далее

тогда проблем с путями не будет
Единственное, что нужно будет менять при изменении места жительства скрипта, так это путь от скрипта до файла, где определены все эти константы

----------------------------------------------------------------------------------------

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

Цитата:

проценты высчитываються исходя из того что 0% это картинка с самым низким значением рейтинга, а 100% - с самым высоким, остальные между ними.
Мне кажется это не совсем верно
100% эта картинка, у которой все отданные голоса равны максимальному значению, то есть если у тебя оценки от 1 до 5, то 100%-это когда все юзеры отдали 5 за данную фотку, соответственно и среднее значение будет 5

Underson 15-01-2006 14:00 392611

если ты пути используешь html а не в php тогда можно потупить проще вместо "img/***.gif" написать "/img/***.gif" и тогда эти пути будут работать правильно реботать, но это только в html ....

Igor_I 15-01-2006 14:54 392624

Цитата:

100% эта картинка, у которой все отданные голоса равны максимальному значению, то есть если у тебя оценки от 1 до 5, то 100%-это когда все юзеры отдали 5 за данную фотку, соответственно и среднее значение будет 5
Тогда зачем рейтинг, если средний балл и так 5?
Скажем по ТВ - 100% это вся аудитория, рейтинг передачи - это сколько человек смотрит передачу (в %)
vadimiron
А зачем так все усложнять с путями?

vadimiron 15-01-2006 15:26 392640

Цитата:

vadimiron
А зачем так все усложнять с путями?
При изменении названия папки с картинками надо будет только в одном заранее известном месте поменять название, а не бегать по всем скриптам и там изменять
Тоже самое относится если меняем путь к папке с картинками

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

Цитата:

Тогда зачем рейтинг, если средний балл и так 5?
Я честно говоря тоже не понимаю. Видя средний бал и зная какой бал максимальный он может поставить, юзер сам в голове примерно проценты подсчитает, проценты всегда сложней воспринимаются, так как встаёт сразу вопрос проценты относительно чего

Plutonium 239 16-01-2006 15:20 393098

Цитата:

используй абсолютные пути, папка с картинками у тебя же не меняется
создай файл с константами, который будет инклудится в каждый скрипт
там создай константу, типа SITE_ROOT, значение которой является $_SERVER['DOCUMENT_ROOT'] и ещё что то, если сайт лежит не в самом 'DOCUMENT_ROOT', далее нужна константа с путём к картинка, например
define("IMG_DIR",SITE_ROOT."/img");
и так далее

Так и сделал.
Цитата:

100% эта картинка, у которой все отданные голоса равны максимальному значению, то есть если у тебя оценки от 1 до 5, то 100%-это когда все юзеры отдали 5 за данную фотку, соответственно и среднее значение будет 5
А так и получается.
Рейтинг используется только для сортировки, если сортировать по среднему далу получается некорректно.
Допустим за 1 картинку проголосовало 10 человек все на 10 балов, средний бал будет 10.
А за другую проголосовала 100 человек, 99 на 10 балов, а один на 8, средний бал будет 9,98.
А рейтинг это просто общая сумма голосов за эту картинку.
Цитата:

если ты пути используешь html а не в php тогда можно потупить проще вместо "img/***.gif" написать "/img/***.gif" и тогда эти пути будут работать правильно реботать, но это только в html ....
а если html вставки в PHP?

Underson 16-01-2006 15:58 393114

Цитата:

а если html вставки в PHP?
а я про это и говорил... тоесть это работает когда путь прописан в HTML тегах... а когда в include то этот путь не такой путь не сработает... хотя vadimiron тоже дело говорит...

Plutonium 239 28-05-2006 11:57 443379

вот еще вопрос по той же теме
как определить картинку с максимальным рейтингом в каждом разделе, у мненя получилось только так, но это работает неправильно
PHP код:

SELECT areaidarea_namecommentfilecount(fotoid), max(rating)
FROM areafoto
where area
.areaid foto.area
GROUP BY area
.areaid 

нужно чтобы записи групировались по areaid и в каждой группе выбиралась картинка и максимальным значением rating.

Prisoner 28-05-2006 12:26 443390

Код:

SELECT
  `area`.`areaid`,
  `area`.`area_name`, 
  MAX(`foto`.`rating`) AS `max_cnt`
FROM
  `area`,
  `foto`
WHERE
  (`area`.`areaid` = `foto`.`area`)
GROUP BY
  `area`.`areaid`

Почти твой вариант... какие-то проблемы?

Plutonium 239 28-05-2006 13:31 443405

Prisoner
Цитата:

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

vadimiron 28-05-2006 13:38 443411

Plutonium 239
То есть выяснить для каждой категории, какая картинка из данной категории имеет самый высокий рейтинг??

mar 28-05-2006 13:40 443412

Plutonium 239
Prisoner
Для такой задачи необходима возможность задания запроса в запросе, или JOIN запроса, а не всей таблицы. Боюсь, что это задача не для mysql и надо с ней справляться mysql+php

Plutonium 239 28-05-2006 13:49 443414

Цитата:

То есть выяснить для каждой категории, какая картинка из данной категории имеет самый высокий рейтинг??
да именно так, чтобы вывести табличку тип: категория такая-то и картинка эта и .т.п.
mar
Цитата:

Для такой задачи необходима возможность задания запроса в запросе, или JOIN запроса, а не всей таблицы. Боюсь, что это задача не для mysql и надо с ней справляться mysql+php
И как бы это сделать?

vadimiron 28-05-2006 20:13 443503

А так не пройдёт???

PHP код:

SELECT
  area
.areaid,
  
area.area_name,  
  
foto.rating
FROM
  area
,
  
foto
WHERE
  
(area.areaid foto.area)
GROUP BY
  area
.areaid
HAVING MAX
(foto.rating


Plutonium 239 29-05-2006 12:30 443730

vadimiron
Цитата:

А так не пройдёт???
А так вообще ничего не выдает.

mar 29-05-2006 13:23 443755

Цитата:

mar
Цитата:
Для такой задачи необходима возможность задания запроса в запросе, или JOIN запроса, а не всей таблицы. Боюсь, что это задача не для mysql и надо с ней справляться mysql+php

И как бы это сделать?
Брать результаты запроса по данным раздела и в цикле на php делать запрсы с выявлением максимального зачения по каждому разделу. Криво, но для mysql (нестарших версий), иначе по-моему, не получится.


Время: 12:28.

Время: 12:28.
© OSzone.net 2001-