Fotoalbums met MySQL
Ok, en ja ik weet het, er zijn tientallen fotoalbums op het internet te vinden.. Maar ik vond het allemaal niet fantastisch, dus heb ik zo'n 2-3 maanden terug mijn eigen foto-album script gescript. Ik weet dat er zeker punten zijn voor verbetering. Dit hoeven jullie dus niet te melden. O.a.: - Whiles gebruiken terwijl dit niet nodig is - mysql_fetch_object i.p.v. mysql_fetch_array o.i.d. - $_GET i.p.v. $_GET['vb']; Toch wilde ik het perse even plaatsen op PHPhulp omdat ik graag wil weten hoe chaotisch jullie mijn script-stijl vinden! Anyway, check it out. -- Thumbnail.php heb ik hier ergens van de site gehaald. Alle dank/rechten gaan naar die gene van wie het oorspronkelijk is. Aanwijzingen: Maak een map aan genaamd 'fotomap', plaats daarin de mappen met je foto's! Zo'n 'structuur' zou dat dus moeten zijn:
Mysql tabellen:
[code]CREATE TABLE `foto_album` (
`id` int(4) NOT NULL auto_increment,
`naam` varchar(255) NOT NULL default '',
`datum` varchar(255) NOT NULL default '',
`map` varchar(255) NOT NULL default '',
`views` int(4) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 AUTO_INCREMENT=115 ;
CREATE TABLE `foto_album_foto` (
`id` int(4) NOT NULL default '0',
`bestand` varchar(255) NOT NULL default '',
`album` tinyint(4) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
[/code]
[b]Fotoboek.php / index.php / maakt_niet_uit_eigenlijk.php[/b]
[code]<?php
/* (c) Stefanuzz.nl
/* Dit script is gratis te gebruiken
/* Cool toch?
*/
// De syntax iets is belangrijk! (Geen idee waar ik syntax vandaan heb, gebruik de meest rare worden altijd..)
// Door middel van ?foto=[albumnr].[album_foto_nr] gaan wat we wel niet moeten doen
// Door explode te gebruiken splits ik dus alles
$syntax = $_GET[foto];
$syntax = explode(".", $syntax);
// Overzicht start
if($_GET[foto] == "overzicht"){
// Titel
echo '<span style="font-size:16px;">Foto-albums</span><br /><br />';
// Alle files in een array zetten
$files = glob("fotomap/*");
// Foreach loop
foreach($files as $f){
// Haal fotomap er uit
$f = str_replace("fotomap/", "", $f);
// Select query
$select = "SELECT * FROM foto_album WHERE map = '" . $f . "'";
$query = mysql_query($select);
// Als de map niet bestaat, inserten!
if(mysql_num_rows($query) < 1){
$insert = "INSERT INTO foto_album (id, naam, datum, map) VALUES ('', '" . $f . "', '".date('Y').".".date('m').".".date('d')."', '" . $f . "')";
$res = mysql_query($insert);
// Anders niks doen
}else{
}
}
// Select nu alle albums
$select_albums = "SELECT * FROM foto_album ORDER BY datum DESC";
$query_albums = mysql_query($select_albums);
// Even tellen
$albums = mysql_num_rows($query_albums);
// Zijn er geen fotoboeken? Dan dat melden!
if($albums < 1){
echo 'Er zijn geen fotoboeken beschikbaar op dit moment';
// Anders alles uitpersen!
}else{
// While met de query
while($list = mysql_fetch_object($query_albums)){
if(is_dir('fotomap/' . $list->map)){
// Bestaat de dir? Dan niks doen a.u.b.
// Aantal albums het zelfde houden
$albums = $albums;
}else{
// De dir bestaat niet omdat deze zojuist is verwijderd? Dan kwakken we de album uit de database!
$delete = "DELETE FROM foto_album WHERE id = '" . $list->id . "'";
$res2 = mysql_query($delete);
// Aantal albums - 1
$albums = $albums - 1;
}
// Zijn er geen fotoalbums?
if($albums < 1){
echo 'Er zijn geen fotoboeken beschikbaar op dit moment';
// Anders gaan we nu de hele zooi er uit persen!
}else{
// Wat CSS uitspugen
echo '<table style="border:1px solid #CCCCCC; width:90%;" onClick="window.location.href=\'?foto=' . $list->id . '\'">';
// Nu komt het leuke werk; we gaan een thumbnailtje verzorgen.
$fotos = glob("fotomap/" . $list->map . "/*");
// Is er eigenlijk wel een foto in de map?
if(!$fotos){
echo '<tr><td style="border:1px solid #CCCCCC;"><a href="?foto=' . $list->id . '"><img src="gfx/geenthumb.png" border="0" /></a></td>';
}else{
// Anders zorgen we er voor dat er een thumb komt..
$a = "0";
// Zorg voor een thumb dan!
foreach($fotos as $f){
// Als het aantal thumbnails dat geplaatst is, nog steeds 0 is, dan kunnen we verder.
if($a == "0"){
// In Windows wordt er - als je in een map in je verkenner - nog wel eens thumb.db aangemaakt. Deze willen we natuurlijk niet zien.
if($f == "Thumbs.db"){
// En anders echo'en we de thumbnail! (Met nog wat CSS)
}else{
echo '<tr><td style="text-align:center; width:150px; height:150px;"><a href="?foto=' . $list->id . '"><img src="thumbnail.php?im=' . $f . '&maxsize=150" border="0"></a>';
echo '</td>';
// Tel het aantal geplaatste thumbnails + 1 (Dit kan nooit meer worden dan 1)
$a++;
}
// Als er nog geen thumbnails zijn geplaatst, is het getal 0. Nu is het getal waarschijnlijk 1 of groter.
}else{
// Echo niks
}
}
}
// Nu nog even netjes de datum er bij zetten waarop we het album geplaatst werd
$datum = explode (".", $list->datum);
// Ja sorry, er zat nog wat CSS in..
echo '<td style="width:*; text-align:center;"><a href="?foto=' . $list->id . '" class="fotoalbum">' . $list->naam . '</a><br /><span style="color:#CCCCCC;">' . $datum[2] . ' ' . maand($datum[1]) . ' ' . $datum[0] . '</span><br /><a href="?foto=' . $list->id . '">Bekijk nu »</a></td></tr>';
}
echo '</table><br />';
}
}
// Hiep hoi, het fotoboeken overzicht nu gehad. Nu gaan we knutselen met een foto...
// Als het eerste stuk voor de punt een cijfer is en het er na ook, dan weet ik zeker dat we een foto willen zien..
}elseif(is_numeric($syntax[0]) && is_numeric($syntax[1])){
// Selecteer de foto uit de database
$select = 'SELECT * FROM foto_album_foto WHERE id = "' . $syntax[1] . '" && album = "' . $syntax[0] . '"';
$query = mysql_query($select);
// Bestaat de foto eigenlijk wel?
if(mysql_num_rows($query) > 0){
// Nu gaan we uitzoeken uit welk album dit foto'tje komt
$select2 = 'SELECT * FROM foto_album WHERE id = "' . $syntax[0] . '"';
$query2 = mysql_query($select2);
// VEROUDERD! Ik weet het.. ik gebruikte altijd fetch_object, dat schijnt wel wat trager te zijn... ach., ik denk dat een niet php-fanaat er niet al te moeilijk over doet.
$list = mysql_fetch_object($query);
$list2 = mysql_fetch_object($query2);
// Laat maar zien uit welk foto deze album komt
echo '<span style="font-size:16px;">Foto uit album "' . $list2->naam . '"</span><br /><br />';
// Uiteraard! Laat de foto zien
echo '<img src="' . $list->bestand . '">';
// Terug naar het overzicht knopje is altijd fijn
echo '<br /><br /><a href="?foto=' . $syntax[0] . '#' . $syntax[1] . '">« Terug naar overzicht</a>';
echo '<br /><table>';
// Nu gaan we even kijken welke foto voor deze foto zat..
$aantalfotominder = "SELECT * FROM foto_album_foto WHERE album = '" . $syntax[0] . "' AND id < '" . $syntax[1] . "' ORDER BY id DESC LIMIT 1";
$queryfotominder = mysql_query($aantalfotominder);
// Ja, ff in een while zetten dan maar? Beetje onnodig, maar ja, verouderd..
while($lista = mysql_fetch_object($queryfotominder)){
$back1 = $lista->id;
$back1_bestand = $lista->bestand;
}
// En nu kijken we welke foto er voor de foto zat die voor de huidige foto zat..
$aantalfotominder2 = "SELECT * FROM foto_album_foto WHERE album = '" . $syntax[0] . "' AND id < '" . $back1 . "' ORDER BY id DESC LIMIT 1";
$queryfotominder2 = mysql_query($aantalfotominder2);
// Inderdaad, in een while
while($listb = mysql_fetch_object($queryfotominder2)){
$back2 = $listb->id;
$back2_bestand = $listb->bestand;
}
// Nu kijken we welke foto er na deze foto zit
$aantalfotomeer1 = "SELECT * FROM foto_album_foto WHERE album = '" . $syntax[0] . "' AND id > '" . $syntax[1] . "' ORDER BY id ASC LIMIT 1";
$queryfotomeer1 = mysql_query($aantalfotomeer1);
while($listc = mysql_fetch_object($queryfotomeer1)){
$meer1 = $listc->id;
$meer1_bestand = $listc->bestand;
}
// En kijken we welke foto er na de foto zit die na deze huidige foto komt.
$aantalfotomeer2 = "SELECT * FROM foto_album_foto WHERE album = '" . $syntax[0] . "' AND id > '" . $meer1 . "' ORDER BY id ASC LIMIT 1";
$queryfotomeer2 = mysql_query($aantalfotomeer2);
while($listd = mysql_fetch_object($queryfotomeer2)){
$meer2 = $listd->id;
$meer2_bestand = $listd->bestand;
}
// Nog even het id'tje krijgen van het huidige fotoalbum. Als iemand zomaar wat heeft ingetypt in de adresbalk, komt er niks uit de query en krijg je dus een error.
$falbum = mysql_query("SELECT id FROM foto_album_foto WHERE album = '" . $syntax[0] . "'");
// Uh wat ik hier mee moet weet ik zelf niet eens meer..
$query10 = mysql_query("SELECT * FROM foto_album_foto WHERE album = '" . $syntax[0] ."' ORDER BY id DESC limit 1");
$list10 = mysql_fetch_object($query10);
// Nu kijken we of er daadwerklijk een foto voor de foto zat die voor deze foto zit.. (ingewikkeld? Nee hoor!)
if(strlen($back2) < 1){
echo '<tr><td style="text-align:center; width:75px; height:75px;"> </td>';
}else{
echo '<tr><td style="text-align:center; width:75px; height:75px;"><a href="?foto=' . $syntax[0] . '.' . $back2 . '#' . $back2 . '"><img src="thumbnail.php?im=' . $back2_bestand . '&maxsize=75" border="0" /></a></td>';
}
// Doen we dat zelfde nu, maar dan met de foto voor de huidige foto
if(strlen($back1) < 1){
echo '<td style="text-align:center; width:75px; height:75px;"> </td>';
}else{
echo '<td style="text-align:center; width:75px; height:75px;"><a href="?foto=' . $syntax[0] . '.' . $back1 . '#' . $back1 . '"><img src="thumbnail.php?im=' . $back1_bestand . '&maxsize=75" border="0" /></a></td>';
}
// De huidige foto
echo '<td style="text-align:center; width:75px; height:75px;"><img src="thumbnail.php?im=' . $list->bestand . '&maxsize=75" border="0" /></td>';
// Is er wel een foto hier na?
if(strlen($meer1) < 1){
echo '<td style="width:75px; height:75px;"></td>';
}elseif($meer1 == $syntax[1]){
echo '<td style="width:75px; height:75px;"></td>';
}else{
echo '<td style="text-align:center; width:75px; height:75px;"><a href="?foto=' . $syntax[0] . '.' . $meer1 . '#' . $meer1 . '"><img src="thumbnail.php?im=' . $meer1_bestand . '&maxsize=75" border="0" /></a></td>';
}
// En is er eigenlijk wel een foto na de foto hier na?
if(strlen($meer2) < 1){
echo '<td style="width:75px; height:75px;"></td>';
}elseif($list10->id == $syntax[1]){
echo '<td style="width:75px; height:75px;"></td>';
}else{
echo '<td style="text-align:center; width:75px; height:75px;"><a href="?foto=' . $syntax[0] . '.' . $meer2 . '#' . $meer2 . '"><img src="thumbnail.php?im=' . $meer2_bestand . '&maxsize=75" border="0" /></a></td></tr>';
}
// Dan nog even de tekst gevallen echo'en.
if(strlen($back2) < 1){
echo '<tr><td style="text-align:center;"></td>'; }
else{
echo '<tr><td style="text-align:center;"><a href="?foto=' . $syntax[0] . '.' . $back2 . '#' . $back2 . '"><< Daarvoor</a></td>'; }
// Dan nog even de tekst gevallen echo'en.
if(strlen($back1) < 1){
echo '<td style="text-align:center;"></td>';
}else{
echo '<td style="text-align:center;"><a href="?foto=' . $syntax[0] . '.' . $back1 . '#' . $back1 . '">< Vorige</a></td>';
}
// Dan nog even de tekst gevallen echo'en.
echo '<td style="text-align:center;">Huidige</td>';
// Dan nog even de tekst gevallen echo'en.
if(strlen($meer1) < 1){
echo '<td style="text-align:center;"></td>';
}else{
echo '<td style="text-align:center;"><a href="?foto=' . $syntax[0] . '.' . $meer1 . '#' . $meer1 . '">Volgende ></a></td>';
}
// Dan nog even de tekst gevallen echo'en.
if($list10->id == $syntax[1]){
echo '<td style="text-align:center;"></td></tr>';
}
elseif(strlen($meer2) < 1){
echo '<td style="text-align:center;"></td></tr>';
}else{
echo '<td style="text-align:center;"><a href="?foto=' . $syntax[0] . '.' . $meer2 . '#' . $meer2 . '">Daarna >></a></td></tr>';
}
echo '</table>';
// En voor de gebruiksvriendelijkheid nog een fijne terug knop.
echo '<br /><br /><a href="?foto=' . $syntax[0] . '#' . $syntax[1] . '">« Terug naar overzicht</a>';
}else{
// Soms gaat het wel eens de soep in, daar heb ik even een error voor :-)
echo '<span class="titel_error" style="color:red;">ERROR - Er deed zich een fout voor...</span><br /><br />
Er ging iets fout. Waarschijnlijk bestaat deze album niet, of bestaat de foto die bij deze album hoort niet.<br /><br />
<a href="?foto=overzicht">Ga terug en probeer het opnieuw.</a> ++ Fout: Foto&Album bestaat niet.';
exit();
}
// Nu nog even een overzichtje maken van de foto's die in een album staan
}elseif(is_numeric($_GET[foto])){
// Selecteren album
$select = "SELECT * FROM foto_album WHERE id = '" . $_GET[foto] . "'";
$query = mysql_query($select);
// $list defieneren
$list = mysql_fetch_object($query);
echo '<span class="titel_kop">Foto-album "' . $list->naam . '"</span><br /><br />';
// Alle files in $bestanden zetten
$bestanden = glob("fotomap/" . $list->map . "/*");
$inserts = "0";
$fotonr = "1";
// Foreach loop beginnen
foreach($bestanden as $b){
// Selecteren van foto uit database
$select_foto = "SELECT * FROM foto_album_foto WHERE bestand = '" . $b . "'";
$query_foto = mysql_query($select_foto);
// Als foto in database staat, niks doen
if(mysql_num_rows($query_foto) > 0){
echo '<!-- Bestand: ' . $b . ' -> Foto staat in database -->';
// Anders in database zetten.
}else{
$select_laatste = "SELECT * FROM foto_album_foto ORDER BY id DESC LIMIT 1";
$query_laatste = mysql_query($select_laatste);
while($list_laatste = mysql_fetch_object($query_laatste)){
$laatste = $list_laatste->id;
}
// Laatste id opzoeken.. tja.. daar hebben we ook auto_increment voor, maar dat werkte niet echt..
$laatste++;
// En nog even de insert dan..
$insert = "INSERT INTO foto_album_foto (id, bestand, album) VALUES ('" . $laatste . "', '" . $b . "', '" . $_GET[foto] . "')";
$res = mysql_query($insert);
if($res){
echo '<!-- Bestand: ' . $b . ' -> Foto staat niét in database > Foto in database gezet. -->';
$inserts++;
}else{
echo '<!-- Bestand: ' . $b . ' -> Foto staat niét in database > Foto kon niet in de database gezet worden. -->';
}
}
}
// Mooi, de controles nu gehad, nu gaan we de lijst met foto's
$select3 = "SELECT * FROM foto_album_foto WHERE album = '" . $_GET[foto] . "'";
$query3 = mysql_query($select3);
// Zijn er meer dan 0 foto's?
if(mysql_num_rows($query3) > 0){
// We beginnen met tellen!
$count = "0";
echo '<table width="100%">';
// While dan maar!
while($list3 = mysql_fetch_object($query3)){
// Als de count 0 is, betekent dat dat we een nieuwe rij moeten beginnen
if($count == 0){
echo '<tr><td width="25%">';
// En anders gewoon een nieuwe cel
}else{
echo '<td>';
}
// Nu even de thumb laten zien
echo '<a href="?foto=' . $_GET[foto] . '.' . $list3->id . '.' . $fotonr . '"><img src="thumbnail.php?im=' . $list3->bestand . '" border="0" /></a>';
// Als we nu trouwens op count = 3 zitten, moeten we de rij afsluiten.
if($count == 3){
echo '</td></tr>';
$count = "0";
// En anders alleen de cel zelf.
}else{
echo '</td>';
$count++;
}
// Tellen we nog even de hoeveelste deze foto wel niet was..
$fotonr++;
}
// En de tabel nog ff dicht..
echo '</table>';
// Stonden er toch geen foto's in? Dan even dat melden
}else{
echo 'Geen foto\'s gevonden voor in deze album';
}
// Nu nog even wat stats fabriceren.. dank u
echo '<b>Aantal foto\'s:</b> ' . mysql_num_rows($query3) . '<br /><b>Aantal foto al in database:</b> ' . (mysql_num_rows($query3) - $inserts) . '<br /><b>Aantal foto in database gezet:</b> ' . $inserts . '<br /><br /><a href="?foto=overzicht">« Terug naar het overzicht</a>';
// En ja, als er niks is ingevuld, dan gaan we je doorversturen naar het overzicht!
}else{
echo '<span class="titel_error">ERROR - Er deed zich een fout voor...</span><br /><br />
<a href="?foto=overzicht">Je wou waarschijnlijk naar het overizcht? Klik hier!.</a>';
}
?>
[/code]
Thumbnail.php
[code]<?php
$im = $_GET['im'];
$im = $im;
$maxsize = $_GET['maxsize'];
if($maxsize){
$maxsize = $maxsize;
}elseif($_GET[foto]){
$maxsize = 100;
}else{
$maxsize = 100;
}
// The file
$filename = $im;
// Set a maximum height and width
$width = $maxsize;
$height = $maxsize;
// Content type
header('Content-type: image/jpeg');
// Get new dimensions
list($width_orig, $height_orig) = getimagesize($filename);
if ($width && ($width_orig < $height_orig)) {
$width = ($height / $height_orig) * $width_orig;
} else {
$height = ($width / $width_orig) * $height_orig;
}
// Resample
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
// Output
imagejpeg($image_p, null, 100);
imagedestroy($image);
imageDestroy($image_p);
?>[/code]
Reacties
0