Koden funkar fint om jag sätter $skip = 1, men inte när jag sätter $skip = 0, dvs när $skip = 0, skall databasen förminska bilden innan den sparas i databasen. När $skip = 1 förminskas bilden ej. Vad gör jag för fel?
Den första orsaken till att inget sparas tycks vara att koden blandar datatyper. När du först läser in $picture på rad 51 så är det en bytearray/sträng, men resizeImage() returnerar en resurs. Innan du kan skicka den till databasen så måste du spara den i ett av de tillgängliga bildformaten igen:
<?php
function resizeImage ($inString, $maxHeight)
{
$originalImage = imagecreatefromstring($inString);
$originalWidth = imagesx($originalImage);
$originalHeight = imagesy($originalImage);
$newHeight = $maxHeight;
$newWidth = round($originalWidth / $originalHeight * $maxHeight);
$resizedImage = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($resizedImage, $originalImage, 0, 0, 0, 0, $newWidth, $newHeight, $originalWidth, $originalHeight);
//
// !!! Bilden som en sträng istället för gd-resurs
//
ob_start();
imagejpeg($resizedImage);
$outString = ob_get_clean();
return array($outString, $newWidth, $newHeight);
}
?>
Ett annat problem som kan hindra dina bilder från att sparas är att datan inte escapas i dina queries. Detta kan leda till att de färdiga kommandona blir ogiltiga eller utför något annat än vad du hade tänkt dig. Eftersom att ditt API (ext/mysqli) har stöd för prepared statements så skulle jag rekommendera att du tar reda på hur man använder sig av det, det gör det betydligt svårare att begå den här typen av misstag. Det kan även hända att du finner PDO lättare att arbeta med.
Snabbfix för att escapa och förbättra läsbarheten i vanliga queries:
$query = sprintf(
'UPDATE
PictureStorage
SET
Data_normal = "%s",
Name_normal = "%s"
...',
mysqli_real_escape_string($link, $picture),
mysqli_real_escape_string($link, $name)
);
mysqli_query($query);
Exempel med PDO och prepared statements:
$sth = $dbh->prepare(
'UPDATE
PictureStorage
SET
Data_normal = :data,
Name_normal = :name
...');
$sth->bindValue(":data", $picture, PDO::PARAM_STR);
$sth->bindValue(":name", $name, PDO::PARAM_STR);
$sth->execute();
Sedan finns det ett mindre problem med att spara en tumnagel om $picture_ID inte evaluerar till ett sannt värde (förtyliga gärna avsikten med det genom t.ex. if($picture_ID > 0) istället), och det är att $picture_mini bara definieras om $skip är 0 (rad 93). Om den här raden körs så borde du få ett felmeddelande som varnar för att du använder en odefinierad variabel. Kontrollera gärna att du har all felrapportering igång, det underlättar enormt om man hittar sådana missar direkt.
Har inte testat några av ändringarna eller exemplen. Se upp för typos och bekräfta med manualen...
Edit: Obligatoriskt skämt: