Autor Zpráva
Akali
Profil
Ahoj, mám problém s nahráním fotky do složky.

<?php  
include '../../db.php';


$objekt_vysledku = mysqli_query($db_spojeni, "SET NAMES 'UTF8'");


$objekt_vysledku = mysqli_query($db_spojeni, 
  "SELECT id FROM hraci ORDER BY id DESC LIMIT 1"); 


while ($radek = mysqli_fetch_array($objekt_vysledku))
{  
  $id = $radek['id'] + 1;

}
?>



<form name="odeslano" action="#" method="post" enctype="multipart/form-data">
<b>Jmeno hrace<br>
<input name="jmeno" size="30"><br>

<b>Přijmeni</b> (např. 1:1)<br>
<input name="prijmeni" size="8"><br>

<b>narozeni</b> (např. 2:2)<br>
<input name="narozeni" size="8"><br>

fotka<br>
<input name="fotka" type="file">

<input type="submit" name="odeslano" value="Přidat zápas">
</form>

<?php 
echo $id;
echo "cesta - ".$cesta." ";

if (isset($_POST['odeslano']))
{ 


mkdir($id, 0777);

if (is_uploaded_file($soubor))://pokud jiz byl proveden upload  
 $cesta="".$id."/"; //nami definovana cesta  
if (move_uploaded_file ($soubor, $cesta.$soubor_name)): //presunuti souboru do naseho adresare  
 echo "Soubor $soubor_name o velikosti $soubor_size bajtů byl úspěšně nahrán na server"; // oznameni o uspesnosti  
 else:  
 echo "Při nahrávání souboru došlo k chybě!"; //oznameni chyby  
 endif;  
 endif;   
 

    if (empty($_POST['jmeno']) || empty($_POST['prijmeni']) || empty($_POST['narozeni']))
    {
        echo "Zpráva nebyla odeslána..";
    }
    else
    {


        $objekt_vysledku = mysqli_query($db_spojeni, "SET NAMES 'UTF8'");


        $sql_prikaz = 
            "INSERT INTO hraci(jmeno, prijmeni, narozeni, fotka) "
            ."VALUES('"
            .mysqli_real_escape_string($db_spojeni,$_POST['jmeno'])
            ."','"
            .mysqli_real_escape_string($db_spojeni,$_POST['prijmeni'])
            ."','"
            .mysqli_real_escape_string($db_spojeni,$_POST['narozeni'])
            ."','"
            .mysqli_real_escape_string($db_spojeni,$_POST['fotka'])
            ."')" 
        ;
                          

        $objekt_vysledku = mysqli_query($db_spojeni, $sql_prikaz);

        echo "Vaše zpráva byla úspěšně odeslána";
    }
}          
?>


Složka se mi vytvoří, ale obrázek se do ni nenahraje. Když si vypíši $cesta tak se nic nevypíše.. Nevím, kde mám hledat chybu.
$id je zjišťována databáze (nejvyšší id + 1)..
Alphard
Profil
Tento postup stejně není zrovna ideální. Nejdříve vložte záznam do databáze, id se vloží díky auto_increment a podle něho pak uložte fotky.
Akali
Profil
Aha. A není jedno, jestli prvně zjistím nejvyšší číslo v DB (přičtu jedničku) a pak teprve nahraju data nebo obráceně?
Alphard
Profil
Akali:
• Při paralelní přístupu může dojít ke kolizi.
• Při smazání poslední fotky by nemělo být znovu obsazeno smazané id - což nebude v databázi, ale bude ve jménu souboru => kolize, ještě horší.
• Je zvykem přidělovat id dle auto_increment a následně se jím řídit :-)
Akali
Profil
Tak jsem to udělal podle Vašich rad. Zdá se, že je vše v pořádku, ale obrázek se nahraje jenom tehdy, pokud zadám cestu ke složce ručně

 if (is_uploaded_file($soubor)):
 $cesta="images/";
 if (move_uploaded_file ($soubor, $cesta.$soubor_name)): 
 echo "Soubor $soubor_name o velikosti $soubor_size bajtů byl úspěšně nahrán na server";
 else:  
 echo "Při nahrávání souboru došlo k chybě!"; 
 endif;  
 endif; 

