Autor Zpráva
smonkey
Profil
Zdravím,
můj web je smonkey.ic.cz...

Vytvořil jsem si jednoduchý "formulář" na odesílání zpráv a potřeboval bych, aby se tyto zprávy odesílaly do kategorie, kterou zvolím při psaní zprávy.

Zde je kód odesílacího formuláře:

<table border="0" cellspacing="0" cellpadding="0" align="center">
<form action="clanky.php" method="post">
<tr>
<td width=120 class=povinne>
Jméno:
</td>
<td>
<input type="text" name="jmeno" size="30" value="<?
if ($jmeno=="" || $popis==""):	//pokud nebudou zadány všechny povinné údaje, objeví se formulář znovu (s údaji, které již byly vyplněny)
echo $jmeno;
endif;
?>">
</td>
</tr>
<input type="hidden" name="odeslano" value="ano">  

<tr>
<td valign=top width=120 class=povinne>
Kategorie:
</td>
<td>
<select name="stat" size="1">
<option value="s">Škola</option>
<option value="w">Web</option>
<option value="o">Ostatní</option>
</select>
</td>
</tr>

<tr>
<td valign=top width=120 class=povinne>
Text zprávy:
</td>
<td>
<textarea cols="29" rows="5" name="popis"><?
if ($jmeno=="" || $popis==""):	//pokud nebudou zadány všechny povinné údaje, objeví se formulář znovu (s údaji, které již byly vyplněny)
echo $popis;
endif;
?>
</textarea>
</td>
</tr>
<tr>
<td width=120>&nbsp;
</td>
<td>
<center><input type="submit" value="Odeslat">&nbsp;&nbsp;&nbsp;<input type="Reset" value="Vymazat"></center>
			</td>
		</tr>
		</form>
	</table>


	
</table>
   
<? endif ?>


Na řádku 22 - 26 je <select> - to bych potřeboval upravit...
Předem děkuji za odpovědi
mckay
Profil
smonkey:
Na řádku 22 - 26 je <select> - to bych potřeboval upravit...
Jak upravit? Řekl bych, že nejsem jediný, kdo bude mít problém pochopit, co vlastně potřebuješ.
smonkey
Profil
No asi takhle - Po vybrání určité kategorie v select a následném odeslání zprávy, by se zpráva zařadila podle vybrané kategorie
Mastodont
Profil
To si musíš napsat v clanky.php, ne v tomto formuláři.
Beavis
Profil
smonkey:
<ot>
Koukám na ten tvůj web, tohle je zajímavé:
Umístěte prosím tuto ikonku na Váš web.
<a href="http://www.smonkey.ic.cz"><img src="images/animbanner.gif" border="0" alt="smonkey.ic.cz" ></a>

Píšeš vkládání článků v PHP, a neumíš napsat jednoduchý odkaz s ikonkou? :-)
</ot>
Jak již Psal Mastodont, tohle musí zpracovat skript na straně serveru, v Tvém případě clanky.php..
fajzen
Profil
smonkey:
nebolo by tiež od veci dorobiť identifikáciu používateľa ;)
Alphard
Profil
smonkey:
Ukažte nám ten script, kterým to zapisujete, bez něho jako byste říkal "vyrobte mi to", což by patřilo do jiné kategorie.
smonkey
Profil
Omlouvám se, došlo mi to až ve škole - že musím poslat script, který to zapisuje...

Takže se ještě jednou se omlouvám :-) A mimochodem, co mám špatně na tom kodu s ikonkou?


<?
if ($odeslano=="ano"):
if ($jmeno=="" || $popis==""):					//kontrola zadaných udajů, pokud nebyly zadány všechny povinné údaje, do knihy se nic nezapíše

echo "<center><br><font class=male>Musíte vyplnit všechny povinné údaje!<br></font></center>";

else:																	//všechny povinné údaje jsou zadány

$name = "Napsal <font class=jmeno>$jmeno</font>\n";
	
