| Autor | Zpráva | ||
|---|---|---|---|
| Lukes Profil * |
#1 · Zasláno: 2. 5. 2014, 14:24:50
Dobrý den,
pokouším se udělat script, který když odešlu do databáze se přidá 5x stejný akorát s jiným obrázkem. $querysk=MySQL_query("SELECT id FROM obrazky LIMIT 1");
while($sk=MySQL_fetch_array($querysk))
{
for ($p = 1; $p <= '5'; ++$p){
$zapis = MySQL_Query("INSERT INTO obrazky SET nazev = '$nazev', img = '$obr' ");
}
}
...
...
...
...
<tr><td align="right"><strong>Obrázek:</strong></td><td><input name="addimg" type="file" size="68" required></td></tr>
<tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg2" type="file" size="68" required></td></tr>
tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg3" type="file" size="68" required></td></tr>
tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg4" type="file" size="68" required></td></tr>
tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg5" type="file" size="68" required></td></tr>nicméně, mě vůbec nenapadá jak mám docílit toho, aby každý obrázek byl jiný? |
||
| Taps Profil |
#2 · Zasláno: 2. 5. 2014, 14:47:39
Lukes:
je nutné pracovat s polem <tr><td align="right"><strong>Obrázek:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <? foreach(); ?> |
||
| Lukes Profil * |
#3 · Zasláno: 2. 5. 2014, 22:52:00
Taps:
uf nějakej více přesnější návod by nebyl? musím používát cyklus? |
||
| Taps Profil |
#4 · Zasláno: 3. 5. 2014, 14:16:05
|
||
| Lukes Profil * |
#5 · Zasláno: 3. 5. 2014, 23:33:08
Dobrý večer, tak jsem trošku pokročil dál, jestli se dá říci. Nyní to mám ve stavu
for($i=1; $i<=5; $i++) {
$token2 = $_POST["seo_en"];
if (is_uploaded_file($_FILES["addimg"]["tmp_name"][$i])){
$path_parts = pathinfo($_FILES["addimg"]["name"][$i]);
if (in_array(strtolower($path_parts['extension']),
array('jpg','gif','png'))) {
$name = $token2."-$i.".$path_parts['extension'];
$func_copy = move_uploaded_file($_FILES["addimg"]["tmp_name"][$i], "../images/obrazky/$name");
// *** Include the class
include("resize-class.php");
// *** 1) Initialize / load image
$resizeObj = new resize("../images/obrazky/$name");
// *** 2) Resize image (options: exact, portrait, landscape, auto, crop)
$resizeObj -> resizeImage(510, 510, 'landscape');
// *** 3) Save image
$resizeObj -> saveImage("../images/obrazky/510x510_$name", 100);
// *** 2) Resize image (options: exact, portrait, landscape, auto, crop)
$resizeObj -> resizeImage(242, 242, 'exact');
// *** 3) Save image
$resizeObj -> saveImage("../images/obrazky/242x242_$name", 100);
} else { error("Pouze JPG, PNG a GIF obrázky jdou nahrát!"); }
}
$sql_vloz = "INSERT INTO obrazky SET nazev_en = '$nazev_en', seo_en = '$seo_en-$i',
nazev_cz = '$nazev_cz - $i', seo_cz = '$seo_cz-$i',
nazev_de = '$nazev_de', seo_de = '$seo_de-$i',
img = '$name', celkove_id = '$vysledek'";
$sql_result = mysql_query($sql_vloz);
if (!$sql_result){
error("$lng_admin_chyba");
} else {
ok("Přidání obrázku-$i proběhlo úspěšně!");
zalogovat("Přidáno", "Obrázky", "$vysledek");
}
}- takto to nefunguje, nevím proč...nefunguje to kvůli tomu resizeru resize-class.php... vždy to provede použe u prvního obrázku a pak to zamrzne. Když to mám bez toho kodu na resizer funguje to, nicméně když chci nahrávat třeba 7 obrázků a né 5, tak u obrázků to číslo volí po čísle 5 stejný.... tj. nazevobrazku-1.jpg nazevobrazku-2.jpg nazevobrazku-3.jpg nazevobrazku-4.jpg nazevobrazku-5.jpg nazevobrazku-5.jpg nazevobrazku-5.jpg nechápu proč po číslu 5 se to opakuje, u seo číslování to nedělá. Nevítě někdo jak to opravit? |
||
| Taps Profil |
#6 · Zasláno: 4. 5. 2014, 09:49:21
V cyklu for napis misto 5 cislo 7
|
||
| Lukes Profil * |
#7 · Zasláno: 4. 5. 2014, 11:02:04 · Upravil/a: Lukes
Když tam napíšu 7čku
for($i=1; $i<=5; $i++) {
tak v databázi to mám nazevobrazku-1.jpg nazevobrazku-2.jpg nazevobrazku-3.jpg nazevobrazku-4.jpg nazevobrazku-5.jpg nazevobrazku-6.jpg nazevobrazku-6.jpg * Když tam napíšu 7čku for($i=1; $i<=7; $i++) {
|
||
| CZghost Profil |
#8 · Zasláno: 4. 5. 2014, 11:11:50
Lukes:
„- takto to nefunguje, nevím proč...nefunguje to kvůli tomu resizeru resize-class.php...“ Existuje vůbec tento soubor na serveru? Jestli ano, jsou veškeré funkce a objekty deklarovány správně? Mám pocit, že objekt resize() v PHP nativně neexistuje, funkce resizeImage() rovněž, takže to musí být deklarované v souboru resize-class.php - kdyžtak sem pošli kód includovaného souboru. |
||
| Lukes Profil * |
#9 · Zasláno: 4. 5. 2014, 11:14:46
CZghost:
SOubor originální se nahraje na serveru a ztoho se provedou miniatury, pro první obrázek to funguje, druhý obrázek se nahraje jako originál a už to nic neprovede a zmrzne to... i v databázi se přidá pouze jeden záznam. Kod resize-class.php <?php
# ========================================================================#
#
# Author: Jarrod Oberto
# Version: 1.0
# Date: 17-Jan-10
# Purpose: Resizes and saves image
# Requires : Requires PHP5, GD library.
# Usage Example:
# include("classes/resize_class.php");
# $resizeObj = new resize('images/cars/large/input.jpg');
# $resizeObj -> resizeImage(150, 100, 0);
# $resizeObj -> saveImage('images/cars/large/output.jpg', 100);
#
#
# ========================================================================#
Class resize
{
// *** Class variables
private $image;
private $width;
private $height;
private $imageResized;
function __construct($fileName)
{
// *** Open up the file
$this->image = $this->openImage($fileName);
// *** Get width and height
$this->width = imagesx($this->image);
$this->height = imagesy($this->image);
}
## --------------------------------------------------------
private function openImage($file)
{
// *** Get extension
$extension = strtolower(strrchr($file, '.'));
switch($extension)
{
case '.jpg':
case '.jpeg':
$img = @imagecreatefromjpeg($file);
break;
case '.gif':
$img = @imagecreatefromgif($file);
break;
case '.png':
$img = @imagecreatefrompng($file);
break;
default:
$img = false;
break;
}
return $img;
}
## --------------------------------------------------------
public function resizeImage($newWidth, $newHeight, $option="auto")
{
// *** Get optimal width and height - based on $option
$optionArray = $this->getDimensions($newWidth, $newHeight, $option);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
// *** Resample - create image canvas of x, y size
$this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);
// *** if option is 'crop', then crop too
if ($option == 'crop') {
$this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
}
}
## --------------------------------------------------------
private function getDimensions($newWidth, $newHeight, $option)
{
switch ($option)
{
case 'exact':
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
break;
case 'portrait':
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
break;
case 'landscape':
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
break;
case 'auto':
$optionArray = $this->getSizeByAuto($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
case 'crop':
$optionArray = $this->getOptimalCrop($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function getSizeByFixedHeight($newHeight)
{
$ratio = $this->width / $this->height;
$newWidth = $newHeight * $ratio;
return $newWidth;
}
private function getSizeByFixedWidth($newWidth)
{
$ratio = $this->height / $this->width;
$newHeight = $newWidth * $ratio;
return $newHeight;
}
private function getSizeByAuto($newWidth, $newHeight)
{
if ($this->height < $this->width)
// *** Image to be resized is wider (landscape)
{
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
}
elseif ($this->height > $this->width)
// *** Image to be resized is taller (portrait)
{
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
}
else
// *** Image to be resizerd is a square
{
if ($newHeight < $newWidth) {
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
} else if ($newHeight > $newWidth) {
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
} else {
// *** Sqaure being resized to a square
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
}
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function getOptimalCrop($newWidth, $newHeight)
{
$heightRatio = $this->height / $newHeight;
$widthRatio = $this->width / $newWidth;
if ($heightRatio < $widthRatio) {
$optimalRatio = $heightRatio;
} else {
$optimalRatio = $widthRatio;
}
$optimalHeight = $this->height / $optimalRatio;
$optimalWidth = $this->width / $optimalRatio;
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight)
{
// *** Find center - this will be used for the crop
$cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );
$cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 );
$crop = $this->imageResized;
//imagedestroy($this->imageResized);
// *** Now crop from center to exact requested size
$this->imageResized = imagecreatetruecolor($newWidth , $newHeight);
imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
}
## --------------------------------------------------------
public function saveImage($savePath, $imageQuality="100")
{
// *** Get extension
$extension = strrchr($savePath, '.');
$extension = strtolower($extension);
switch($extension)
{
case '.jpg':
case '.jpeg':
if (imagetypes() & IMG_JPG) {
imagejpeg($this->imageResized, $savePath, $imageQuality);
}
break;
case '.gif':
if (imagetypes() & IMG_GIF) {
imagegif($this->imageResized, $savePath);
}
break;
case '.png':
// *** Scale quality from 0-100 to 0-9
$scaleQuality = round(($imageQuality/100) * 9);
// *** Invert quality setting as 0 is best, not 9
$invertScaleQuality = 9 - $scaleQuality;
if (imagetypes() & IMG_PNG) {
imagepng($this->imageResized, $savePath, $invertScaleQuality);
}
break;
// ... etc
default:
// *** No extension - No save.
break;
}
imagedestroy($this->imageResized);
}
## --------------------------------------------------------
}
?> |
||
| CZghost Profil |
Lukes:
Jinými slovy sis stáhnul knihovnu. Tak to máš docela odvahu, většinou ty knihovny někdo vytvoří a bez zkoušek ho prdne na net ke stažení. Čekal jsem víc řádků :) Každopádně by si to měl kodér zkontrolovat, prohnat debuggerem, jestli nenajde chyby. Případně to dát někomu zkušenějšímu, kdo tam umí najít chyby. Nestačí jenom stáhnout a prdnout to tam: důvěruj, ale prověřuj. Jestli psal, že to kontroloval a zkoušel, tak pravděpodobně lže nebo to kontroloval blbě. Dneska už existujou tuny developerských nástrojů, které obsahují i debugger, který zkontroluje kód tak, že ho zkusí interpretovat, zavolat a vypíše chyby spojené s kódem. Developerské nástroje jsou často drahé, ale existují free alternativy, zkus sáhnout po některé z nich. Případně to pošli nějakému známému, kterému důvěřuješ, ať to zkontroluje. EDIT: Ještě malá poznámka k těm debuggerům: některé dokonce umí navhnout možné řešení, ale těch je velice málo. |
||
| Lukes Profil * |
#11 · Zasláno: 4. 5. 2014, 11:41:55
CZghost:
Tento kod používám u více scriptů a není problém, bohužel vždy je to script s jedním nahrávajícím obrázkem. |
||
| CZghost Profil |
Lukes:
„bohužel vždy je to script s jedním nahrávajícím obrázkem.“ V kódu jsem si všiml, že načteš jeden obrázek a vícekrát ho zmenšuješ a ukládáš. Problém jsem nenašel, je možné, že jsem to někde přehlédl, pro jistotu to ještě někdo zkontrolujte. Ještě jsem si všiml chyby u GIFu: Při resize by se měla paleta převést na true color, nejlépe použít funkci imagepalettetotruecolor, (pro zpětnou komaptibilitu si tu funkci ještě pro jistotu založ pod podmínkou, jestli ještě neexistuje): <?php
if(!function_exists('imagepalettetotruecolor')) // podmínka (ne)dostupnosti funkce (pokud funkce není, založí ji)
{
function imagepalettetotruecolor(&$src) // založení nové funkce, parametr funkce je existující obrázek
{
if(imageistruecolor($src)) // kontrola zda je obrázek již ve formátu true color
{
return(true); // vrátí true, pokud je podmínka splněna
}
$dst = imagecreatetruecolor(imagesx($src), imagesy($src)); // založení pracovního obrázku ve formátu true color
imagecopy($dst, $src, 0, 0, 0, 0, imagesx($src), imagesy($src)); // kopírování původního obrázku do pracovního
imagedestroy($src); // uvolnit paměť původního obrázku (jen pro jistotu)
$src = $dst; // nahradit původní obrázek pracovním
return(true); // vrátí true po dokončení operace
}
}
?>Při ukládání ještě ulož GIF pod paletou (paleta o počtu parev 256 s ditheringem): <?php imagetruecolortopalette($obrazek,$dithering=true,$hloubka=256); ?> |
||
| Lukes Profil * |
#13 · Zasláno: 4. 5. 2014, 12:29:20
nahrávám pouze jpg a png obrázky
|
||
| CZghost Profil |
#14 · Zasláno: 4. 5. 2014, 13:07:20
I tak bych do třídy raději zařadil tyto příkazy. Dej to do switche, pod case gif:
private function openImage($file)
{
// *** Get extension
$extension = strtolower(strrchr($file, '.'));
switch($extension)
{
case '.jpg':
case '.jpeg':
$img = @imagecreatefromjpeg($file);
break;
case '.gif':
$img = @imagecreatefromgif($file);
imagepalettetotruecolor($img);
break;
case '.png':
$img = @imagecreatefrompng($file);
break;
default:
$img = false;
break;
}
return $img;
}public function saveImage($savePath, $imageQuality="100")
{
// *** Get extension
$extension = strrchr($savePath, '.');
$extension = strtolower($extension);
switch($extension)
{
case '.jpg':
case '.jpeg':
if (imagetypes() & IMG_JPG) {
imagejpeg($this->imageResized, $savePath, $imageQuality);
}
break;
case '.gif':
if (imagetypes() & IMG_GIF) {
imagetruecolortopalette($this->imageResized, true, 256);
imagegif($this->imageResized, $savePath);
}
break;
case '.png':
// *** Scale quality from 0-100 to 0-9
$scaleQuality = round(($imageQuality/100) * 9);
// *** Invert quality setting as 0 is best, not 9
$invertScaleQuality = 9 - $scaleQuality;
if (imagetypes() & IMG_PNG) {
imagepng($this->imageResized, $savePath, $invertScaleQuality);
}
break;
// ... etc
default:
// *** No extension - No save.
break;
}
imagedestroy($this->imageResized);
}Jenom pro jistotu, může se stát, že uživatel bude chtít nahrát obrázek ve formátu GIF, potom bude samozřejmě tato úprava užitečná. Jestli povoluješ pouze formáty PNG a JPG, bude to k ničemu, ale raději si to tam dej. A k tomu povol i GIF (a dodej doporučení, že nemají nahrávat gify animované, pak by to v nejlepším případě nahrálo pouze první frame, v tom nehorším by nahrávání animovaného gifu mohlo způsobit pád programu nebo celého serveru). |
||
| Lukes Profil * |
#15 · Zasláno: 4. 5. 2014, 15:26:29
Nasadil jsem jiný resizer a ten funguje.
Nicméně řeším stále problém, když napíšu for($i=1; $i<=6; $i++) {
...
..
<tr><td align="right"><strong>Obrázek 1:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr>
<tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr>
<tr><td align="right"><strong>Obrázek 3:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr>
<tr><td align="right"><strong>Obrázek 4:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr>
<tr><td align="right"><strong>Obrázek 5:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr>
<tr><td align="right"><strong>Obrázek 6:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr>tak v databázi to mám nazevobrazku-1.jpg nazevobrazku-2.jpg nazevobrazku-3.jpg nazevobrazku-4.jpg nazevobrazku-5.jpg nazevobrazku-5.jpg když ale dám <tr><td align="right"><strong>Obrázek 1:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 3:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 4:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 5:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 6:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 7:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> přidám tam 7 obrázek, for($i=1; $i<=6; $i++) { furt zůstává tak to funguje jak má, ale musí být vyplněn i ten sedmý obrázek, nevíte někdo proč se tak děje?
|
||
| Taps Profil |
#16 · Zasláno: 4. 5. 2014, 15:30:42
Lukes:
položky odeslaného pole se číslují od 0. Možná tady by mohl být ten problém. TAk zkus tento zápis <? for($i=0; $i<=6; $i++) ?> |
||
| Lukes Profil * |
#17 · Zasláno: 4. 5. 2014, 15:40:25
Taps:
upravil jsem to na <? for($i=0; $i<=5; $i++) ?> <tr><td align="right"><strong>Obrázek 1:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 3:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 4:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 5:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 6:</strong></td><td><input name="addimg[]" type="file" size="68" required></td></tr> abych měl 6 obrázků, a vypadá že to funguje, nicméně absolutně nechápu proč to nefunguje, když chci číslovat od 1. |
||
| Taps Profil |
#18 · Zasláno: 4. 5. 2014, 15:50:17
Lukes:
možná by to ještě šlo upravit takto <tr><td align="right"><strong>Obrázek 1:</strong></td><td><input name="addimg[1]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 2:</strong></td><td><input name="addimg[2]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 3:</strong></td><td><input name="addimg[3]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 4:</strong></td><td><input name="addimg[4]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 5:</strong></td><td><input name="addimg[5]" type="file" size="68" required></td></tr> <tr><td align="right"><strong>Obrázek 6:</strong></td><td><input name="addimg[6]" type="file" size="68" required></td></tr> <? for($i=1; $i<=6; $i++) ?> |
||
|
Časová prodleva: 11 let
|
|||
0