Jak odstranit tuto chybu

Parse error: parse error in /3w/wz.cz/f/fcchomutov/insert.php on line 11
Opravdu si myslíš, že jsou tady nějací jasnovidci?

Ukaž řádky 8-15 a možná se nějaká rada najde.
<HTML>Dej sem i příslušný kus kódu a označ čísla řádků, pak se uvidí.</HTML>
Brnknu kartarce a potom ti reknu, kde je problem. No a neni IMHO nejlepsi zpusob odstraneni chyby jeji oprava?
"Parse error: parse error in /3w/wz.cz/f/fcchomutov/insert.php on line 11"
= chyba pri parsovani ve scriptu
/3w/wz.cz/f/fcchomutov/insert.php
na radku 11

Viz ostatni, kdyby jsme meli stejny soubor insert.php, tak spustime program, ktery ukazuje radky a podivame se na radky 9, 10, 11, 12 , pravdepodobne na radku 10 je chyba, ktera se objevi pri parsovani az na nasledujicim radku.

Parsovani/deleni je zpusob, jakym PHP provadi script. Zdrojovy kod PHP se snazi rozdelit na bloky funkci, ktere ma ulozene v jadre PHP.

cili vezme treba
<?
echo "ddd"
echo "eee";
?>
echo = ANO, mam takovou funkci v jadre
tato funkce vyzaduje nejaky vstupni retezec, takze ocekavam retezec
"ddd" = ANO, je to retezec, je to presne, co jsme ocekaval.
Dale ocekavam ukonceni prikazu strednikem ";"
\n = vynechavam
echo = NE, to neni ocekavany strednich, chyba pri deleni scriptu "parse error on line 2" - ocekavany strednik "exception ;" (naradku 2, protoze nastala chyba az na dalsim prikazu echo)
ono by to klidne mohlo byt takto a melo by to fungovat
<?
echo "ddd"
;echo "eee";
?>

priklad2
<?
echo "<a href="aaa.htm">bbb</a>";
?>
echo - ANO
"<a href=" - ANO
aaa.htm - NE, neznamy prikaz, parse error on line 1
<HTML><small>lol</small>

Peta nam tu pise tutorial :) Ale nic proti tomu..</HTML>
Tak to melo byt jako vysvetleni, na jakem radku je chyba a co je to parsovani.
Treba mne byla prvne hlaska
"Parse error: parse error in /3w/wz.cz/f/...script.php on line 11"
velice nesympaticka. Jsem byl zvykly z packalu, ze to zahlasi i druh chyby. Totez javascript.
A ono ne PHP zahlasi jen asi 5 druhu chyb a jeste nektere s tim nesouvisi.

