| 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