Pokud cestu zadám pomocí proměnné
 $cesta="".$id."/"; 


Tak to vypíše chybu a soubor se nenahraje

Warning: move_uploaded_file() [function.move-uploaded-file]: SAFE MODE Restriction in effect. The script whose uid is 1001 is not allowed to access /home/www/velkyberanov-fotbal.cz/subdomeny/www/hraci/36 owned by uid 33 in /home/www/velkyberanov-fotbal.cz/subdomeny/www/hraci/upload.php on line 22
Alphard
Profil
Kde teď berete id? Po provedení insertu by mělo fungovat
$filename = 'images/'.mysql_insert_id().'/';

Navíc, raději se nespoléhejte na zapnuté register globals a pracujte s polem $_FILES.
Akali
Profil
Nevím jak docílit toho, aby se mi mysql_insert_id() vypisovalo

<?php
include '../../db.php'; 
if (isset($_POST['odeslano']))
{ 
    if (empty($_POST['jmeno']) || empty($_POST['prijmeni']) || empty($_POST['narozeni']))
    {
        echo "Zpráva nebyla odeslána..";
    }
    else
    {

        $objekt_vysledku = mysqli_query($db_spojeni, "SET NAMES 'UTF8'");

        $sql_prikaz = 
            "INSERT INTO hraci(jmeno, prijmeni, narozeni, fotka) "
            ."VALUES('"
            .mysqli_real_escape_string($db_spojeni,$_POST['jmeno'])
            ."','"
            .mysqli_real_escape_string($db_spojeni,$_POST['prijmeni'])
            ."','"
            .mysqli_real_escape_string($db_spojeni,$_POST['narozeni'])
            ."','"
            .mysqli_real_escape_string($db_spojeni,$_POST['fotka'])
            ."')" 
        ;
        $objekt_vysledku = mysqli_query($db_spojeni, $sql_prikaz);

        echo "Vaše zpráva byla úspěšně odeslána";
        $id = mysql_insert_id();
        echo $id;
    }
}   
?>
Alphard
Profil
Omlouvám se, nevšiml jsem si, že používáte mysqli, v tom případě mysqli_insert_id(), neberte rady tak mechanicky, používejte vlastní hlavu a manuál :-)
Akali
Profil
Pravda.. Nikdy jsem takhle ID z databáze nezjišťoval, proto ani nevím co od toho čekat. Prozatím Vám děkuji, doma to ozkouším..
Akali
Profil
Tak jsem tam, kde jsem byl do teď.. I když to všechno dělám podle Vašich instrukcí, při uploadu fotky to vyhodí chybu..

<?php
include '../../db.php'; 
if (isset($_POST['odeslano']))
{ 
    if (empty($_POST['jmeno']) || empty($_POST['prijmeni']) || empty($_POST['narozeni']))
    {
        echo "Zpráva nebyla odeslána..";
    }
    else
    {

        $objekt_vysledku = mysqli_query($db_spojeni, "SET NAMES 'UTF8'");

        $sql_prikaz = 
            "INSERT INTO hraci(jmeno, prijmeni, narozeni, fotka) "
            ."VALUES('"
            .mysqli_real_escape_string($db_spojeni,$_POST['jmeno'])
            ."','"
            .mysqli_real_escape_string($db_spojeni,$_POST['prijmeni'])
            ."','"
            .mysqli_real_escape_string($db_spojeni,$_POST['narozeni'])
            ."','"
            .mysqli_real_escape_string($db_spojeni,$_POST['fotka'])
            ."')" 
        ;
        $objekt_vysledku = mysqli_query($db_spojeni, $sql_prikaz);

        echo "Vaše zpráva byla úspěšně odeslána";
        $id = mysqli_insert_id($db_spojeni);
        echo $id;
        mkdir($id, 0700);
        chmod($id, 0777);
          
         if (is_uploaded_file($soubor))://pokud jiz byl proveden upload
               $cesta = ''.mysqli_insert_id($db_spojeni).'/';    
             if (move_uploaded_file ($soubor, $cesta.$soubor_name)): //presunuti souboru do naseho adresare  
               echo "Soubor $soubor_name o velikosti $soubor_size bajtů byl úspěšně nahrán na server"; // oznameni o uspesnosti  
               else:  
               echo "Při nahrávání souboru došlo k chybě!"; //oznameni chyby  
             endif;  
          endif;        
    }
}   
?>



