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

stoqnski

Registered
Здравейте , намерих перфектен скрипт който качва 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;

	}
	  
}

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

6419.png


и не мога да разбера как ще го свържа с products таблицата и как ще напъхам останалите 17полета от формуляра в този код който дадох :d помагайте някак , че мн я фтасах ;d
 
Защо не съхраняваш просто името и разширението на снимката? Какво ще стане, ако ги преместиш от 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)
 
Добре как да подредя цялата работа ?
Примерно имам от добавянето на продукти:

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 .
 
Ето и по друг начин казано:

Това ми е html формуляра:
6420.png

Като се натисне бутона 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>'; 
			}
			
		}
		
	}
	} 
}

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

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

При 3 качени снимки (съхраняват се в таблица: snimki):
6421.png

а при 2 или 1 снимка създава 2 id-та или 1 id със съответните данни .

Проблеми:

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

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

Полето id е int(11) AI и как да го предам на snimka.productid след като в действителност не го знам ?
 
Ако създаваш каталог с продукти, ще искаш или да запишеш нов продукт заедно със снимките му, или да направиш редакция на някой вече записан продукт заедно със снимките му, или да го изтриеш.
В първия случай скриптът ще запише първо продукта , после ще вземе ид-то му, ще качи снимките и ще ги запише в другата база данни заедно със запомненото ид. Може и без бд за снимките, ако ид на продукта се включи в името на снимката. Алтернативният текст може да се вземе от данните на продукта с някакво допълнение.
За втория и третия случай първо трябва да се направи избор на продукт.
 
Едно от нещата за които се сещам е да използваш http://php.net/manual/en/mysqli.insert-id.php(mysqli_insert_id) и така когато добавяш продукт заедно със снимките може да използваш тази функция за да вземеш последното генерирано ID и да го парснеш към снимките , а вече при редакция, просто го добави като параметър в URL-а и го вземи
[/b]
 
mapka7a каза:
Едно от нещата за които се сещам е да използваш http://php.net/manual/en/mysqli.insert-id.php(mysqli_insert_id) и така когато добавяш продукт заедно със снимките може да използваш тази функция за да вземеш последното генерирано ID и да го парснеш към снимките , а вече при редакция, просто го добави като параметър в URL-а и го вземи
[/b]

ии мерси , тази не я знаех .. мн полезно благодаря , ще видя какви ще ги свърша
 

Горе