Autor | Zpráva | ||
---|---|---|---|
Akali Profil |
#1 · Zasláno: 17. 5. 2011, 11:47:14 · Upravil/a: Akali
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 |
#2 · Zasláno: 17. 5. 2011, 12:08:45
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 |
#3 · Zasláno: 17. 5. 2011, 19:19:16
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 |
#4 · Zasláno: 17. 5. 2011, 19:26:37
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 |
#5 · Zasláno: 18. 5. 2011, 11:24:55 · Upravil/a: Akali
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 |
#6 · Zasláno: 18. 5. 2011, 14:09:29 · Upravil/a: Alphard
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 |
#7 · Zasláno: 19. 5. 2011, 13:26:47 · Upravil/a: Akali
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 |
#8 · Zasláno: 19. 5. 2011, 13:54:44
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 |
#9 · Zasláno: 19. 5. 2011, 17:52:06
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 |
#10 · Zasláno: 20. 5. 2011, 10:42:28 · Upravil/a: Akali
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 |
#11 · Zasláno: 20. 5. 2011, 18:40:47
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 |
#12 · Zasláno: 21. 5. 2011, 19:27:33
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
|
||
Časová prodleva: 3 dny
|
|||
Akali Profil |
#13 · Zasláno: 24. 5. 2011, 21:02:42
Je to tak? Pomůže mi tedy přesun na servers vypnutým safe modem?
|
||
Alphard Profil |
#14 · Zasláno: 24. 5. 2011, 22:56:18
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 |
#15 · Zasláno: 24. 5. 2011, 23:37:13 · Upravil/a: Davex
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 |
#16 · Zasláno: 25. 5. 2011, 20:41:09
Děkuji mnohokrát, pánové.. Problém vyřešen!
|
||
Davex Profil |
#17 · Zasláno: 26. 5. 2011, 18:50:12
Akali:
Jaké řešení jsi použil? |
||
Akali Profil |
#18 · Zasláno: 26. 5. 2011, 21:27:40
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.. |
||
Časová prodleva: 14 let
|
0