Cau potreboval bych vedet jak smaznout jednoduse soubor. V manualu jsem nasel jen,ze se na to pouziva unlink. Nechavam uzivatele at si sami vyberou obrazek k jejich jmenu napr do diskuze. Chci jim ale dat i moznost, aby onen obrazek molhli smaznout, kdyby se jim znelibil a neotravovali tim me.
Tenhle kod mi vzdy napise, ze se soubor nepodarilo nahrat:
if($smaz_obr="smaz") //smazani obrazku
{
$nacteni_obr=mysql_query("SELECT * FROM `obrazky` WHERE `identifikator` LIKE '$id'");
while($zaznam=mysql_fetch_array($nacteni_obr))
{
$obr=$zaznam["id_obrazku"];
if(unlink("cesta/$obr")){ $smazano="true"; }
}
if($smazano=="true")
{
mysql_query("DELETE FROM `obr` WHERE `identifikator` LIKE '$id'");
}
else
{
echo "Nepodarilo se obrazek smazat.";
}
}
dik za rady
Doporučuju postupně si zobrazovat jednotlivý proměný, abys našel v čem to je...
Třeba co vypadá podezřele, tak že jednou vybíráš z tablu `obrazky` a pak to mažeš z tablu `obr`. To máš duplovaný? Třeba si se přepsal a tudíž je $zaznam prazdnej a nedojde k nastevení $smazano na true a tudíž k else clausu :)
V manuálu je u unlink poznámka: "Tato funkce nemusí na Windows fungovat". Osobně s tím zkušenosti nemám, jsem na wz.
Pokud jsi na wz taky, tak zkus zkontrolovat práva, nebo použitou cestu k souboru. Doporučuju cestu jako na disku:
/3w/w.cz/g/gonzik/.../$obr
ahaaaaa! No nejspis to bude tema tabulkama! Fakt dik, nekdy to clovek proste nevidi.
ne zas takovej jouda nejsem, anebo prave naopak jsem jeste vetsi :)
chyba v tabulkach neni a nikdy nebyla, to jsem jen prepsal tabulku obr na obrazky v premire snahy chranit se pred pripadnymi hakery, jenze u te druhe jsem to prepsat zapomel.
Jinak te poznamky v manualu jsem si vsiml, ale nevim k cemu mi je, proste to bud fungovat bude nebo ne, zadny navod, jak se s tim vyporadat...
nejspis probrouzdam net...
if($smaz_obr="smaz") //smazani obrazku
{
$nacteni_obr=mysql_query("SELECT * FROM `obrazky` WHERE `identifikator` LIKE '$id'");
while($zaznam=mysql_fetch_array($nacteni_obr))
{
$obr=$zaznam["id_obrazku"];
if(unlink("cesta/$obr")){ $smazano="true"; }
}
if($smazano=="true")
{
mysql_query("DELETE FROM `obr` WHERE `identifikator`= '$id' ");
}
else
{
echo "Nepodarilo se obrazek smazat.";
}
}
Hele vyechuj si tu cestu, kterou se snažíš ten obrázek smazat. Podle:
$obr=$zaznam["id_obrazku"];
if(unlink("cesta/$obr")){ $smazano="true"; }
to vypadá, že v $obr máš číslo id místo jména souboru (s koncovkou). A co je ta "cesta" ? To je nějaký adresář? Nechceš zkusit:
$obr=$zaznam["id_obrazku"];
if(unlink("./cesta/$obr")){ $smazano="true"; }
hej diky za snahu pomoct mi. Nakonec jsem chybu objevil uplne nekde jinde v kodu. unlink funguje v pohode, cesta znamena cesta do adresare, kde je obr ulozen(jen jsem to trochu zjednodusil, jak jsem psal - ochrana proti hackerum :) , id_obrazku je nazev souboru.
Chyby jsem nasel dve, prvni byla v tom, ze jsem si nacetl jednu tab do asoc. pole zaznam a par kroku na to jsem toto asoc. pole blbe prepsal nactenim z jine tab.
A druha chyba byla v tom, ze u if, else apod. muzete pouzit pro zjednoduseni:
<?
if($pozdrav==1)
{
?>
<b>Ahoj!</b>
<?
}
?>
u cyklu to ale asi nejde, me to neslo u while pri vypisovani zaznamu z asoc. pole. Takze na to si je nutne dat tez pozor.
Ale unlink funguje v poho :)
mimo tema:
if($smazano=="true") <-- ale fuj!
ty uvozovky nechapu uz vubec. jinak co to dela: porovna to hodnotu $smazano s true - vyjde true, pak zjistuje jestli vyslo true a pokud jo, vykona prikazy za if. kdyz napises jenom if($smazano), tak se jenom zjisti, jestli je $smazano true. to tvoje je jakobys napsal if(true==true), coz ti jiste prijde jako blbost.
no a kdyz uz jsme u toho, tak ta promenna je tam uplne k nicemu (pokud ji teda nepouzivas jeste nekde jinde):
if(unlink("cesta/$obr"))
mysql_query("DELETE FROM `obr` WHERE `identifikator` LIKE '$id'");
else
echo "Nepodarilo se obrazek smazat.";
jo a ten identifikator mas jako int nebo varchar?
hele pokud hledate ve sloupci urcity retezec, pouzivejte spis WHERE `identifikator` = '$id' (ne LIKE) ... a druha vec: kdyz mazete jeden jedinej radek z databaze, doporucuju na konec napsat LIMIT 1; pri eventualni chybe v dotazu se muzete vyhnout nechtenemu smazani cele tabulky (a pokud jste takovi lemplove jako ja a nezalohujete, tak to docela zamrzi).
to Tonik:
moc se mi nechtelo mazat zaznam, kdyz ho projizdim v cyklu while.
identifikator je varchar....
jinak samozrejme souhlasim, jen jsem se to tak spatne naucil a ted to tak pouzivam.
to Tonik:
nejsem si jist jestli je
if($promena) to same jako if($promena=="true")
podle me if($promena) zjistuje zda promena vubec existuje, nebo jestli ma nejakou hodnotu. Takze takova podminka propusti dalsi chod skriptu ikdyz je $promena="false".
jendakenda: ne. if($promenna) vezme promennou, pretypuje ji na typ boolean a pokud vyjde true, provede prikazy za if. pokud false, tak je neprovede. vice viz manual: http://www.php.net/manual/en/language.control-structures.php#control-structures.if a odkazy u toho.
jestli promenna existuje se zjistuje pomoci funkce isset() - http://mirrors.inway.cz/manual/en/function.isset.php
pak jeste existuji funkce empty(), is_null(), defined()
navic ty uvozovky! "true" se pretypuje na true, ale "false" taky! retezec je po pretypovani na boolean false jenom pokud je prazdny ("") nebo obsahuje jen a pouze 0 ("0") - http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting
jeste k tem uvozovkam: ano, pokud udelas $promenna = "false", tak se to pretypuje na true a projde to. pokud ale udelas $promenna = false, nic se nepretypuje a neprojde to. pis to bez tech uvozovek.
doporucuju nastudovat tuto kapitolku z manualu: http://www.php.net/manual/en/language.types.php