Treba hodne casto mi pise, ze mu na konci schazi "}". Nesmysl, ta zavorka mu schazi nekde uprostred scriptu, ale protoze nejdrive parsuje zavorky, tak jen zjisti, ze mu nesouhlasi pocet "{" s "}" a vyhlasi ji na konci. Coz mne doslova umi vytocit. Packal i JS to vyhlasi tam, kde schazi. Protoze parsuji podle prikazu a kontroluji si ukonceni zavorky a ukonceni treba cyklu.
priklad JS:
for (i=0;i<50;i++)
{
switch (neco) {2:...break; <--chybejici "}" na radku cislo ...
x = 5;
}
...
priklad PHP
<?
for ($i=0;$i<50;$i++)
{
switch ($neco) {2:...break;
$x = 5;
}<--chybejici "}" na radku cislo ...
?>
to ale neni pravda, protoze to chybi u switche a ikdyz ji tam pridas, hlasi to dal
Pře<?
//odstraneni nebezpecnych znaku
$jmeno = HTMLSpecialChars($jmeno);
$email = HTMLSpecialChars($email);
$web = HTMLSpecialChars($web);

//formatovani prispevku
$jmeno = "<table><tr><td class=jmeno>$jmeno</td></tr>";
$email = "<tr><td class=odkaz><A HREF=mailto:$email>$email</A></td></tr>";
if ($web!="" && $web!="http://"):
$www = "<tr><td class=odkaz><A HREF="$web">$web</A></td></tr>";
endif;
$cas = "<tr><td class=cas>" . Date("j. " . "m. " . "Y, " . "H:i:s") . "</td></tr>";

$zprava = SubStr($zprava, 0, 1500); //bereme pouze 1500 znaku
$zprava = Trim($zprava); //odstraneni mezer z konce retezce
$zprava = HTMLSpecialChars($zprava); //odstraneni nebezpecnych znaku
$zprava = Str_Replace("n"," <BR> ", $zprava); //nahrazeni koncu radku na tagy <BR>

$znak = 66; //dlouha slova delit po .. znacich
$slovo = Split("[[:blank:]]+", $zprava); //rozdeleni textu na slova
for($y=0;$y<Count($slovo);$y++):
$slovo[$y] = Trim($slovo[$y]); //odstraneni mezer na konci slova
if (Strlen($slovo[$y])<=$znak): //nebudeme delit
if (EregI("^(www..+..{2,3})$", $slovo[$y])): //jedna se odkaz typu www......
$odkaz = EregI_Replace("^(www..+..{2,3})$", "<a href=http://1>1</a> ", $slovo[$y]);
elseif (EregI("^(http://.+..{2,3})$", $slovo[$y]))://jedna se odkaz typu http://.......
$odkaz = EregI_Replace("^(http://.+..{2,3})$", "<a href=1>1</a> ", $slovo[$y]);
else:
$odkaz = $slovo[$y] . " "; //jedna se o normalni slovo
endif;
$celek .= $odkaz; //spojime vsechny slova opet dohromady
else:
$delit = Ceil(StrLen($slovo[$y])/$znak); //delime dlouhe slovo
for($z=0;$z<$delit;$z++):
$cast = Substr($slovo[$y], $z*$znak, $znak);
$celek .= $cast . " - "; //na konec jednotlivych casti pridame pomlcku
endfor;
endif;
endfor;

//povolime tyto tagy <b> <u> <i>
$zprava = Str_Replace("<b>", "<b>", $celek);
$zprava = Str_Replace("</b>", "</b>", $zprava);

$zprava = Str_Replace("<i>", "<i>", $zprava);
$zprava = Str_Replace("</i>", "</i>", $zprava);

$zprava = Str_Replace("<u>", "<u>", $zprava);
$zprava = Str_Replace("</u>", "</u>", $zprava);

$zprava = "<tr><td class=text><br>$zprava</td></tr></table><hr color=#00008B>n";

$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
?>
<head>
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=kniha.php">
</head>dkládám celý skript s kterým si náš "webmaster! neví rady
No a není co řešit:

$www = "<tr><td class=odkaz><A HREF="$web">$web</A></td></tr>";

Přidej escapovací zpětná lomítka před uvozovky kolem $web:

$www = "<tr><td class=odkaz><A HREF=\"$web\">$web</A></td></tr>";
<HTML>$www = "<tr><td class=odkaz><A HREF="$web">$web</A></td><tr>";
- tady nejsou escapované uvozovky.</HTML>
<HTML>Mno, tak pozdě :-)</HTML>
Nebo zaměň uvozovky za apostrofy:

$www = "<tr><td class=odkaz><A HREF='$web'>$web</A></td></tr>";
zbi: a co takhle:
$www = '<tr><td class=odkaz><A HREF="'.$web.'">$web</A></td></tr>';

fcchv: pár připomínek
1) odstraneni nebezpecnych znaku - fakt dobrý komentář ;)
2) a co když někdo zapomene ukončit párový tag? Nechtělo by to nějak ošetřit?
3) když už těda zapisuješ do souboru, tak mi tam nějak chybí flock(). Budeš se divit, až se ti soubor vymaže ;)
4) zapracovat poslední příspěvek nahoru: a proč to dělat jednoduše, když to jde i složitě, že? Což takhle otevírat soubor jen s parametrem "a", data zapsat za oddělovač na konec a při výpisu data načíst do pole a to potom otočit?
5) Date("j. " . "m. " . "Y, " . "H:i:s") taky dobrý. já bych to opět trošku zjednodušil: date("j. m Y,H:i:s")
6) Str_Replace("n"," <BR> ", $zprava); a to je co? On někdo zrušil fci nl2br() ?
7) tu kontrolu rozdělením na slova a spol jsem sice vůbec nepochopil, ale což ...

... už mlčim ;)
Tom: hledal jen parse error. Tys ho teď úplně zmátl. :-)
zbi: to byl účel ;)
Tom (manual.wz.cz)
ted zjednodusujes trochu moc :)
Date("j. " . "m. " . "Y, " . "H:i:s")
date("j. m Y,H:i:s");
a kam se podela mezera a tecka?
date("j. m. Y, H:i:s");

Autor: Richard (moderátor)
Ses smal, ale ma tam presne tu chybu, na kterou jsem popsal ten krasny priklad2 :) Zrejme si to ani neprecet, pac by mu to doslo...
Nazdárek,
díky všem kdo se mi tu snažili pomoct - a pomohli, díky...

A Tome (popravdě řečeno, já si ten skript jenom "půjčil"), co je to ten flock()? Nám se ty přípsěvky opravdu čas od času ztrácejí, mohl bych tě zneužít a poradit se jak to teda řešit?

Předem dík.
flock() - doporučuji si nejdříve nastudovat manuál. Tam je všechno hezky popsané.

http://us2.php.net/manual/cs/function.flock.php
cz.php.net/flock
zapis do souboru s flockem - kompletni reseni:
http://www.webzdarma.cz/forum/read.php?f=2&i=32562&t=32344
http://www.webzdarma.cz/forum/read.php?f=2&i=20898&t=20872