Autor Zpráva
Lukes
Profil *
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
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>
a pomocí
<?
foreach();
?>
pole zpracovat a uložit do databáze
Lukes
Profil *
Taps:
uf nějakej více přesnější návod by nebyl? musím používát cyklus?
Taps
Profil
Lukes:
multiple file - vložení do databáze
Lukes
Profil *
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
V cyklu for napis misto 5 cislo 7
Lukes
Profil *
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
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 *
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 *
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
    }
}
?>
Celý kód i s příkladem použití najdeš na stránce s funkcí.

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 *
nahrávám pouze jpg a png obrázky
CZghost
Profil
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;
    }
↑ Otevření obrázku

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);
}
↑ Uložení obrázku

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 *
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
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 *
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
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>
pak by mohlo fungovat
<?
for($i=1; $i<=6; $i++)
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0