Autor Zpráva
Eryx
Profil
Ahoj,

dělám nástěnku v php. (Zdrojáky jsem stáhnul z Internetu a mírně upravil)
Mám problém s tim že, když ve formuláři vyplním jméno a text, odešlu to z formuláře do skriptu pro zápis, tak se mi do souboru správně zapíše Jméno uživatele, datum a čas vložení příspěvku a odeslaný text, a potom o pár sekund později se do souboru zapíše ještě nový datum a čas bez jména uživatele a textu.
Při ladění skriptu na PC se to neděje. Děje se to jen na hostitelském webu.
Dá se tomu nějak zabránit?
Děkuji za pomoc.

Zde si to můžete vyzkoušet:
http://jkrepinsky.sweb.cz/test/index.php

index.php
<title>Nástěnka představenstva</title><script language="JavaScript"><!--
function zkontroluj(formular)
{
    
    if (formular.jmeno.value=="")
    {
        alert("Vaše jméno musíte vyplnit!");
        formular.jmeno.focus();
        return false;
    }   
    else if (formular.zprava.value=="")
    {
        alert("Text zprávy musíte vyplnit!");
        formular.zprava.focus();
        return false;
    }    
    else 
        return true;
}
// -->
</script></head>
<body style="color: rgb(0, 0, 0); background-color: rgb(210, 255, 255);" alink="#000099" link="#000099" vlink="#990099">
<table align="center" width="80%">
<tbody><tr><td class="nadpis" width="100%">
<center>VIP - Nástěnka představenstva</center><div style="text-align: center;"><small style="font-weight: normal;"><small><span style="color: black;">(Maximální délka jednoho příspěvku je omezena na 5000 znaků a mezer.)</span></small></small></div><br>

<table border="0" cellspacing="0" cellpadding="0" align="center">
<form action="insert.php" method="post" onSubmit="return zkontroluj(this)">
<tr><td width=120 class=povinne>
Jméno:
</td><td>
<input type="text" name="jmeno" size="30" maxlength="60" class="inputbook">
</td></tr>
<tr><td valign=top width=120 class=povinne>
Text zprávy: <font size="-2" color="Black">jsou povoleny tagy &lt;b&gt;, &lt;u&gt; a &lt;i&gt;, můžete psát i odkazy ve tvaru www.neco.cz nebo http://neco.neco.cz</font>
</td><td>
<textarea cols="50" rows="5" class=inputbook name="zprava"></textarea>
</td></tr>
<tr><td width=120>&nbsp;</td><td>
<center><input type="submit" class=bluebutton value="Odeslat">&nbsp;&nbsp;&nbsp;<input type="Reset" class=bluebutton value="Vymazat"></center>
</form></td></tr></table>

<hr color="#00008B">
<?php
function Odkaz()
{
if (File_Exists ("book.dat")):
echo "<center><font class=jmeno>Zobrazit příspevky:<br><br>";

$prispevek = File("book.dat");            //načte obsah souboru do pole
$strana = Ceil(Count($prispevek)/20);    //vypocita kolik zaberou příspěvky stran (po 20)

for ($x=1;$x<=$strana;$x++):        //zobrazí tolik odkazů kolik je stran
echo "<a href=index.php?idprispevek=$x>" . ($x*20-19) . "-"  . $x*20 . "</a>&nbsp;&nbsp;&nbsp";//do každého odkazu přidá číslo strany a jaké příspěvky budou zobrazovány
endfor;
echo "</center>";
endif;
}
Odkaz();
?>
<hr color="#00008B">
<?php
if (File_Exists ("book.dat")):        //existuje soubor book.dat
$idprispevek = $_GET[idprispevek];
if (!IsSet($idprispevek)) $idprispevek=1;                //je zinicializována proměnná id, pokud ne přiřadí standartní jedničku
$pocatek = $idprispevek*20-20;                //podle id spočítá od kolikátého
$konec = $idprispevek*20-1;                    //... do kolikáté příspěvku se bude zobrazovat

$prispevek = File("book.dat");        //načte do pole obsah book.dat
for ($i=$pocatek;$i<=$konec;$i++):
echo $prispevek[$i];                //vypíše příspěvky mezi $prispevek a $konec
endfor;
endif;

Odkaz();
?>

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

$write = StripSlashes($jmeno . $email . $www . $cas . $zprava);            //odstraneni escape sekvenci

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
?>

<?php
$data = File ("adresy.txt");
for ($i = 0; $i < Count ($data); $i++) $eladresa[$i]="$data[$i]";

for ($op=0;$op<$i;$op++):
   if ($op!=0):
     $seznam .=",";
   endif;
   $seznam .=$eladresa[$op];
endfor;

$seznam = Str_Replace("\r\n","", $seznam);

$predmet = "Webove stranky druzstva";
$email = "Druzstvo@seznam.cz";
$zprava = '
!!! POZOR - na VIP Nastenku byl vlozen novy prispevek !!!
';

Mail($seznam, $predmet, $zprava, "From: " . $email);
?>

<html><head>
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=index.php">
</head></html>
peta
Profil
Proti dvojimu zapisu je mozne s formularem odesila skryty kontrolni kod. Pokud uz je takovy kod zapsany v souboru, tak tam zpravu neprida.

Html kod formulare neni validni. Pod ta TABLE tag FORM nepatri. Ja bych to dal nad TABLE. Mozna bych rekl, ze ti prohlizec vyrobi 2 formulare a oba odesle. alidaci muzes testovat pres http://validator.w3.org/check?uri=http%3A%2F%2Fjkrepinsky.sweb.cz%2Ftest%2Findex.php&charset=%28detect+automatically%29&doctype=Inline&group=0

Pri zapisovani do souboru si jej nezamykas pres flock, takze muze dojit k tomu, ze 2 lide soucasne zapisuji do souboru. Obsah souboru se vymaze a soubor zustane ve stavu poskozeny, neumozni php dalsi praci s nim.
Eryx
Profil
peta:
Děkuji moc za odpověď.
Jen by mne ještě zajímalo, proč se to při ladění na PC neprojeví.

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:

0