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