Autor Zpráva
Obsi
Profil
Dobrý den,
Potřeboval bych udělat mazání příspěvků v mé jednoduché diskusi, udělané podle tohoto návodu. Pěkně dlouho jsem googlil, hledal a dělal všechno možné, ale došel jsem k závěru, že asi PHP neumí smazat jen část jednoho souboru. Proto mi došlo, že by se každá zpráva musela ukládat do samostatného souboru.. Takže jsem googlil a zjistil jsem, že unikátní název souboru se dá udělat pomocí
time()
(není tak obrovská aby 2 lidé napsali 1 příspěvek v jednu vteřinu...). Ale zase.. jak připojit k číslu příponu .php? A jak includovat ty soubory (šlo by
<?php include "$nazevsouboru";?> a 
$nazevsouboru= Time()
?)? Napadla mě zase úplná blbost a to, že by každý příspěvek měl ID, stejné, jako název souboru, ve kterém je příspěvek zapsán tedy něco jako
$id=$nazevsouboru
a já bych to mazal formulářem, tak, že bych se kouknul do zdroje, našel bych ID a do
<input type="text" name="smaz">
action bych nasměroval na něco takovýhleho
unlink("$smaz");
, ale nevím, jak vytáhnout value z toho formuláře..
Prosil bych vás, jestli byste mi tuto metodu nějak neopravili, nebo nenavrhli úplně jinou, nebo mi prostě řekli, že to nejde.
S PHP začínám, tak prosím žádné brutálnosti. :-)
Doufám, že jsem vás pobavil. :-)
panther
Profil
Obsi:
obsah tohoto formulářového políčka bude $_GET['smaz'] nebo $_POST['smaz'] v závislosti na hodnotě atributu action u formuláře.

ad include: include $promenna . '.php';

nebo nenavrhli úplně jinou
já bych být tebou ukládal do DB, ale to je na tobě, jestli se chceš učit nebo ne. Nevím, odkud ty články chceš mazat, předpokládám, že z nějaké „administrace“, kam máš přístup jen ty. Pak bych volil ne formulář, ale u každého článku odkaz delete.php?id=1234. V delete.php by pak byla kontrola, zda je vyplněné ID a podle toho smazal soubor. Pro vlastní potřebu to tobě možná postačí.
Obsi
Profil
Jsem vůl, dal jsem špatný odkaz, je to jen velmi jednoduchá diskuse (příklad: http://www.jakdelatweby.cz/php/priklady/diskuse-2.php ), né žádné články..

Tím include si asi myslel to Time().. Takže by šlo
Time() . '.php';
? Nevím, jak zjistit název souboru, aby se automaticky includoval. Jedině, že by se to ukládalo do složky třeba prispevky a já bych vyincludoval obsah té složky. A samozřejmě, že bych se chtěl učit práci s DB, ale nemám žádný zdroj.. Pokud byste někdo věděl, napište mi ho sem.. Nejlépe něco na Internetu.
Je to soukromá diskuse s pár lidmi, hostovaná na freehostingu endora.cz a ten podporuje i MySQL databázi, ale s ní vůbec nic neumím. Nikdy nic nikde nijak jsem s ní nedělal.
Chro
Profil
Obsi:
Pro ID založené na času můžeš použít kód:
$mikrocas = microtime(TRUE);
//hodnota např. 1234567890.6543
$id = base_convert($mikrocas, 10, 36);
//převod do 36. soustavy, znaky a-z 0-9
echo $id;
//zobrazí např. w4o8qz

Do jednoho souboru lze ukládat více příspěvků, jen si je musíš oddělit nějakým separátorem.
Příklad obsahu souboru diskuse.txt:

První příspěvek
od Taťány
text
<{{{((([[[SEPARATOR:POST]]])))}}}>
Druhý příspěvek
od Borise
text
<{{{((([[[SEPARATOR:POST]]])))}}}>
Třetí příspěvek
od Voloďy
text


Ve skriptu je pak vytáhneš např. tímto kódem:
if (file_exists('diskuse.txt'))
{
$prispevky = file_get_contents('diskuse.txt');
$pole_prispevky = explode('<{{{((([[[SEPARATOR:POST]]])))}}}>', $prispevky);
foreach ($pole_prispevky as $prispevek)
{
list($nadpis, $autor, $text) = explode("\n", trim($prispevek));
echo $nadpis.'<br>'.$autor.'<br>'.$text."<hr>\n";
}
//A jdem mazat..
$vymaz = 2;
if (isset($pole_prispevky[$vymaz-1]))
{
unset($pole_prispevky[$vymaz-1]);
//druhý příspěvek smazán
}
file_put_contents('diskuse.txt', implode('<{{{((([[[SEPARATOR:POST]]])))}}}>', $pole_prispevky));
//spojíme pole do řetězce a řetězec uložíme do souboru
}
Obsi
Profil
A tedy to vše v jednom souboru? Půjdou tedy takto jednoduše mazat příspěvky? Dalo by se to nějak přeložit? Moc tomu nerozumím.. Něco jsem vygooglil, ale tak trochu.. nechápu.


U toho času mě napadlo, že by šlo to udělat jak jsem psal v 1. příspěvku.. U každého příspěvku by bylo <span style="display: none;">$id</span>koukal bych se do zdroje. Mazal bych to tím formulářem.. To je taky možnost, ale ta Chroova druhá je lepší..
Chro
Profil
Na mazání příspěvků musíš mít nějakou administraci (stránku), v ní formulář, kde zadáš heslo, ID a klikneš na OK. Tedy pokud nechceš mít např. odkaz Smaž teď hned u každého příspěvku a ponechat volnou ruku v mazání komukoli. Bez detailních podrobností jak by to celé mělo vypadat a fungovat, nebo bez ukázek již existujících kódů, bohužel neumím poradit.
Obsi
Profil
Nenene, budu to obsluhovat sám... Co v tom tvém příspěvku nechápu, je proměnná $pole_prispevky a
unset($pole_prispevky[$vymaz-1]);
//druhý příspěvek smazán
}
file_put_contents('diskuse.txt', implode('<{{{((([[[SEPARATOR:POST]]])))}}}>', $pole_prispevky));
//spojíme pole do řetězce a řetězec uložíme do souboru
týhle části.
Chro
Profil
Tuhle část
//A jdem mazat..
$vymaz = 2;
if (isset($pole_prispevky[$vymaz-1]))
{
unset($pole_prispevky[$vymaz-1]);
//druhý příspěvek smazán
}

můžeš klidně z kódu vymazat, ignorovat.
Jde jen o příklad, jak lze z pole s příspěvky (které se následně spojí funkcí implode a uloží do souboru funkcí file_put_contents) vymazat příspěvek, pokud znáš jeho pořadí v souboru.
Obsi
Profil
Tak sem dávám kód, kterým zapisuji příspěvky...

<?php
$jmeno = $_POST['jmeno'];
$email = $_POST['email'];
$web = $_POST['web'];
$zprava = $_POST['zprava'];

$timeDate = $_POST['timeDate'];
$letapane = $_POS['letapane'];

$jmeno=HTMLSpecialChars($jmeno); //převede některé znaky na enity
$email=HTMLSpecialChars($email);
$web=HTMLSpecialChars($web);
$zprava=HTMLSpecialChars($zprava);

$jmeno=stripslashes($jmeno); //odstraní lomítka
$email=stripslashes($email);
$web=stripslashes($web);
$zprava=stripslashes($zprava);

$zprava = str_replace("\n"," <br> ", $zprava); //nové řádky nahradí <br>
$zprava = substr($zprava, 0, 10000);//zpráva bude mít maximálně 10000 znaků

$email_celek=" | <a href='mailto:$email'>$email</a>";
$web_celek=" | <a href='$web'>$web</a>";
$timeDate = date('j.n  H:i');
$letapane = date('Y');

if ($web=="http://"){$web_celek="";} //pokud se nevyplní nic se nevypíše 
if ($email==""){$email_celek="";} // -||-

if ($zprava!="" and $jmeno!=""){ //provede se pokud není prázdná zpráva a jméno
$celek="<p>Zprávu poslal/a <strong>$jmeno</strong>$email_celek $web_celek<br>|<i class='datum'>$timeDate léta Páně $letapane</i></p><p>$zprava</p><hr>";
$soubor = fopen ('./zpravy.php','a'); //otevře soubor pro doplňování
fwrite ($soubor, $celek); //zapíše zprávu
fclose ($soubor); //zavře soubor
}
?>
Obsi
Profil
Napadla mě další věc, nejjednodušší (:D to je slovo). Do textovýho pole by se vypsal obsah souboru se zprávama (zpravy.php) a já bych to upravil a uložil.. Tím by se původní soubor přepsal, tím, co jsem upravil.. Otázky zní:

Jak načíst zpravy.php do textarey? #To už jsem jakž takž vyřešil <textarea><?php include "zpravy.php";></textarea>

Jak přepsat původní soubor? #Po pokusu, tak
$soubor = fopen('./zpravy.php','w'); //pokud kolem ./zpravy.php nedám ' a ' hlásí mi to chybu.
fwrite ($soubor,$edit);
fclose ($soubor);
nefunguje.
Díky a omlouvám se, jestli někoho obnovení vyrušilo.

///Další edit.. Ono to zprávy maže, ale všechny. :D S tím je teď co?
Obsi
Profil
Takže vyřešeno!

Takto:

//edit.php
<!doctype html>
<html>
<body>
<meta charset="UTF-8">
<form action="smaz.php" method="POST">
<textarea name="edit" cols="500" rows="600"><?php include "zpravy.php";?></textarea>
<input type="submit" value=Edituj>
</form>
..


//smaz.php
<?php
$edit=$_POST['edit'];
$po_editaci=$_POST['po_editaci'];
$po_editaci=$edit;
echo "<strong>PŘÍSPĚVEK BYL SMAZÁN</strong>";
$soubor = fopen('./zpravy.php','w');
fwrite ($soubor,$po_editaci);
fclose ($soubor);
?>

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: