[Mysql]Fotoalbum*

Pagina: 1
Acties:

  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
Sorry, vergeten titel te geven, graag "[Mysql]Fotoalbum" van maken

Ik ben een fotoalbum aan het maken met php en mysql. Nu heb ik het zo dat mensen kunnen inloggen en dat deze ingelogde leden tot een bepaalde groep behoren. De groepen hebben indexnr 1 tm x. (Moet uitbreidbaar zijn). Nu wil ik zorgen dat van iedere foto ingesteld kan worden welke groepen toegang hebben tot deze groep. Als maar een enkele groep toegang zou hebben zou het eenvoudig zijn.

code:
1
2
3
4
idx  | foto   | groepid
-----+--------+-----------
1    | 1.jpg  |  2
...  |   ...  | ...

PHP:
1
mysql_query("SELECT * FROM fotos WHERE groepid=2")

Dit geeft een lijst met alle foto's tot die groep. Hieruit kan gemakkelijk het aantal fotos bepaald worden zodat het aantal pagina's bekend is enz.

Maar nu wil ik dat meerdere groepen toegang hebben tot 1 foto, bijv. dat groep 2, 3, en 8 toegang hebben tot 1.jpg. Nu zijn er een aantal opties.
-Dmv serialize een lijst met groepen in te tabel zetten, dus onder groepid bv serialize(array(2,3,8)) wegschrijven. Het opzoeken is alleen niet makkelijk, je moet namelijk met php heel de lijst doorlopen en unserializen om uit te vinden of de foto bekeken mag worden, en het aantal foto's bepalen ed kost veel tijd.
-Een andere mogelijkheid is dat je iedere mogelijke combinatie van groepen een eigen nummer geeft en in een aparte tabel aangeeft welke groepen bij een bepaald nummer horen. Dit lijkt me niet geschikt omdat je voor 10 groepen al 1024 combinaties hebt. Bovendien werkt het uitzoeken van welke fotos bekeken mogen worden ook hier niet echt makkelijk.
-Tijdens het typen hiervan bedenk ik ineens een nieuwe optie, die nog het meest geschikt is. Elke foto gewoon meerdere keren in de lijst opnoemen voor iedere groep die toegang heeft, dus:
code:
1
2
3
4
5
6
7
idx  | foto  | groepid
-----+-------+-----------
1    | 1.jpg |  2
2    | 1.jpg |  3
3    | 1.jpg |  8
4    | 2.jpg |  5
...  |   ... | ...

-En na het typen hiervan bedenk ik een nog betere optie, 2 tabellen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
idx | foto             
-----+--------
1    | 1.jpg
2    | 2.jpg 
...  |   ...  


fotoidx  | groep
---------+---------
  1      |    2
  1      |    3
  1      |    8
  2      |    5
  ...    |   ...



Toch post ik dit verhaal om te zien of er misschien nog een betere optie is en daarnaast heb ik nog een ander probleem:

Op dit moment hebben de foto's gewone benamingen van de fotocamera: IMG1024.JPG oid en verder. Als een foto niet bekeken mag worden door bepaalde groepen is het toch vrij gemakkelijk de directory op te zoeken en de naam van de volgende foto te raden en zo te bekijken.

Om dit op te lossen zou je alle foto's random kunnen hernoemen en hier een script voor maken wat de namen in de db opslaat. Dit maakt nogal een zooitje van de directory.
Of met functies als file_get_contents($filename) de inhoud moeten echo'en. Ik heb nog geen optie geprobeerd omdat ik eerst wou kijken wat de beste optie is en of er misschien nog andere opties zijn.

Dus vooral, hoe kan ik het 2e probleem het beste aanpakken?

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:35
Lees eens iets over normaliseren, en je zult gauw zien hoe je een dergelijk probleem moet oplossen: met een extra tabel nl. waarin je meegeeft welke groepen er toegang hebben tot die foto. Hetgeen je laatst bedacht hebt dus.

Je serialize manier, of de boel dmv een comma-separated list opslaan is hoegenaamd geen goede manier: lastig te onderhouden en traag.
Dus vooral, hoe kan ik het 2e probleem het beste aanpakken?
De foto's opslaan in de DB zelf, ipv een verwijzing naar het bestand op schijf op te slaan ?

https://fgheysels.github.io/


  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 27-01 18:54

MAX3400

XBL: OctagonQontrol

http://www.devarticles.com/cp/bio/Frank-Manno/

En dan even kijken naar de artikelen die deze fijne man geschreven heeft; hier kan je vast wel iets handigs uit halen...

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
whoami schreef op dinsdag 15 augustus 2006 @ 20:52:
[...]
De foto's opslaan in de DB zelf, ipv een verwijzing naar het bestand op schijf op te slaan ?
Ik had niet bedacht dat dit ook kon. Maar dit maakt de DB wel zeer snel erg groot. Dan zou ik eerst moeten kijken hoe het staat met de limieten van de DB op de server waar ik het zooitje op host. En is dit ook nog een goed idee als ik van iedere foto een 1mb groot exemplaar beschikbaar wil stellen voor mensen die de foto willen laten afdrukken?

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 02-01 15:55
2_05 schreef op dinsdag 15 augustus 2006 @ 20:59:
[...]

Ik had niet bedacht dat dit ook kon. Maar dit maakt de DB wel zeer snel erg groot. Dan zou ik eerst moeten kijken hoe het staat met de limieten van de DB op de server waar ik het zooitje op host. En is dit ook nog een goed idee als ik van iedere foto een 1mb groot exemplaar beschikbaar wil stellen voor mensen die de foto willen laten afdrukken?
De bestanden nemen in je database net zoveel ruimte in als op schijf hoor, dus het maakt dan niet uit waar het opgeslagen staat.. Bij de meeste hosting providers is het trouwens zo dat al je data (dus ook je database) bij je schijfruimte gebruik geteld wordt.

If I can't fix it, it ain't broken.


  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
Ik heb even gezocht op plaatjes in DB zetten, over het algemeen bleek hierbij de conclusie dat een link in de DB naar het betreffende plaatje het snelst is. Maar daarmee verraad je je locatie dus. De discussie van DB versus file_get_contents($filename) ben ik nog niet tegengekomen.

Daarom, puur naar snelheid gekeken, is opslaan in de DB dan sneller, of laden dmv file_get_contents($filename)?

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 20:26
Filesystem zal (bijna) altijd sneller zijn vanwege de geringe overhead, het enige wat je doet is het plaatje door sturen.

Waarom zit je erzo mee dat de locatie van het plaatje wordt verraden? Ik neem aan dat je het in PHP gaat maken, dan kun je ook een speciale PHP pagina maken die alleen voor het plaatje zorgt. Waarbij je aan die pagina een parameter meegeeft wat ie op moet halen.

In je business logica kun je kan wel fatsoenlijk nagaan of die binnen komende request mag of niet. Ook hoef je op deze manier niet direct een verwijzen te maken tussen de daadwerkelijke locatie van de plaatjes.
Het enige wat je in de browser ziet kwa html is bijvoorbeeld:
code:
1
<p><img src="plaatje.php?id=123456789"></p>

  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
Sybr_E-N schreef op dinsdag 15 augustus 2006 @ 21:59:
Waarom zit je erzo mee dat de locatie van het plaatje wordt verraden?
Niet zozeer dat de locatie uitmaakt, maar dat mensen kunnen gaan raden en zo plaatjes kunnen zien waar ze geen toegang tot hebben.

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 02-01 15:55
2_05 schreef op dinsdag 15 augustus 2006 @ 22:10:
[...]

Niet zozeer dat de locatie uitmaakt, maar dat mensen kunnen gaan raden en zo plaatjes kunnen zien waar ze geen toegang tot hebben.
Dat dien je dan met een degelijke rechtenstructuur op te lossen, dat staat los van waar de plaatjes opgeslagen zijn.