$cas = ", dne <font class=cas>" . Date("j. " . "m. " . "Y,  " . "H:i:s") . "</font><BR>\n";
//do promenne "cas" uloží aktuální datum a čas ve formátu (př. 5. 11. 2000, 13:54:53), zformátuje a načne další řádek

	$popis2 = NL2BR(HTMLSpecialChars($popis));													//změna konců řádků na tagy <BR> a ostraní znaky, které by mohly porušit formátování
	$zprava = "<BR><font class=text>$popis2</font><BR><BR><HR size=\"1\" width=\"70%\" align=\"center\" color=\"#FFcc99\"><BR>\n\n";		//do proměnné "www" uloží $popis2, zformátuje, přidá čáru, která bude oddělovat příspěvky a otevře nový řádek

$write = StripSlashes($name . $cas . $e_mail . $www . $zprava);		
//do proměnné "write" uloží všechna data, která se budou zapisovat a odstraní escape sekvence

if (File_Exists ("book.dat")):											//existuje soubor book.dat
	$fp = FOpen ("book.dat", "r");										//otevře soubor book.dat pro čtení
	$data = FRead ($fp, FileSize("book.dat"));						//přečte data ze souboru a uloží do proměnné "data" - kvůli tomu aby se zobrazoval poslední příspěvek nahoře
	FClose($fp);														//zavře book.dat
endif;
	
	$fp = FOpen ("book.dat", "w");										//otevře book.dat pro přepis nebo vytvoření
	FWrite ($fp, $write . $data);											//zápis do souboru book.dat (nejprve aktuální příspěvek, poté předešlý obsah souboru book.dat)
	FClose ($fp);		
									//zavře soubor book.dat
endif;
endif;
?>
	


<?
if (File_Exists ("book.dat")):											//existuje soubor book.dat
$fp = FOpen ("book.dat", "r");											//otevře soubor book.dat pro čteni
FPassThru($fp);															//vypíše obsah souboru
endif;
?>
fajzen
Profil
smonkey:
Takže se ještě jednou se omlouvám :-) A mimochodem, co mám špatně na tom kodu s ikonkou?
máš tam relatívny odkaz na obrázok... ten link bude na inej doméne, bolo by dosť nepravdepodobné, keby mal niekto tiež v adresári images súbor animbanner.gif, ktorý by ešte k tomu vyzeral presne ako ten tvoj ;)

k tomu druhému:
asi bude najľahšie (ak opomeniem použitie databázy) pre každú kategóriu mať vlastný súbor, potom by value selectu boli jednotlivé názvy týchto súborov, použil by sa ten, ktorý by sa vybral...

<mimo-téma>
dorieš si to s tou bezpečnosťou - máš tam síce prihlasovací formulár, to je pekné, ale zbytočné, ak pred pridaním článku v clanky.php nekontroluješ, či je používateľ prihlásený... sorry za ten "hack"
</mimo-téma>
smonkey
Profil
Aha, takže jestl ito chápu dobře tak si mám vytvořit něco jako clanky.php akorat s názvem "web.php" a trošku ho upravit? Potom při psaní článku se mi to odešle do kategorie web? A mohl by mi nekdo poradit jak to sepsat a "připojit" k <select>?

A mimochodem - Nějak jsem to nepochopil s tim přihlašovacím forulářem a bezpečností...

Předem děkuji za další odpovědi...
fajzen
Profil
smonkey:
nie, myslel som vlastný súbor, kam sa články zapisujú, teda book.dat, skola.dat, web.dat...
select by vyzeral:
<select name="stat">
  <option value="skola">Škola</option>
  <option value="web">Web</option>
  <option value="book">Ostatní</option>
</select>

v clanky.php by potom bolo:
$kategorie = array('skola', 'web', 'book'); // zoznam povolených kategórií

if(isset($_POST['odeslano']) && $_POST['odeslano'] == 'ano') {
  if(empty($_POST['jmeno']) || empty($_POST['popis'])) {
    echo '<center><br><font class="male">Musíte vyplnit všechny povinné údaje!<br></font></center>';
  } else if(in_array($_POST['stat'], $kategorie)) {
    $txt = 'Napsal <font class="jmeno">' . htmlspecialchars($_POST['jmeno']) . '</font>\n' .
      ', dne <font class="cas">' . Date('j. m. Y, H:i:s') . '</font><br>\n' .
      '<br><font class="text">' . nl2br(htmlspecialchars($_POST['popis'])) . '</font><br><br><hr size="1" width="70%" align="center" color="#FFcc99"><br>\n\n';

    $subor = $_POST['stat'] . '.dat';
    file_put_contents($subor, $data, FILE_APPEND);
  }
}

// vypísanie súboru
if(!isset($subor)) {
  if(!empty($_GET['kategoria']) && in_array($_GET['kategoria'], $kategorie))
    $subor = $_GET['kategoria'] . '.dat';
  else
    $subor = 'book.dat'; // defaultná kategória
}

if(file_exists($subor) && filesize($subor))
  readfile($subor);
else
  echo 'Žiadne články v kategórií';

clanky.php by takto bol univerzálny pre všetky kategórie ako na zápis tak aj na vypísanie článkov
adresy by boli:
/clanky.php?kategoria=skola pre vypísanie kategórie škola
/clanky.php?kategoria=web pre vypísanie kategórie web
/clanky.php?kategoria=book alebo /clanky.php pre vypísanie kategórie ostatné

s tou bezpečnosťou - niektoré prvky som už pridal do uvedeného skriptu, ale hlavne ti tam chýba overenie, či je používateľ prihlásený... tak som si mohol na localhoste vytvoriť vlastný formulár s potrebnými poľami, nasmerovať ho na tvoju adresu http://www.smonkey.ic.cz/clanky.php a tadá, asi si si už všimol výsledok... je síce pravda, že keby si sem nedal tvoj skript, bolo by to oveľa ťažšie, ale nie nemožné...
naštuduj si niečo o session (napr. tu) a tiež sa odnauč používať globálne premenné
smonkey
Profil
Aha, ale trochu nechápu tuto část

// vypísanie súboru
if(!isset($subor)) {
  if(!empty($_GET['kategoria']) && in_array($_GET['kategoria'], $kategorie))
    $subor = $_GET['kategoria'] . '.dat';
  else
    $subor = 'book.dat'; // defaultná kategória
}


Zkoušel jsem to všelijak "zprovoznit" - buď se mi články, které měli patřit do kategorie škola vypisovali i v book.dat, nebo to nešlo vubec... Mohl bych poprosit co s tim?
fajzen
Profil
smonkey:
if(!isset($subor)) { // kontroluje sa, či je definovaná premenná $subor, táto premenná je definovaná, ak sa predtým zapisovalo, teda ak sa zapisovalo, zobrazí sa ten súbor, do ktorého sa zapisovalo
  if(!empty($_GET['kategoria']) && in_array($_GET['kategoria'], $kategorie)) // ak je zadaná kategória a je v zozname povolených kategórií, vypíše sa tá
    $subor = $_GET['kategoria'] . '.dat';
  else // inak sa vypíše book.dat
    $subor = 'book.dat'; // defaultná kategória
}

sorry, mám tam chybu... vo file_put_contents na 12 riadku má byť $txt namiesto $data... tiež som zabudol, že \n sa v apostrofoch neparsuje, tak si zmeň 7. - 9. riadok na
$txt = "Napsal <font class=\"jmeno\">" . htmlspecialchars($_POST['jmeno']) . "</font>\n" .
      ", dne <font class=\"cas\">" . Date('j. m. Y, H:i:s') . "</font><br>\n" .
      "<br><font class=\"text\">" . nl2br(htmlspecialchars($_POST['popis'])) . "</font><br><br><hr size=\"1\" width=\"70%\" align=\"center\" color=\"#FFcc99\"><br>\n\n";
smonkey
Profil
Dobře, takže takhle:

if(!isset($subor)) { // kontroluje sa, či je definovaná premenná $subor, táto premenná je definovaná, ak sa predtým zapisovalo, teda ak sa zapisovalo, zobrazí sa ten súbor, do ktorého sa zapisovalo
  if(!empty($_GET['web']) && in_array($_GET['web'], $kategorie)) // ak je zadaná kategória a je v zozname povolených kategórií, vypíše sa tá
    $subor = $_GET['web'] . '.dat';
  if(!empty($_GET['skola']) && in_array($_GET['skola'], $kategorie)) // ak je zadaná kategória a je v zozname povolených kategórií, vypíše sa tá
    $subor = $_GET['skola'] . '.dat';
  else // inak sa vypíše book.dat
    $subor = 'book.dat'; // defaultná kategória
fajzen
Profil
smonkey:
OMG, nie, tak ako som to mal ja, nič nemeniť (akurát pridať/odobrať povolené kategórie ak chceš)

$_GET['kategoria'] je premenná z URL, bude v nej názov kategórie, z ktorej sa má čítať...
tvary odkazov na jednotlivé kategórie som uviedol v príspevku [#11] dole
smonkey
Profil
$_GET['kategoria'] je premenná z URL, bude v nej názov kategórie, z ktorej sa má čítať...

Nechápu, tak co tam mam vlatně napsat? Měl jsem tam tvar te jednotlive URL kategorie, nebo snad ne?
fajzen
Profil
smonkey:
daj tam presne to, čo je v príspevku [#11] urob zmeny, ktoré som napísal v príspevku [#13] a odkazy na jednotlivé kategórie budú
<a href="clanky.php?kategoria=skola">Škola</a>
<a href="clanky.php?kategoria=web">Web</a>
<a href="clanky.php">Ostatné</a>

preštuduj si predávanie parametrov v adrese
smonkey
Profil
Pořád to nefunguje, nevypisuje to... Udělal jsem vše jak jste psal a také jsem si prostudoval to GET :-) Už tomu snad začínám rozumět...
Ale nevím proč to nefunguje, mám to přesně tak jak jste to napsal...
fajzen
Profil
smonkey:
skôr to vyzerá, že to nezapisuje... dal si vo file_put_contents($subor, $data, FILE_APPEND); namiesto $data $txt?
smonkey
Profil
Dal... Zde to je:

<div id="containtext1">

<?
$kategorie = array('skola', 'web', 'book'); // zoznam povolených kategórií

if(isset($_POST['odeslano']) && $_POST['odeslano'] == 'ano') {
  if(empty($_POST['jmeno']) || empty($_POST['popis'])) {
    echo '<center><br><font class="male">Musíte vyplnit všechny povinné údaje!<br></font></center>';
  } else if(in_array($_POST['stat'], $kategorie)) {
$txt = "Napsal <font class=\"jmeno\">" . htmlspecialchars($_POST['jmeno']) . "</font>\n" .
      ", dne <font class=\"cas\">" . Date('j. m. Y, H:i:s') . "</font><br>\n" .
      "<br><font class=\"text\">" . nl2br(htmlspecialchars($_POST['popis'])) . "</font><br><br><hr size=\"1\" width=\"70%\" align=\"center\" color=\"#FFcc99\"><br>\n\n";

    $subor = $_POST['stat'] . '.dat';
    file_put_contents($subor, $data, FILE_APPEND);
  }
}

// vypísanie súboru
if(!isset($subor)) {
  if(!empty($_GET['kategoria']) && in_array($_GET['kategoria'], $kategorie))
    $subor = $_GET['kategoria'] . '.dat';
  else
    $subor = 'book.dat'; // defaultná kategória
}

if(file_exists($subor) && filesize($subor))
  readfile($subor);
else
  echo 'Žádné články v kategorii';
?>
</div>


Tak mě teď už jen napadá, jak jste říkal, že jste tam měl chybu ať i to změním na $txt - Nemůže to souviset s tím?
smonkey
Profil
Juchuu, tak už to frčí :-) Bylo to tím

Místo $txt jsem tam šoupnul $data a je to :-) Moc, moc děkuji za pomoc ;-) A hlavně, že jste to se mnou vydržel :-D Jsem moc hrrr a je mi teprve 14 :-)
fajzen
Profil
smonkey:
super, ešte si oprav ten kód na banner:
<a href="http://www.smonkey.ic.cz"><img src="http://www.smonkey.ic.cz/images/animbanner.gif" border="0" alt="smonkey.ic.cz" ></a> 
smonkey
Profil
:-) Už se do toho začínám dostávat, dokonce jsem si tam přidal další políčko, které mi přidá "nadpis článku" :-) A ještě bych potřeboval poradit, čas kdy odešlu článek je zhruba o hodinu napřed, než čas v ČR - nejde to nějak, resp. jak se to mění?
A ješte něco :-D Jak mam udělat, aby se mi nový článek zobrazoval nahoře? Skoušel jsem např. tento:

if (File_Exists ("book.dat")): //existuje soubor book.dat
$fp = FOpen ("book.dat", "r"); //otevře soubor book.dat pro čtení
$data = FRead ($fp, FileSize("book.dat")); //přečte data ze souboru a uloží do proměnné "data" - kvůli tomu aby se zobrazoval poslední příspěvek nahoře
FClose($fp); //zavře book.dat
endif;
$fp = FOpen ("book.dat", "w"); //otevře book.dat pro přepis nebo vytvoření
FWrite ($fp, $write.$data); //zápis do souboru book.dat (nejprve aktuální příspěvek, poté předešlý obsah souboru book.dat)
FClose ($fp); //zavře soubor book.dat
endif;
endif;
mattyZEM
Profil
Smonkey, prosím, nepoužívej endif (zbytečnost pokud těch podmínek bude víc), a používej jednoduchý {} (tedy, pro přehlednost :D nebo pak TABuj..

Nechápu proč používat zastaralý fopen, fclose atd. Použít jde například file_put_contents

$umisteni="book.dat";
$soubor = file_get_contents($soubor);
$zapis=$write.$soubor;
file_put_contents($umisteni, $zapis);

Nevím zda to bude fungovat, nezkoušel jsem možná tam je nějaká blbost :P
smonkey
Profil
:-D Tak diky, no ja se v PhP zas tak dobře neorientuju :-D Stahuju to z netu a když tak tak to podle mého selského rozumu nějak složím dohromady :-)
AM_
Profil
mattyZEM:
nerozšiřuj tady prosím své osobní pocity jako programátorská pravidla.

Smonkey, prosím, nepoužívej endif
používat tuhle notaci není žádný prohřešek, naopak kód s tím může být přehlednější :) Sice ji také nepoužívám protože jsem líný to vypisovat, ale není na ní nic špatného a viděl jsem to i v pár poměrně profesionálních kódech. odsazování bloků to samozřejmě nenahrazuje, je velká chyba, když neodsazuješ bloky (což ale naštěstí kromě posledního příspěvku děláš), nikoli že používáš tuto notaci. Jediné snad že bych nemíchal obě dohromady, pro jednu se rozhodni a u té zůstaň.

Nechápu proč používat zastaralý fopen, fclose atd. Použít jde například file_put_contents
Co je na streamovém přístupu k souboru zastaralého?
- přístup přes ně je naprosto korektní, nevím o tom, že by se je chystali vyřadit, a dost o tom pochybuji - byla by to fatální chyba, ne všechny úkony jsou tak jednoduché, že se dá zapsat celý soubor naráz.
- file_put_contents existuje až od PHP5, které bohužel doposud není všude. Pokud má být skript přenositelný, považuji dokonce variantu fopen-fwrite-fclose za jednoznačně lepší.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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