Autor Zpráva
tpilar
Profil
Na tento začátek PHP programu

<?php
$action = $_POST['action'];
$jmeno = $_POST['jmeno'];
$mail = $_POST['mail'];
$vzkaz = $_POST['vzkaz'];
$kontrola = $_POST['kontrola']; 

mi XAMPP vypisuje chybové hlášení : Notice: Undefined index: action in C:\xampp\htdocs\a_kniha\kniha.php on line 3

Notice: Undefined index: jmeno in C:\xampp\htdocs\a_kniha\kniha.php on line 4

Notice: Undefined index: mail in C:\xampp\htdocs\a_kniha\kniha.php on line 5

Notice: Undefined index: vzkaz in C:\xampp\htdocs\a_kniha\kniha.php on line 6

Notice: Undefined index: kontrola in C:\xampp\htdocs\a_kniha\kniha.php on line 7


Další problém, který mám je ten, že vzniká soubor s koncovkou *.body . Vzniklý soubor bych potřeboval automatizovaně zkopírovat s příponou html.

Děkuji. Tom


Omlouvám se, prvním řádkem je tag HTML, číslování řádků je tedy poněkud zavádějící. Řádek 2. je ve skutečnosti řádek 3.

Moderátor Davex: Titulek „$_POST['action'] problém“ nevystihoval podstatu dotazu. Příště zkus prosím vymyslet lepší.
Str4wberry
Profil
1) Podívejte se na Ošetřování Notice: undefined index - nutnost?
2) Pokud je soubor jeden, tak ho ručně přejmenujte a v kódu zajistěte, aby se používal právě ten soubor s příponou html. Pokud potřebujete přejmenovat souborů víc, existuje na to např. hezká funkce „Hromadné přejmenování“ v programu Total Commander.
Micruss
Profil
to action je kontrola jestli jsou odeslaný posty ne? pokud mas formular treba
if(isset($_POST['action'])) {

$jmeno = $_POST['jmeno'];
$mail = $_POST['mail'];
$vzkaz = $_POST['vzkaz'];
$kontrola = $_POST['kontrola']; 
}
Joker
Profil
Micruss:
To způsobí stejný problém, pokud bude vyplněné action, ale ne to ostatní.
Lepší je polím už rovnou dávat datový typ a případně výchozí hodnotu.
Příklad:
// boolean
$odeslano = isset($_POST["odeslano"]);
//číslo
$cislo = empty($_POST["cislo"]) ? 0 : intval($_POST["cislo"]);
// řetězec
$text = empty($_POST["text"]) ? "" : $_POST["text"];
Poznámka, výchozí hodnoty je samozřejmě potřeba zvolit podle aplikace a je dobré pamatovat, že empty bere i prázdný řetězec a "0", takže pokud třeba u čísla je nutné rozlišit 0 a prázdnou hodnotu, je třeba použít isset.
tpilar
Profil
V podstatě to zakládá pouze jeden jediný soubor do kterého to zapisuje. Dám to sem celé aby byla funkce lépe vidět.

<html><body>
<?php
$action = $_POST['action'];
$jmeno = $_POST['jmeno'];
$mail = $_POST['mail'];
$vzkaz = $_POST['vzkaz'];
$kontrola = $_POST['kontrola'];

function antispam($email, $jmeno){
    $return = "<script type=\"text/javascript\"><!--\ndocument.write('<a href=\"' + 'mailto:' + '";
    for($i=0;$i<strlen($email);$i++){
        $code .= $email{$i}=='@' ? "' + '&#".ord("@")."' + '"
                                   : "&#".ord($email{$i}).";";
    }
    $return .= $code."' + '\">' + '".$jmeno."' + '<\/a>');\n--></script>";
RETURN $return;
}
?>
<form name="form" method="post"
action="kniha.php">
<table><tr><td>jméno:</td>
<input type="hidden" value="uloz" name="action" />
<td><input type="text" name="jmeno" value="<?php echo $jmeno ?>" size="50" /</td>
</tr><tr><td>e-mail:</td>
<td><input type="text" name="mail" value="<?php echo $mail ?>" size="50" /></td>
</tr><tr></tr>
<tr><td valign="top">Vzkaz</td>
<td><textarea name="vzkaz" cols="40" value="<?php echo $vzkaz ?>" rows="5"><?php echo $vzkaz ?>
</textarea></td></tr>
<tr><td></td><td>Ochrana proti spamu: 4 plus 5 =
<input type="text" name="kontrola" value="<?php echo $kontrola ?>" size="8" />
</td>
<tr><td></td><td>
<input type="submit" value="odeslat"></td>
</tr>
</table>
</form>
<table>
<?php
if ($action=='uloz'):
$soubor = "kniha.body";
@$ext = fopen($soubor, "r");
@$obsah = fread($ext, filesize($soubor));
@FClose($ext);

if($kontrola != "9"):
echo "<h6>Špatná odpověď</h6>";
elseif(($vzkaz=="") or ($jmeno=="")):
echo "<h6>Nejsou vyplněny požadované údaje</h6>";
else:
$ext = fopen("kniha.body", "w");
$mail = HTMLSpecialCHars($mail);

if($mail == "")
$mail = "";
else $mail = antispam($mail,$mail);

$jmeno = HTMLSpecialCHars($jmeno);
$vzkaz = HTMLSpecialCHars($vzkaz);
$tab = "<tr><td width=\"300\" >".$jmeno."</td>
<td align=\"right\">".Date(" d/m/Y  H:i:s")."</td>
</tr><tr><td colspan=\"2\">".$vzkaz."</td>
</tr><tr><td width=\"150\">".$mail."</td>
</tr><tr><td colspan=\"2\"><hr size=\"1\"></td>
</tr>";
fputs($ext, "$tab");
fputs ($ext, "$obsah");
FClose($ext);
@$ext = fopen("kniha.body", "r");
@fpassThru($ext);

endif;
else: @$ext = fopen("kniha.body", "r");
@fpassThru($ext); endif;

?>
</table>
</body>
</html>  

Zřejmě bych však nepoužil výpis v prohlížeči. Nedává to pak úplně smysl.
tpilar
Profil
Trochu pomohlo tohle :

$_POST['jmeno'] = "";
$_POST['mail'] = "";
$_POST['vzkaz'] = "";
$_POST['kontrola']= "";

Ovšem $action = $_POST['action']; je mi jasné, tohle není textová proměnná, string.

Užil jsem si i trochu legrace po $_POST['action'] = "uloz"; mi proběhl celý script s tím, že mám špatně sečtenu antispam ochranu.
Joker
Profil
tpilar:
Proč to neuděláte tak jak jsem psal?
tpilar
Profil
Omlouvám se ale to se mi to rozpadne úplně. Je to celé na mne příliš složité. V podstatě hlavně nejsem schopen definovat $action = $_POST['action']; jako Boolean.

S proměnnými typu string jsem to vyřešil takto :
$_POST['jmeno'] = "";
$_POST['mail'] = "";
$_POST['vzkaz'] = "";
$_POST['kontrola']= "";
Vím, že to asi není ideální ale již se nevypisují jako chyba.
Joker
Profil
tpilar:
Vím, že to asi není ideální ale již se nevypisují jako chyba.
Akorát to má drobnou vadu, že to zároveň smaže případný vstup vyplněný návštěvníkem stránky.


Je to celé na mne příliš složité.
Co konkrétně je na tom složitého? Zrovna tohle mi nepřijde složité.

V podstatě hlavně nejsem schopen definovat $action = $_POST['action']; jako Boolean.
V příspěvku [#4] jsem právě na tohle psal ukázku.

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: