Проблем с ъплоад скрипт и полета в БД

C++ JAVA
Post Reply
User avatar
stoqnski
Гуру
Гуру
Posts: 2037
Joined: Mon Sep 10, 2007 4:39 pm
Answers: 122
Location: гр.Сливен

Проблем с ъплоад скрипт и полета в БД

Post by stoqnski » Fri Feb 06, 2015 12:53 am

Здравейте , намерих перфектен скрипт който качва 3 снимки в дадена директория (uploads) , компресира ги по размер и пиксели и създава миниатюри с префикс thumb_ . До тук идеално , всичко работи перфектно . Проблема идва от това че искам да създам формуляр за продукти , но за самите продукти имам 17 полета и колега ме посъветва да изнеса реално тези 6снимки , които се получава от скрипта в отделна таблица - така и направих , ето структурата :

products:

id
snimka
ime
..
...
.....

snimki

sid
golqmasnimka
malkasnimka

products.id<=>snimki.sid

[php]

<?php
$ThumbSquareSize = 150; //Thumbnail will be 200x200
$BigImageMaxSize = 500; //Image Maximum height or width
$ThumbPrefix = "thumb_"; //Normal thumb Prefix
$DestinationDirectory = 'uploads/'; //Upload Directory ends with / (slash)
$Quality = 90;


foreach($_FILES as $file)
{
$ImageName = $file['name'];
$ImageSize = $file['size'];
$TempSrc = $file['tmp_name'];
$ImageType = $file['type'];


if (is_array($ImageName))
{
$c = count($ImageName);

echo '<ul>';
for ($i=0; $i < $c; $i++)

{
$processImage = true;
$RandomNumber = rand(0, 9999999999);

if(!isset($ImageName[$i]) || !is_uploaded_file($TempSrc[$i]))
{
echo 'Грешка: <strong>'.$ImageName[$i].'</strong>, не сте избрали файл или файла е твърде голям!';
}
else
{
switch(strtolower($ImageType[$i]))
{
case 'image/png':
$CreatedImage = imagecreatefrompng($TempSrc[$i]);
break;
case 'image/gif':
$CreatedImage = imagecreatefromgif($TempSrc[$i]);
break;
case 'image/jpeg':
case 'image/pjpeg':
$CreatedImage = imagecreatefromjpeg($TempSrc[$i]);
break;
default:
$processImage = false;
}
list($CurWidth,$CurHeight)=getimagesize($TempSrc[$i]);

$ImageExt = substr($ImageName[$i], strrpos($ImageName[$i], '.'));
$ImageExt = str_replace('.','',$ImageExt);

$NewImageName = $RandomNumber.'.'.$ImageExt;

$thumb_DestRandImageName = $DestinationDirectory.$ThumbPrefix.$NewImageName;
$DestRandImageName = $DestinationDirectory.$NewImageName;

if($processImage && resizeImage($CurWidth,$CurHeight,$BigImageMaxSize,$DestRandImageName,$CreatedImage,$Quality,$ImageType[$i]))
{
if(!cropImage($CurWidth,$CurHeight,$ThumbSquareSize,$thumb_DestRandImageName,$CreatedImage,$Quality,$ImageType[$i]))
{
echo 'Грешка с правенето на миниатюра!';
}
list($ResizedWidth,$ResizedHeight)=getimagesize($DestRandImageName);
echo '<table width="100%" border="0" cellpadding="4" cellspacing="0">';
echo '<tr>';
echo '<td align="center"><img src="uploads/'.$ThumbPrefix.$NewImageName.'" alt="Thumbnail" height="'.$ThumbSquareSize.'" width="'.$ThumbSquareSize.'">link: "uploads/'.$ThumbPrefix.$NewImageName.'"</td>';
echo '</tr><tr>';
echo '<td align="center"><img src="uploads/'.$NewImageName.'" alt="Resized Image" height="'.$ResizedHeight.'" width="'.$ResizedWidth.'"><br />
link: "uploads/'.$NewImageName.'"</td>';
echo '</tr>';
echo '</table>';
include ('db.php');
mysql_query("INSERT INTO snimki (golqmasnimka, malkasnimka)
VALUES ('$DestRandImageName', '$thumb_DestRandImageName') ") or die(mysql_error());

}else{
echo 'Грешка:<strong>'.$ImageName[$i].'</strong>! Форматът на файла не е поддържан!</div>';
}

}

}
echo '</ul>';
}
}


function resizeImage($CurWidth,$CurHeight,$MaxSize,$DestFolder,$SrcImage,$Quality,$ImageType)
{

if($CurWidth <= 0 || $CurHeight <= 0)
{
return false;
}


$ImageScale = min($MaxSize/$CurWidth, $MaxSize/$CurHeight);
$NewWidth = ceil($ImageScale*$CurWidth);
$NewHeight = ceil($ImageScale*$CurHeight);

if($CurWidth < $NewWidth || $CurHeight < $NewHeight)
{
$NewWidth = $CurWidth;
$NewHeight = $CurHeight;
}
$NewCanves = imagecreatetruecolor($NewWidth, $NewHeight);

if(imagecopyresampled($NewCanves, $SrcImage,0, 0, 0, 0, $NewWidth, $NewHeight, $CurWidth, $CurHeight))
{
switch(strtolower($ImageType))
{
case 'image/png':
imagepng($NewCanves,$DestFolder);
break;
case 'image/gif':
imagegif($NewCanves,$DestFolder);
break;
case 'image/jpeg':
case 'image/pjpeg':
imagejpeg($NewCanves,$DestFolder,$Quality);
break;
default:
return false;
}
if(is_resource($NewCanves)) {
imagedestroy($NewCanves);
}
return true;
}

}


function cropImage($CurWidth,$CurHeight,$iSize,$DestFolder,$SrcImage,$Quality,$ImageType)
{

if($CurWidth <= 0 || $CurHeight <= 0)
{
return false;
}


if($CurWidth>$CurHeight)
{
$y_offset = 0;
$x_offset = ($CurWidth - $CurHeight) / 2;
$square_size = $CurWidth - ($x_offset * 2);
}else{
$x_offset = 0;
$y_offset = ($CurHeight - $CurWidth) / 2;
$square_size = $CurHeight - ($y_offset * 2);
}

$NewCanves = imagecreatetruecolor($iSize, $iSize);
if(imagecopyresampled($NewCanves, $SrcImage,0, 0, $x_offset, $y_offset, $iSize, $iSize, $square_size, $square_size))
{
switch(strtolower($ImageType))
{
case 'image/png':
imagepng($NewCanves,$DestFolder);
break;
case 'image/gif':
imagegif($NewCanves,$DestFolder);
break;
case 'image/jpeg':
case 'image/pjpeg':
imagejpeg($NewCanves,$DestFolder,$Quality);
break;
default:
return false;
}
if(is_resource($NewCanves)) {
imagedestroy($NewCanves);
}
return true;

}

}
[/php]

Вмомента като кача снимките ми създава 3 id-та:

Image

и не мога да разбера как ще го свържа с products таблицата и как ще напъхам останалите 17полета от формуляра в този код който дадох :d помагайте някак , че мн я фтасах ;d

User avatar
djman
Гуру
Гуру
Posts: 2812
Joined: Sat Sep 12, 2009 8:07 am
Answers: 108

Post by djman » Fri Feb 06, 2015 1:13 am

Защо не съхраняваш просто името и разширението на снимката? Какво ще стане, ако ги преместиш от uploads? Или смениш thumb_ ?

snimki
- id (int, autoincrement, primary key)
- product_id (int, свързан с products.id, т.е. трябва първо да вкараш продукта, а след това снимките)
- name (varchar)

Като знаеш името, лесно можеш да построиш uploads/thumb_{ime}. Пък и за още по-хубаво, що не ги правиш всичките в jpg (или който и да е един формат). :)

--
more hints:

Изнеси всичко, което отговаря за обработка на снимките в отделна функция (а не да стои . И като цяло, мешаш html и php - хич не е хубаво така! :)

И това include ('db.php'); дето стои във for цикъл... :D

(обмисли използването на някой framework)

User avatar
stoqnski
Гуру
Гуру
Posts: 2037
Joined: Mon Sep 10, 2007 4:39 pm
Answers: 122
Location: гр.Сливен

Post by stoqnski » Fri Feb 06, 2015 1:41 am

Добре как да подредя цялата работа ?
Примерно имам от добавянето на продукти:

Ime: <input type="text" name="ime" />
Opisanie: <input type="text" name="opisanie"/>

и променливи съответно с $_POST

Този код , който публикувах ми върши перфектна работа , но е такава каша , че не мога да се ориентирам как да го раздробя и свържа с останалия формуляр , който пък съдържа 17 полета.


Мислих да се измъкна със html5 и CSS3 по този начин:
Кода за качването на снимки го слагам в един див и си играя си visible опциите, на принципа Step by Step навигациите и тогава лесно ще си осигуря задължително условие към следващата стъпка.
Но това ми краен вариант(изход от ситуацията)...
Искам всичко да стане като хората , примерно един add.html в който ми е html формуляра и един php файл , който обработва всичките полета .
за db.php - написах го набързо там за проба на заявката :D
Не ми е позволено да използвам framework .

User avatar
stoqnski
Гуру
Гуру
Posts: 2037
Joined: Mon Sep 10, 2007 4:39 pm
Answers: 122
Location: гр.Сливен

Post by stoqnski » Sat Feb 07, 2015 7:32 pm

Ето и по друг начин казано:

Това ми е html формуляра:
Image
Като се натисне бутона action-а е upload.php с този код:
[php]<?php
include ('db.php');
include ('functions.php');
$ThumbSquareSize = 150; //Thumbnail will be 200x200
$BigImageMaxSize = 500; //Image Maximum height or width
$ThumbPrefix = "thumb_"; //Normal thumb Prefix
$DestinationDirectory = 'uploads/'; //Upload Directory ends with / (slash)
$Quality = 90;


foreach($_FILES as $file)
{
$ImageName = $file['name'];
$ImageSize = $file['size'];
$TempSrc = $file['tmp_name'];
$ImageType = $file['type'];


if (is_array($ImageName))
{
$c = count($ImageName);

for ($i=0; $i < $c; $i++)

{
$processImage = true;
$RandomNumber = rand(0, 9999999999);

if(!isset($ImageName[$i]) || !is_uploaded_file($TempSrc[$i]))
{
echo 'Грешка: <strong>'.$ImageName[$i].'</strong>, не сте избрали файл или файла е твърде голям!';
}
else
{
switch(strtolower($ImageType[$i]))
{
case 'image/png':
$CreatedImage = imagecreatefrompng($TempSrc[$i]);
break;
case 'image/gif':
$CreatedImage = imagecreatefromgif($TempSrc[$i]);
break;
case 'image/jpeg':
case 'image/pjpeg':
$CreatedImage = imagecreatefromjpeg($TempSrc[$i]);
break;
default:
$processImage = false;
}
list($CurWidth,$CurHeight)=getimagesize($TempSrc[$i]);

$ImageExt = substr($ImageName[$i], strrpos($ImageName[$i], '.'));
$ImageExt = str_replace('.','',$ImageExt);

$NewImageName = $RandomNumber.'.'.$ImageExt;

$thumb_DestRandImageName = $DestinationDirectory.$ThumbPrefix.$NewImageName;
$DestRandImageName = $DestinationDirectory.$NewImageName;

if($processImage && resizeImage($CurWidth,$CurHeight,$BigImageMaxSize,$DestRandImageName,$CreatedImage,$Quality,$ImageType[$i]))
{
if(!cropImage($CurWidth,$CurHeight,$ThumbSquareSize,$thumb_DestRandImageName,$CreatedImage,$Quality,$ImageType[$i]))
{
echo 'Грешка с правенето на миниатюра!';
}
list($ResizedWidth,$ResizedHeight)=getimagesize($DestRandImageName);
mysql_query("INSERT INTO snimki (fail)
VALUES ('$NewImageName') ") or die(mysql_error());

}else{
echo 'Грешка:<strong>'.$ImageName[$i].'</strong>! Форматът на файла не е поддържан!</div>';
}

}

}
}
}

[/php]

*db.php ми е връзката с базата данни
*functions.php - 2 функции са компресиране на качените снимки и създаване на миниатюра

След изпълнението на кода в БД-то се отразява така:

При 3 качени снимки (съхраняват се в таблица: snimki):
Image
а при 2 или 1 снимка създава 2 id-та или 1 id със съответните данни .

Проблеми:

Имам таблица products с полета:

id
snimka
ime
...
...
...

Полето id е int(11) AI и как да го предам на snimka.productid след като в действителност не го знам ?

User avatar
Doris
Потребител
Потребител
Posts: 1102
Joined: Thu Jul 06, 2006 6:17 pm
Answers: 47

Post by Doris » Sun Feb 08, 2015 7:44 am

Ако създаваш каталог с продукти, ще искаш или да запишеш нов продукт заедно със снимките му, или да направиш редакция на някой вече записан продукт заедно със снимките му, или да го изтриеш.
В първия случай скриптът ще запише първо продукта , после ще вземе ид-то му, ще качи снимките и ще ги запише в другата база данни заедно със запомненото ид. Може и без бд за снимките, ако ид на продукта се включи в името на снимката. Алтернативният текст може да се вземе от данните на продукта с някакво допълнение.
За втория и третия случай първо трябва да се направи избор на продукт.

User avatar
stoqnski
Гуру
Гуру
Posts: 2037
Joined: Mon Sep 10, 2007 4:39 pm
Answers: 122
Location: гр.Сливен

Post by stoqnski » Sun Feb 08, 2015 10:43 am

Искам да добавя нов продукт заедно със снимките му .

mapka7a
Турист
Турист
Posts: 249
Joined: Mon Sep 05, 2011 9:21 am
Answers: 20
Location: Sofia
Contact:

Post by mapka7a » Sun Feb 08, 2015 4:24 pm

Едно от нещата за които се сещам е да използваш http://php.net/manual/en/mysqli.insert-id.php(mysqli_insert_id) и така когато добавяш продукт заедно със снимките може да използваш тази функция за да вземеш последното генерирано ID и да го парснеш към снимките , а вече при редакция, просто го добави като параметър в URL-а и го вземи
[/b]

User avatar
stoqnski
Гуру
Гуру
Posts: 2037
Joined: Mon Sep 10, 2007 4:39 pm
Answers: 122
Location: гр.Сливен

Post by stoqnski » Mon Feb 09, 2015 12:04 pm

mapka7a wrote:Едно от нещата за които се сещам е да използваш http://php.net/manual/en/mysqli.insert-id.php(mysqli_insert_id) и така когато добавяш продукт заедно със снимките може да използваш тази функция за да вземеш последното генерирано ID и да го парснеш към снимките , а вече при редакция, просто го добави като параметър в URL-а и го вземи
[/b]
ии мерси , тази не я знаех .. мн полезно благодаря , ще видя какви ще ги свърша

Post Reply