Diskuze: Ukládání obrázku do složky na FTP a do db

PHP PHP Ukládání obrázku do složky na FTP a do db American English version English version

Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

Ahojte, zase já :)

Vytvořil jsem si na testování podstránku k nahrávání souborů. Dostat jej do složky obrazky na FTPku je hračka, ale už se mi nedaří uložit název do databáze.

formulář:

<form method="post" enctype="multipart/form-data">
             <input type="hidden" name="ID" value="<?= htmlspecialchars( $_SESSION['obrazky']['ID']); ?>">
        <label for="file">Soubor:</label>
                        <input type="file" name="file" id="file" /> <br />
                      <label for="popis">Popis:</label>
                        <textarea cols="20" rows="5" name="popis" id="popis"></textarea>
        <input type="submit" value="Odeslat">
</form>

obslužný kontroler:

$_SESSION['obrazky'] =$obrazky= array(
                                        'ID' => $_POST["ID"],
                        'popis' => $_POST['popis'],
                        );
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 100000000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    $this->pridejZpravu("Return Code: " . $_FILES["file"]["error"] . "<br />");
    }
  else
    {
     $this->pridejZpravu("Upload: " . $_FILES["file"]["name"] . "<br />");
     $this->pridejZpravu("Type: " . $_FILES["file"]["type"] . "<br />");
     $this->pridejZpravu("Size: " . ($_FILES["file"]["size"] / 200000000) . " Kb<br />");
     $this->pridejZpravu("Temp file: " . $_FILES["file"]["tmp_name"] . "<br />");

    if (file_exists("obrazky/" . $_FILES["file"]["name"]))
      {
       $this->pridejZpravu("Soubor ".$_FILES["file"]["name"] . " již existuje. ");
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],"obrazky/" . $_FILES["file"]["name"]);

       if(isset($_FILES["file"]) && isset( $_SESSION["popis"])){
            $klice = array( 'popis');
            print_r($klice);
                        $obrazek = array_intersect_key($obrazek, array_flip($klice));
// Uložení článku do DB
                        $spravceInzeratu->ulozObrazek($_SESSION['obrazky']['ID'], $obrazek);
                        $this->pridejZpravu('Obrázek byl úspěšně uložen.');
                        $this->presmeruj('nejnovejsi');
            }
      $this->pridejZpravu("Uloženo v: " . "obrazky/" . $_FILES["file"]["name"]);
      }
    }
  }

a pro jistotu i metoda v modelu:

public function ulozObrazek($id, $obrazek){
    if (!$id){
                        Db::vloz('obrazky', $obrazek);
        }

                else
                        Db::zmen('obrazky', $obrazek, 'WHERE ID = ?', array($id));

}

metoda v Db.php:

public static function vloz($tabulka, $parametry = array()) {
                return self::dotaz("INSERT INTO `$tabulka` (`".
                implode('`, `', array_keys($parametry)).
                "`) VALUES (".str_repeat('?,', sizeOf($parametry)-1)."?)",
                        array_values($parametry));
        }

Mám v tom nějakou očividnou chybu? Když něco nahraje, tak to správně vypíše všechny zprávy, o velikosti souboru, uložení, typu atd.. ale v databázi mám pusto a prázdno.

Struktura tabulky:
ID int(11)
url varchar(40)
popis varchar (40)

později chci ještě přidat pole inzeratID aby se to svázalo, ale to přebíhám..

Díky za rady :-)

 
Odpovědět 22.8.2015 16:46
Avatar
katrincsak
Člen
Avatar
katrincsak:

(Třeba pro inspiraci)
Je to asi měsíc zpátky co jsem dělal stejnou věc. Spíše ti napíšu jak jsem to udělal já. Prvně jsem chtěl ukládat názvy do DB, ale není to pak na konec zbytečné? Mimochodem, taky se jedná o bazar.

Při vytváření inzerátu získáš samozřejmě jedinečný klíč na základě kterého vytvořím i s daným ID název složky do které nahraji fotky. Počet fotek kontroluji již před samotným nahráním, zároveň udělám kompresi velikosti a nahraji.

Při výpisu se zeptám o jaký inzerát se jedná a vypíšu obsah složky ID inzerátu, díky poli opět vypíšu přesně jen to co chci. Vypisuji z DB již jen základní popisy. Maximálně by se vyplatilo uložit název úvodní hlavní velké fotky ;-)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 22.8.2015 18:04
Avatar
katrincsak
Člen
Avatar
Odpovídá na Michal Kuba
katrincsak:

Nedal jsem odpovědět : /

 
Nahoru Odpovědět 22.8.2015 18:08
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na katrincsak
Michal Kuba:

takže se mám vykašlat pro ukládání do databáze? spíš mi PHP vytvoří složku třeba s ID inzerátu a tam už budou fotky?

 
Nahoru Odpovědět 23.8.2015 16:03
Avatar
BlugW
Redaktor
Avatar
Odpovídá na Michal Kuba
BlugW:

Já to mam takhle:

Přeberu nahraný img, změním mu název např. na images8-23-2015_46841, ten hodim do složky images + uložím do databáze název.

Takže vše co udělám je jen přeberu název a uložím do DB :)

PS: A blbnou tu podtržítka, po images má být "_"

Editováno 23.8.2015 16:43
Nahoru Odpovědět  +1 23.8.2015 16:42
Pořiď si mac na www.appletrh.cz. Novinky a zajímavosti ze světa Apple na https://www.applemagazin.eu
Avatar
katrincsak
Člen
Avatar
Odpovídá na Michal Kuba
katrincsak:

Záleží proč by jsi to měl ukládat i do DB. Osobně mi to přijde jako zbytečná data a záleží jak dobře si přizpůsobíš ukládání do db, protože pakliže budeš mít na 1 název 1 sloupec, tak je to dost omezený.

1 inzerát = 1 složka s ID inzerátem = neomezený počet fotek (hlídá script, který to nahrává).
Pakliže se má inzerát smazat -> Smaže se ID inzerátu -> složka s ID i s fotkami uvnitř. 2 funkce.. Jedna vyprázdní složku a další smaže.

Pro svoje využití neznám důvod k čemu by mi byly data v DB. Maximálně úvodní fotka.

 
Nahoru Odpovědět 23.8.2015 17:46
Avatar
BlugW
Redaktor
Avatar
Odpovídá na katrincsak
BlugW:

Proč 1 název 1 sloupec ?
Však do jednoho řádku můžeš uložit několik názvu, např img1.jpg,img2­.jpg,img3.jpg ?

Nahoru Odpovědět 23.8.2015 17:56
Pořiď si mac na www.appletrh.cz. Novinky a zajímavosti ze světa Apple na https://www.applemagazin.eu
Avatar
BlugW
Redaktor
Avatar
Odpovídá na BlugW
BlugW:

teda do 1 buňky.

Nahoru Odpovědět 23.8.2015 18:05
Pořiď si mac na www.appletrh.cz. Novinky a zajímavosti ze světa Apple na https://www.applemagazin.eu
Avatar
katrincsak
Člen
Avatar
Odpovídá na BlugW
katrincsak:

To můžeš a díky poly taktéž víš které pořadí jaká fotka má, ale to jsem jen tak napsal a použil zrovna nevhodný důvod. Protože dle popisu to stejně vypadá, že to nenahrává jako 1 řetězec.

Každopádně mi to přijde jako zbytečná data na víc a pakliže budu potřebovat vypisovat úplně přesně dané pořadí mohu právě přejmenovat název, očíslovat a vypisovat.

Editováno 23.8.2015 18:10
 
Nahoru Odpovědět  +1 23.8.2015 18:09
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.