Billeder kan i PHP / MySQL behandles på 2 måder alt efter opbevaringsmetode:
BLOB-metoden Billederne opbevares i MySQL i BLOB-format.
Mappe-metoden Billederne opbevares i en normal fil. Forbindelsen til dem vedligeholdes via PHP/MySQL.
Beskrivelsrne nedenfor vil være afgrænset til Mappe-metoden.
Upload af billeder til brug i PHP kan opdeles i den nedenfor beskrevne 5-trins sekvens. Sletning er beskrevet længere nede.
En del af upload-processen foretages bedst med PHP add-on biblioteket WideImage. Det (lib-versionen) kan downloades herfra: . Programmet placeres i sin egen mappe i "include"-mappen til de programmer, der skal udføre upload. Fra dem "includes" der til biblioteket:
include ("includes/wideimage/lib/wideimage.php");
Både indlæggelse af billeder og sletning af billeder udføres via Form / $_POST kredsløbet. Billedbehandlingen kan indgå i en Form samtidig med håndteringen af andre input types.
De aktuelle $_FILES-parametre kan ses med: echo '<pre>Indholdet af $_FILES er: <br /> '; print_r($_FILES); echo '</pre>';
Et billede pr. DB-record.
Selvom håndtering af et billede pr. db-record (f.eks. brugerstamdata) kan integreres med programmerne til håndtering af stamdataene, synes det i praksis fordelagtigt at adskille de to opgaver (koden bliver simplere og muligheden for genbrug større).
Ved adskillelse kan man nøjes med 2 programmer til håndtering af billeder:
Et update-program, der med samme kode både indlægger billede første gang og udskifter billede efter behov.
Et program, der sletter billedet.
Nedenfor er der links til 4 programmer, der kan anvendes som grundlag for at etablere upload og sletning af billeder.
Update til brug i admin-system
Delete til brug i admin system
Update til brug i offentlig del af sitet
Delete til brug i offentlig del af sitet
Som det kan ses er programmerne næsten identiske to og to - næsten kun filstierne er forskellige.
Koden til opbygning af billednavne og anvendelse af wideimage skal tilpasses den aktuelle situation. Der skal også tilpasses, alt efter om der skal håndteres en enkelt eller flere versioner (lille, mellsem, stor) af hvert billede.
Når der kun skal være et billede pr. stamdatarecord, indlægges billednavnet i et felt deri.
Indlæggelse af billeder
Her kan ses programmer til hhv. insert, update og delete:
Formen kan indeholde et ubegrænset antal andre input types.
Udtræk fra $_POST
Billedet - og tilknyttede data - overføres i sin egen globale php-variabel: $_FILES - der er indlejret i $_POST.
if (isset($_POST['upload']))
{
.
$type = trim ($_POST['type']);
.
...............................
// UDTRÆK fra post
$src = str_replace (' ','', (trim ($_FILES['billed']['name']))); // navn på billede ved upload (xxx.jpg)
$src_error = $_FILES['billed']['error']; // fejlkode fra upload
// VALIDERING
if ($src_error == 0)
{
$tmp_billed = WideImage::load('billed'); // billed = 'name' fra input type 'file'. Indeholder alle billedets bits.
}
if ($src == "")
{ $fejlbeskeder .= "Der er ikke uploadet noget billede "; }
elseif( mb_check_encoding($src, 'ASCII') === false )
{$fejlbeskeder .= "Billedet's filnavn indeholder æ,ø å eller andre ikke-tilladte tegn. Ret billedets navn manuelt før upload. ";
}
...............................
// UDTRÆK fra post
$src = str_replace (' ','', (trim ($_FILES['billed']['name']))); // navn på billede ved upload (xxx.jpg)
$src_error = $_FILES['billed']['error']; // fejlkode fra upload;
if ($src_error == 0);
{
$tmp_billed = WideImage::load('billed'); // billed = 'name' fra input type 'file'. Indeholder alle billedets bits.;
}
// VALIDERING
if ($src_error == 0)
{
$tmp_billed = WideImage::load('billed'); // billed = 'name' fra input type 'file'. Indeholder alle billedets bits.
}
if ($src == "")
{ $fejlbeskeder .= "Der er ikke uploadet noget billede "; }
elseif( mb_check_encoding($src, 'ASCII') === false )
{$fejlbeskeder .= "Billedet's filnavn indeholder æ,ø å eller andre ikke-tilladte tegn. Ret billedets navn manuelt før upload. "; }
.
.
// echo '<pre>Indholdet af $files er '; print_r($_files); echo '</pre>';
Fra $_FILES skal udtrækkes 3 variabler, der her alle anvender 'billed' som parameter. 'billed' kommer fra 'name'-parameteret i <input type="file"... :
$src Navnet på det uploadede billede (f.eks: xxx.jpg).
$src_error Den aktuelle fejlkode for overførslen. 0 = ingen fejl.
$tmp_billed Variabel i WideImage, der udtrækker alle billedets pixels fra den TMP-fil der er dannet i Formen af input type "file".
Det er væsentligt, at de 2 sidste variabler udtrækkes i den viste rækkefølge.
Med "print_r"-funktionen kan vises en automatisk genereret oversigt over indholdet i $_FILES. Det er væsentlig, at overførslerne er stabile og fejlfri.
Billednavne og -stier
For at undgå utilsigtet overskrivning ved gemning og at flere databaserecords trækker samme billede, er det relevant, at sikre entydighed i billednavne. Der skal endvidere tages hensyn til, at samme billede kan være gemt i indtil 3 forskellige størrelser - placeres nemmest i hver sin mappe med samme billednavn.
En blandt flere måder at sikre entydighed på er ved at foranstille / erstatte navnet med en automatisk genereret tidsstreng (aaaammddttmmss eller aammddttmmss).
Ændringen fra et almindeligt navn til et navn med tidsprefix kan foretages således:
For at kunne gemme et billede skal stien til den / de aktuelle mappe(r) også være beskrevne. De gøres ved at opbygge en / flere "$xx_stiogbilled"-variabler.
Efter at WideImage har udtrukket det fysiske billede fra den temporære fil i $_FILES til en variabel (her $tmp_billed), kan denne i WideImage bruges et ubegrænset antal gange til at lave nye bearbejdede billeder, der kan gemmes individuelt. Nedenfor vil blive vist 3 måder, der forudsætter at forarbejdet med billednavne og -stier er gjort:
Uændret billede Billedet kan gemmes umiddelbart:
$tmp_billed->saveToFile($up_stiogbilled);
Resize Skal billedet resizes før upload indsættes:
Til "resize" skal knyttes bl.a. følgende parametre. De to første tal angiver hhv. bredde og højde. Ved at lade det ene tal være tomt, skaleres proportionelt på det andet.
Eksempler:
$smaller = $image->resize('50%');
$smaller = $image->resize('100', '100', 'inside', 'down');
is the same as
$smaller = $image->resizeDown(100, 100, 'inside');
Til "crop" skal knyttes 4 parametre, hvoraf de 2 første angiver startsted (horisontalt og vertikalt) og de 2 sidste udsnittets størrelse (horisontalt og vertikalt).
Eksempler:
$cropped = $img->crop(10, 10, 150, 200); // crops a 150x200 rect at (10, 10)
$cropped = $img->crop(-100, -50, 100, 50); // crops a 100x50 rect at the right-bottom of the image
$cropped = $img->crop('25%', '25%', '50%', '50%'); // crops a 50%x50% rect from the center of the image
$cropped = $img->crop("right", "bottom", 100, 200); // crops a 100x200 rect from right bottom
$cropped = $img->crop("center", "middle", 50, 30); // crops a 50x30 from the center of the image
Udover resize og crop kan WideImage foretage ganske mange andre manipulationer af $tmp_billed før gemning. Beskrivelse af dem kan findes i WideImage's dokumentation: .
Opdatering af database
Ved Insert opbygges "insert"-datastrengen således:
Ved update skal der anvendes en "update"-datastreng, når der indgår et billede i opdateringen, og en anden, når der ikke indgår et billede deri.
if ($billed != "")
{
$up_query = "
UPDATE tabel SET
aa = '$aa',
bb = '$bb',
cc_billed = '$up_billed',
dd = '$dd',
ee = '$ee'
WHERE xx_id = $xx_id";
$up_result = mysqli_query ($db_link, $up_query) or die (mysqli_error ($db_link));
}
else
{
$up_query = "
UPDATE tabel SET
aa = '$aa',
bb = '$bb',
dd = '$dd',
ee = '$ee'
WHERE xx_id = $xx_id";
$up_result = mysqli_query ($db_link, $up_query) or die (mysqli_error ($db_link));
}
Sletning af billeder
For at slette et billede behøves kun en sti, et billednavn fra databasen og en PHP-funktion. - Og det meste er delvis genbrug:
// sti og billede
$up_sti = "../y_images/" . $row['z_mappe'] . "/" ;
$up_stiogbilled = $up_sti . $billed; // $billed = billednavn i DB. Hentet med GET ved programstart