If I can't fix it, it ain't broken.


  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
Borizz schreef op dinsdag 15 augustus 2006 @ 22:27:
[...]


Dat dien je dan met een degelijke rechtenstructuur op te lossen, dat staat los van waar de plaatjes opgeslagen zijn.
En die rechtenstructuur zal ik toch in een DB moeten verwerken, het is namelijk niet zo dat niemand anders een bepaalde foto mag zien, maar persoon x die foto wel mag zien, en persoon y niet, maar weer n andere foto wel.

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 02-01 15:55
Als je dat weet dan heb je eigenlijk toch geen probleem, dan heeft het raden van plaatjes geen zin omdat ze ze toch niet kunnen bekijken. Of zie ik het nou verkeerd :? ?

If I can't fix it, it ain't broken.


  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
Borizz schreef op dinsdag 15 augustus 2006 @ 23:00:
Als je dat weet dan heb je eigenlijk toch geen probleem, dan heeft het raden van plaatjes geen zin omdat ze ze toch niet kunnen bekijken. Of zie ik het nou verkeerd :? ?
Zodra ik de filedirectory verborgen kan houden of de plaatjes in een DB heb gezet wel ja. Kijk, als je weet dat r een foto "www.iets.nl/bla/1.jpg" bestaat, en de volgende foto die je te zien krijgt weet je dat ie "www.iets.nl/bla/3.jpg" omdat ik niet wil dat die persoon 2.jpg te zien krijgt gaat die persoon wel bedenken dat "www.iets.nl/bla/2.jpg" misschien ook wel eens zou kunnen bestaan. Dan zijn mijn instellingen om plaatjes voor bepaalde categorien personen verborgen te houden zinloos. Als de locatie eenmaal omgevormd is naar "www.iets.nl/bla/foto.php?foto=1" dan is raden zinloos want dan kan ik de rechten controleren.

[ Voor 8% gewijzigd door 2_05 op 15-08-2006 23:54 ]


  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
Wat je simpelweg moet doen is de foto's in een dir zetten waar enkel php bijkan, desnoods in een dir buiten ./httpdocs/ om.

Daarna maak je een php-script dat een foto inleest en opnieuw output aan de hand van het fotoid (de link waar de foto staat en het id staat al in een db). Gevolg:
- foto éénmaal op server in orig grootte
- verschillende versies (thumbs tem volledige grootte) mogelijk

Om dit script dan op te nemen, zie reactie Sybr_E-N.

Op die manier kan niemand de locatie ontdekken én bespaar je bandbreedte of serverspace. Vraagt wel wat meer power van de server natuurlijk.

  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
moozzuzz schreef op woensdag 16 augustus 2006 @ 10:50:
Wat je simpelweg moet doen is de foto's in een dir zetten waar enkel php bijkan, desnoods in een dir buiten ./httpdocs/ om.
Het lukt me om foto's buiten de /httpdocs/ dir te plaatsen en die via php te laten zien.

Het lukt me alleen niet om een foto in de /httpdocs/ dir te zetten en dmv permissies in ftp te zorgen dat het plaatje alleen te zien is via een php script en niet door de url van het plaatje zelf in te typen.

Daarnaast lukt het me ook niet php-files te includen die buiten de /httpdocs/ dir staan of die dmv permissies in ftp zijn geblokkeert om rechtstreeks te openen.

Nou ben ik benieuwd of dit op een of andere manier wel mogelijk is?

  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
Klein schopje, ik ben met mijn fotoalbum op een nieuw probleempje gestuit, om niet de hele opzet opnieuw te hoeven uitleggen ga ik in dit topic verder: (en misschien dat iemand het antwoord nog weet op mijn post hierboven)

ik heb nu dus de volgende tabel:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
tabel:groep
idx | groep             
-----+--------
1    | groep1
2    | groep2
...  |   ...  


tabel: foto
idx | foto             
-----+--------
1    | 1.jpg
2    | 2.jpg 
...  |   ...  

tabel:fototoegang
fotoidx  | groep   | toegang
---------+---------+--------
  1      |    2    |   0
  1      |    3    |   2
  1      |    8    |   1
  2      |    5    |   1
  ...    |   ...   |  ...


Nu wil ik de admin kunnen laten kijken welke groepen allemaal toegang hebben tot een bepaalde foto (ik heb 3 categorieen van toegang), dit kan alsvolgt
PHP:
1
$query="SELECT * FROM groep LEFT JOIN fototoegang ON groep.idx=fototoegang.groep WHERE fotoids='".$id."'";

Dan krijg ik het volgende lijstje:
code:
1
2
3
4
 groep   | toegang
   2     |    0
   3     |    2
   5     |    1

Maar nu wil ik ervoor zorgen dat de query ook de groepen selecteerd die niet in de fototoegang tabel staan, dus bv als ik alle groepen met hun toegang tot foto 1 wil zien wil ik het volgende lijstje krijgen:

code:
1
2
3
4
5
6
 groep   | toegang
   1     |   NULL
   2     |    0
   3     |    2
   4     |  NULL
   5     |    1


Kan de query dusdanig gemaakt worden dat ik dat lijstje krijg, zonder dat ik iedere groep/foto combinatie moet toevoegen aan het lijstje. (dit wil ik namelijk niet doen om de grootte van de tabel beperkt te houden, daarom laat ik groepen die de foto toch niet mogen zien uit het lijstje)

  • AndriesLouw
  • Registratie: December 2005
  • Laatst online: 17:42
.htaccess
code:
1
2
3
order allow,deny
allow from 127.0.0.1
deny from all


Dat zou je in een directory kunnen plaatsten waar je de afbeeldingen in wil zetten. Zo kan alleen de server (PHP o.a.) de afbeeldingen uitlezen.

Verder zul je dus met de koppeltabel moeten werken (je laatst genoemde optie in de SP), omdat je een veel-veel relatie hebt (meerdere afbeeldingen kunnen in 1 groep, maar 1 afbeelding kan meerdere groepen hebben).

Specificaties | AndriesLouw.nl


  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
AndriesLouw schreef op woensdag 06 september 2006 @ 22:18:
Verder zul je dus met de koppeltabel moeten werken (je laatst genoemde optie in de SP), omdat je een veel-veel relatie hebt (meerdere afbeeldingen kunnen in 1 groep, maar 1 afbeelding kan meerdere groepen hebben).
Van die koppeltabel maak ik inmiddels dus gebruik, maar het gaat er nu om dat ik bovenstaand lijstje daaruit kan pakken.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 21:42

MBV

kijk eens naar de verschillende join mogelijkheden in de Mysql manual. Ik dacht dat dit een left join was:
SQL:
1
2
3
select * 
from groep g
left join fototoegang f on f.fotoidx = g.idx

maar ik werk daar pas sinds kort mee (leraar vond 'where x.id=y.id leuker, en heb nooit zoveel databases nodig gehad), dus pin me er niet op vast.

  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
Mogelijke oplossing is denk ik wel:
PHP:
1
2
3
4
5
6
7
8
$query="SELECT * FROM groep LEFT JOIN fototoegang ON groep.idx=fototoegang.groep";
$result=mysql_query($query);

while($fetch=mysql_fetch_array($result){
  if($fetch['fotoidx']==1||$fetch['fotoidx']==''){
    //..doe iets
  }
}

Maar ik zou dus graag die if() verwerken in de query.

Verwijderd

where fotoidx = 1 or fotoidx is null
?

  • 2_05
  • Registratie: November 2004
  • Laatst online: 18:33
Verwijderd schreef op donderdag 07 september 2006 @ 17:59:
where fotoidx = 1 or fotoidx is null
?
Ja, dat zocht ik, dank. Ik had wel WHERE fotoidx=1 OR fotoidx='' geprobeerd, maar met "is null" werkt t wel.
Pagina: 1