<form name="odeslano" action="#" method="post" enctype="multipart/form-data">
<b>Jmeno hrace<br>
<input name="jmeno" size="30"><br>

<b>Přijmeni</b> (např. 1:1)<br>
<input name="prijmeni" size="8"><br>

<b>narozeni</b> (např. 2:2)<br>
<input name="narozeni" size="8"><br>

<b>fotka</b> (např. 2:2)<br>
<input name="soubor" type="file">;

<input type="submit" name="odeslano" value="Přidat zápas">
</form>



Warning: move_uploaded_file() [function.move-uploaded-file]: SAFE MODE Restriction in effect. The script whose uid is 1001 is not allowed to access /home/www/velkyberanov-fotbal.cz/subdomeny/www/hraci/57 owned by uid 33 in /home/www/velkyberanov-fotbal.cz/subdomeny/www/hraci/informace.php on line 36
Alphard
Profil
Postup je správný, jen safe mode je kapitola sama pro sebe. Kdybyste opravil původní script, skončilo by to stejně. Já se safe mode naštěstí nemám zkušenosti, ale je o něm tady dost vláken, hlavně pár let zpátky. Často jsem viděl doporučení pracovat s ftp funkcemi, nevím, jestli je to nezbytné.
Akali
Profil
Takže mám přesunou na server, kde je safe mod vypnutý a mělo by to fungovat? Myslím, že ho stejně na nic nevyužiju
Akali
Profil
Je to tak? Pomůže mi tedy přesun na servers vypnutým safe modem?
Alphard
Profil
Nevím, zkuste to. Podmínka if (is_uploaded_file($soubor)) v daném místě nemá už moc smysl. $cesta bych použil v mkdir() i move_uploaded_file, není důvod to oddělovat. Před nastavení práv možná hodit umask(0000)

Jestli ale vytváříte nové adresáře jen kvůi fotce, dejte vše do jednoho pojmenováno jako "$id.jpg" (přípomu generovat dle typu) a ušetříte si starosti.
Davex
Profil
Akali:
Příčina je problémů je přesně v tomto:

SAFE MODE Restriction in effect. The script whose uid is 1001 is not allowed to access /home/www/velkyberanov-fotbal.cz/subdomeny/www/hraci/57 owned by uid 33
- tedy skript má jiného vlastníka než má adresář do kterého se snaží zapisovat - se zapnutým SAFE MODE musí být stejný vlastník skriptu a adresáře.

V tomto případě je to způsobeno tím, že adresář vytváří skript funkcí mkdir() a řešení je možných několik:
1) vypnout SAFE MODE
2) vytvářet adresář pomocí FTP funkcí ftp_mkdir...
3) adresáře vytvořit ručně předem přes FTP
4) adresáře nevytvářet
5) změnit webhosting - na takový, kde PHP běží pod uživatelem, který vlastní skript a ne pod uživatelem www-data (uid 33)
Akali
Profil
Děkuji mnohokrát, pánové.. Problém vyřešen!
Davex
Profil
Akali:
Jaké řešení jsi použil?
Akali
Profil
Před tím, než jsem to začal řešit jsem nevěděl o mysqli_insert_id($db_spojeni) takže jsem to dělal hodně složitě. Nefungovalo to (možná kvůli safe mode) a když mě alphard navedl, abych nevytvářel pro každou fotku novou složku (snad to nebude potřeba), nahrávám obrázky do složky "hraci". Při uploadu pojmenuju fotku nejvyšším ID (id zapsaného řádku) z databáze..

Ještě jednou děkuji..

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0