Vánoční nadílka Vánoční nadílka
Až 80% zdarma! Předvánoční BLACK FRIDAY akce. Více informací
Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:22.8.2015 16:46

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:22.8.2015 18:04

(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:22.8.2015 18:08

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:23.8.2015 16:03

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
Odpovídá na Michal Kuba
Neaktivní uživatel:23.8.2015 16:42

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
Neaktivní uživatelský účet
Avatar
katrincsak
Člen
Avatar
Odpovídá na Michal Kuba
katrincsak:23.8.2015 17:46

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
Odpovídá na katrincsak
Neaktivní uživatel:23.8.2015 17:56

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
Neaktivní uživatelský účet
Avatar
Nahoru Odpovědět 23.8.2015 18:05
Neaktivní uživatelský účet
Avatar
katrincsak
Člen
Avatar
Odpovídá na Neaktivní uživatel
katrincsak:23.8.2015 18:09

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
Avatar
Karel Labonek:13. května 18:12

Omlouvám se za své neznalosti, mohli by jste mě trochu nakopnout. Formulář-input-file potom pomocí

$obrazek = $_POST['obrazek']

si načtu z superglobálního pole soubor do proměnné a jak ho teď uložím do složky s ostatními fotkami ?
Moc děkuji za pomoc.

 
Nahoru Odpovědět 13. května 18:12
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Karel Labonek
Petr Čech:14. května 15:23

Můžeš se inspirovat třeba tady: https://www.w3schools.com/…e_upload.asp
Důležité je nevynechat ty kontroly, jestli jde o obrázek, jinak neexistuje důvod, proč by vám tam někdo nenahrál třeba PHP skript a nespustil is ho...

Nahoru Odpovědět  +1 14. května 15:23
the cake is a lie
Avatar
Nahoru Odpovědět  +1 14. května 21:52
Chybami se člověk učí, běžte se učit jinam!
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Petr Čech
Peter Mlich:15. května 7:16

Ten script jde pribalit k tomu obrazku. Jpegy umi ruzne veci navic. Sam se nejspis nespusti, ale jestli obrazky uklada do slozky a nemeni nazev, tak by jej hacker mohl spustit z te slozky. Pokud tam nema spravne nastevena opravneni.

 
Nahoru Odpovědět 15. května 7:16
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 13 zpráv z 13.