Autor Zpráva
Joan
Profil

Teda, mnohokrát děkuji za vyčerpávající vysvětlení!
Teď už úplně poslední zádrhel mě zaměstnává a dosud jsem nekápla na správné řešení:
když jsem měla statické stránky a na nich formulář, tak po úspěšném odeslání se mi adresa URL nezměnila. Téhož výsledku bych ráda dosáhla i nyní po převedení souborů na složky.

Na adrese www.subdomena.domena.tld/formular/ vyplním formulář a odesílám na skript "zpracuj.php". U statických stránek hladce odesílá. Jenomže nyní mi pokus o odeslání vyhodí hlášku, že soubor " www.subdomena.domena.tld/formular/zpracuj.php nebyl na serveru nalezen (asi protože se z něj udělala další složka?). Tuším, že musím v .htaccess udělat výjimku, aby adresa zůstala "www.subdomena.domena.tld/formular/", podstrčil se skript "zpracuj.php" a formulář se i odeslal.

Podle tohoto návodu jsem "nazev.php" nahradila svým "zpracuj.php", ale chyba o nenalezení souboru přetrvává. Také můj pokus
RewriteCond %{REQUEST_URI} /formular/$
RewriteRule ^(.+)$ http://www.subdomena.domena.tld/zpracuj.php/$1 [L,QSA]


na mě zvysoka kašle :-)

Moc prosím o help, jak mod_rewrite říci, že odesílám na samostatný skript a současně nechci měnit adresní řádek. Díky předem!
Davex
Profil
Joan:
Na adrese www.subdomena.domena.tld/formular/ vyplním formulář a odesílám na skript "zpracuj.php".
Asi by bylo nejlepší, kdyby odeslané údaje z formuláře zpracoval stejný skript, který ho vypisuje před vyplněním, ale nejjednodušší bude přidat lomítko před jméno skriptu:

<form action="/zpracuj.php" method="post">
Anonymní
Profil *
Davex:
Moc Ti děkuji za trpělivost!

Asi by bylo nejlepší, kdyby odeslané údaje z formuláře zpracoval stejný skript
O to jsem se samozřejmě už předtím dost snažila, ale když jsem zpracující část skriptu vkopírovala na začátek formuláře hned pod
<?php
session_start();
?>
a jako action nechala prázdno (jen prázdné uvozovky), dostala jsem zvláštní chybu "Parse error: syntax error, unexpected $end in ...cesta k formuláři na disku PC, přičemž název "$end" jsem v životě nepoužila!

Proto jsem se zaměřila spíše na soubor s formulářem ve spolupráci se zpracujícím skriptem, napsala jsem action dle Tvého vzoru, ale zase vyskočila chyba "Fatal error: Call to undefined function mb_strlen() in... cesta k zpracuj.php na disku PC. Pokud jsem ovšem napsala
<form action="/zpracuj/">
s lomítky po obou stranách a bez .php, tak se zobrazila tatáž chyba, tentokrát ale ve stylu stránek. Třebaže URL v adresním řádku už vypadá správně.
U mých statických stránek jsem měla header ("location: ... ) směřovaný zpátky na formulář, nikoliv na zpracující skript. A vše šlapalo, jak má.

Co ještě mohu zkusit upravit? Díky!
Davex
Profil
Anonymní:
dostala jsem zvláštní chybu "Parse error: syntax error, unexpected $end in ...
V tom skriptu byla nějaká syntaktická chyba, pravděpobně špatný počet složených závorek nebo uvozovek, ale to s konfigurací serveru nesouvisí.

zase vyskočila chyba "Fatal error: Call to undefined function mb_strlen() in...
Opět problém ve skriptu s neexistující funkcí mb_strlen(), asi není v PHP zapnutý modul mbstring.
Petr__
Profil *
Možná by bylo lepší, kdybyste sem dala aktuální verzi htaccess a zdrojáky těch skriptů, které se podílejí na zpracování toho formuláře, protože jinak mi připadá, že jen vršíte chybu za chybou a obdivuji Davexe jestli se v tom ještě vyzná.
Joan
Profil
Petr_:
Možná by bylo lepší, kdybyste sem dala aktuální verzi htaccess a zdrojáky těch skriptů
Dobře, udělám to:

.htaccess (funguje vše kromě odeslání formuláře)
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ ?str=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ /?str=$1&vyber=$2 [L,QSA]


zpracuj.php
<?php
session_start();
?>
<?php
/* *************** diskuse.jakpsatweb.cz *** PHP FAQ ********************** */
function autoUTF($s)
{
    // detect UTF-8
    if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s))
        return $s;
    // detect WINDOWS-1250
    if (preg_match('#[\x7F-\x9F\xBC]#', $s))
        return iconv('WINDOWS-1250', 'UTF-8', $s);
    // assume ISO-8859-2
    return iconv('ISO-8859-2', 'UTF-8', $s);
}

function cs_mail ($to, $predmet, $zprava, $head = "")
       {  $predmet = "=?utf-8?B?".base64_encode(autoUTF ($predmet))."?=";
          $head .= "MIME-Version: 1.0\n";
          $head .= "Content-Type: text/plain; charset=\"utf-8\"\n";
          $head .= "Content-Transfer-Encoding: base64\n";
          $zprava = base64_encode (autoUTF ($zprava));
          return mail ($to, $predmet, $zprava, $head); }
/* ********************************************************************** **  */

$nick = $_POST["nick"];
$email = $_POST["email"];
$predmet = $_POST["predmet"];
$zprava = $_POST["zprava"];
$spam = $_POST["spam"];
$poslano = $_POST["poslano"];
$predmet2 = "Neodpovídejte prosím";

$nick = stripslashes($nick);  //odstraní zpětná lomítka
$email = stripslashes($email);
$predmet = stripslashes($predmet);
$zprava = stripslashes($zprava);

$nick = htmlspecialchars($nick);
$email = htmlspecialchars($email);
$predmet = htmlspecialchars($predmet);
$zprava = htmlspecialchars($zprava);

if ($_POST["poslano"])
//kontrola vsech vlozenych udaju
{
$chyba = array();
  if(!isset($_POST["email"]) || preg_match("/^[\s]*[a-zA-Z]+[0-9]*[\.]?[^\s\.@]+@[^\s\.@]+[.][a-zA-Z]{2,4}$/", $_POST["email"]) == 0)
  $chyba[0] = "Zadejte prosím emailovou adresu ve správném tvaru:";
  if ($predmet=="" || preg_match("/^[\s]+$/", $_POST["predmet"]))
  $chyba[1] = "Napište prosím předmět zprávy:";
  if ($spam!=12)
  $chyba[2] = "Vyplňte prosím správné číslo:";
  if ($zprava=="" || preg_match("/^[\s]+$/", $_POST["zprava"]))
  $chyba[3] = "Nezapomněli jste napsat samotnou zprávu?";
  if (mb_strlen($_POST["zprava"], 'utf-8') > 300)
  $chyba[4] = "Zpráva se odešle v této maximální délce. Jestli Vám vyhovuje, klikněte prosím na \"Odeslat zprávu\"";
  if ((empty($chyba)) and (strlen($_POST["zprava"] <= 300)))
      {
      cs_mail("moje_domena@email.cz", $predmet, "$nick\n".$zprava, "From: $email\n");
header("location: http://www.subdomena.domena.cz/zpracuj.php");
$_SESSION["zprava"] = "<h4 id='vysledek'>Zpráva byla úspěšně odeslána</h4>";
      }
      if (isset($_POST["kopie"]) == "ano" and (empty($chyba)) and (strlen($_POST["zprava"] <= 300))) 
      {
cs_mail($email, $predmet2, "Z formuláře na webu moje_domena.cz jste odeslali tuto zprávu:\n---------------------------------------------------------------------------\n\n $zprava", "From: no-reply@moje_domena.cz\n");
header("location: http://www.subdomena.domena.cz/zpracuj.php");   
$_SESSION["zprava"] = "<h4 id='vysledek'>Zpráva byla úspěšně odeslána<br />Zpráva byla odeslána i na Vaši adresu</h4>";          
      exit; 
          }                   
       }
   if (!$poslano || $chyba)
{
?>

<form name="webovy" action="zpracuj.php" method="post">
<h2 id="napiste">Webový formulář:</h2>
<span id="omez">(do zprávy je povoleno vepsat nebo vložit maximálně 300 znaků!)</span>
<label for="nick">Vaše jméno nebo přezdívka:</label><input type="text" size=25 name="nick" id="nick" value="<?php echo $nick ?>"><br>
<?php if(!empty($chyba[0])) echo "<span class='error'>".$chyba[0]."</span>"; ?>
<label for="email"><font color=red>*</font>Váš email:</label><input <?php if(!empty($chyba[0])) echo "style='background-color: #ffcc99;'" ?> type="text" size=25 name="email" id="email" value="<?php echo $email ?>"><br>
<?php if(!empty($chyba[1])) echo "<span class='error'>".$chyba[1]."</span>"; ?>
<label for="predmet"><font color=red>*</font>Předmět zprávy:</label><input <?php if(!empty($chyba[1])) echo "style='background-color: #ffcc99;'" ?> type="text" size=25 name="predmet" id="predmet" value="<?php echo $predmet ?>"><br>
<p id="spambot">Ochrana před spambotem - doplňte prosím výsledek (číslo):</p>
<?php if(!empty($chyba[2])) echo "<span class='error'>".$chyba[2]."</span>"; ?>
<label for="spam"><font color=red>*</font>čtyři krát tři</font></label><input <?php if(!empty($chyba[2])) echo "style='background-color: #ffcc99;'" ?> type="text" size=10 name="spam" id="spam" value="<?php echo $spam ?>"><br>
<p id="psani"><label for="zprava"><font color=red>*</font>Text Vaší zprávy:</label><br><?php if(!empty($chyba[3])) echo "<span class='error'>".$chyba[3]."</span>"; ?>
<?php if(!empty($chyba[4])) echo "<span class='error-zpr'>".$chyba[4]."</span>"; ?><br>
<textarea name="zprava" id="zprava" onKeyUp="textLimit(this.form.zprava, 300);" onKeyPress="odpocet(this);"><?php if(isset($_POST["zprava"])) echo mb_substr($_POST["zprava"], 0, 300, 'utf-8'); ?></textarea></p><br>
<p><input type="checkbox" name="kopie" id="checked" <?php if(isset($_POST["kopie"])) echo "checked" ?>>Poslat si zprávu i na zadaný email</p><br>
<input type ="submit" name="poslano" value="Odeslat zprávu" id="poslano"><br>
<h5 class="hvezdicka">Políčka s <font color=red>červenou *</font> je nutné vyplnit</h5>
</form>
<?php 
}
?>


Na mých statických stránkách vážně funguje, možno vyzkoušet... (zde mám samozřejmě platnou mailovou adresu a doménu)
Joan
Profil
Davex:
asi není v PHP zapnutý modul mbstring
Stydím se, ale nevím, kde se zapíná. Jedu na samostatné instalaci Apache 2.2.17 s modulem PHP 5.3.5
Davex
Profil
Joan:
Myslím, že se zde nemá smysl zabývat funkčností PHP skriptu, protože tento parse error nevyvolává. Na localhostu stačí zapnout modul mbstring a do action formuláře dát správnou cestu ke zpracovávajícímu skriptu, která se může lišit na localhostu od té na hostingu.

asi není v PHP zapnutý modul mbstring
Stydím se, ale nevím, kde se zapíná.
V konfiguračním souboru php.ini se odkomentuje (smaže středník) řádek
extension=php_mbstring.dll
Joan
Profil
Davex:
Na localhostu stačí zapnout modul mbstring

Bohužel, pravděpodobně nestačí, protože jsem:
1) smazala příslušný středník a uložila - a nic
2) restartovala jsem Apache - zase nic
3) vymazala jsem celou historii ve Firefoxu, zavřela ho a otevřela - opět nic
4) spustila jsem IE8 - vyskakuje stále chyba Fatal error: Call to undefined function mb_strlen()...
5) zkontrolovala jsem vymazání středníku - JE opravdu VYMAZANÝ
6) rozšíření php_mbstring.dll v PHP/ext opravdu je
Restartovat PC snad není nutné...

Protože mám soubor s formulářem i zpracujícím skriptem vedle sebe v totožném adresáři, mám za to, že by mělo stačit dát na začátek action to lomítko. Zatím zkouším na locahostu s nastavením subdomény v souboru hosts a s odesíláním mailů skrz formulář mám dobrou zkušenost s Test Mail Server Tool. Jen ještě odstranit tuto proklatou chybu. Jinak přijde mi zvláštní, že přestože jsem část skriptu obsahujícího "mb_strlen" dočasně vymazala a soubor uložila, ta chyba se zobrazuje neustále. Kde se bere, když je příslušné místo ve zdrojáku smazané?!
Davex
Profil
Joan:
Vytvoř si skript s výpisem informací o PHP
<?php phpinfo();

Cesta ke správnému php.ini je v řádku Loaded Configuration File a modul se musí zapnout v něm. Po restartu Apache by to mělo fungovat.

Jinak přijde mi zvláštní, že přestože jsem část skriptu obsahujícího "mb_strlen" dočasně vymazala a soubor uložila, ta chyba se zobrazuje neustále. Kde se bere, když je příslušné místo ve zdrojáku smazané?!
Občas se stává, že člověk upravuje a ukládá jiný soubor než si myslí. Možná máš v PHP zapnutý nějakou opcode cache nebo akcelerátor (APC, eAccelerator, XCache), který může špatně detekovat změnu skriptů. Také můžeš v prohlížeči vyzkoušet klávesu F5 nebo kombinaci Ctrl+F5.
Anonymní
Profil *
Davex:
Vím, taky se mi už kdysi stalo, že jsem nevědomky zpracovávala jiný soubor než zamýšlený, ale tentokrát jsem chybu nespáchala. Opravdu jsem upravovala správný soubor php.ini (datum dnešní změny jsem si zkontrolovala). Hodně často vyhladávám přes Ctrl+F, vkopírovávám data přes Ctrl+V a F5 popř. Ctrl+F5 je u mě tlačítko nejpoužívanější (mnohem více než Zpět). Takže tady svou chybu nevidím. Tak jsem sáhla k nejtvrdšímu řešení a restartovala jsem notebook. Žádná změna. Ale zaznamenala jsem jinou:

1) když dám
action="/formular-zpracuj/"

tak se zobrazí zmiňovaná chyba "Fatal error: Call to undefined function mb_strlen() in..."

2) když dám
action="/formular-zpracuj.php"

tak konečně tato chyba zmizí, adresní řádek je jak má být, ovšem ze stylované stránky vidím pouze menu a patičku, obsah žádný! Navíc se titulek stránky nezobrazuje (přitom jsem ho dopsala do funkce v index.php, kterou zobrazuji jednotlivé TITLE)

Takže chyba s mb_strlen() souvisí se způsobem zapsání action, toto by mě nenapadlo.

Potom: pokud konec adresy ".../zpracuj.php" změním ručně na ".../zpracuj/", tak se stránka s formulářem tentokrát natáhne, stylování formu je ale rozsypané, tlačítko (pouze) na domovskou stránku se zobrazí 2x a na samém počátku se zobrazuje přehlídka "undefined index...". To je mi jasné, tyto proměnné získám až po vepsání do formuláře. A po této ruční změně adresy se už titulek stránky správně ukáže.

Vůbec nerozumím tomu, proč se žádný obsah stránky po odeslání nezobrazuje. Kdybych jediné políčko vyplnila špatně, má se formulář opět zobrazit se zvýrazněním, kde je renonc v inputu.

Je mi prosím ještě nějaké pomoci :-)?
Joan
Profil
Hm, na to permanentní mazání cookies při hledání chyb si budu muset dát větší pozor, ten anonym jsem opět já...

Další postřeh: po zkušební změně method z POST na GET se vyplněné inputy skutečně přenesou v adrese jako parametry, ovšem obsah stránky taky chybí - tak proč se formulář "ztrácí"?
Davex
Profil
Joan:
Vypadá to, že vlastně vůbec nemáš jasno v tom, kam se má formulář odeslat a pouze zkoušíš, kdy to začne fungovat.

1) když dám
action="/formular-zpracuj/"
tak se zobrazí zmiňovaná chyba "Fatal error: Call to undefined function mb_strlen() in..."
Ano, asi se to nasměruje na skript, který má formulář zpracovat, ale ten skončí zmiňovanou chybou. Domnívám, že tato cesta je správná, jen se musí odstranit ta chyba.

2) když dám
action="/formular-zpracuj.php"
> tak konečně tato chyba zmizí, adresní řádek je jak má být, ovšem ze stylované stránky vidím pouze menu a patičku, obsah žádný!
Asi proto, že není ve skriptu index.php určeno, co se stane, když dostane parametr ?str=formular-zpracuj.php. Měla by sis ujasnit, zda skripty /formular-zpracuj.php a /zpracuj.php opravdu existují (a jsou tam kde mají být) a má jim tedy smysl posílat formulář.

To už není problém konfigurace serveru, takže bychom to mohli uzavřít. Od příspěvku [#9] řešíme fungování skriptů, takže je zítra vytrhnu do samostatného tématu v kategorii PHP. (Hotovo.)


Ještě se vrátím k modulu mbstring. Z výpisu phpinfo() poznáš, zda je nahraný či nikoliv. Pokud nahraný stále není, tak můžeš mít špatně nastavenou cestu extension_dir v php.ini.
Joan
Profil
Davex:
Vypadá to, že vlastně vůbec nemáš jasno v tom, kam se má formulář odeslat a pouze zkoušíš, kdy to začne fungovat.

Ale já přece vím, že data vepíši do formuláře v jednom souboru např. formular.php a odešlu ke zpracování jinému souboru se skriptem např. zpracuj.php (je jedno, jaký má název). Čili pracuji pouze se dvěma soubory. A že záleží na cestách - když jsou oba v jednom adresáři, je to jednodušší.
Taky jsem odmazala středníky i v souboru php.ini-development (když v php.ini to nestačilo) a přestože jsem (snad všechny) změny vrátila ručně zpátky, přibyla mi další chyba:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\web\www\psikusy\index.php:10) in C:\web\www\psikusy\navody\formular.php on line 2

V index.php mám na začátku souboru Doctype, ale to dřív nevadilo. Někde to Doctype přece být musí?!

Takhle je to defaultně:
; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
; extension_dir = "./"
; On windows:
; extension_dir = "ext"


Odkomentovat poslení řádek nepomohlo. Mám dojem, že se ten modul mbstring stále nenahrál, že? Protože navíc nefunguje už ani formulář na statických stránkách, dřív mi to jelo.

Takže mám o druhý důvod víc přeinstalit si notebook do továrního nastavení a všechna defaultní nastavení si raději zálohovat. No, mám dost co dělat :-)
Davex
Profil
Joan:
Taky jsem odmazala středníky i v souboru php.ini-development (když v php.ini to nestačilo)
Odkomentovat poslení řádek nepomohlo. Mám dojem, že se ten modul mbstring stále nenahrál, že?
Z výpisu je vidět, že se mbstring nenahrál a dokonce i to, že se nenačetl žádný konfigurační soubor, takže je PHP celou dobu v nějakém výchozím nastavení.

Konfigurační soubor by se měl vždy jmenovat php.ini a já ho dávám do stejného adresáře odkud se do Apache nahrává modul php5apache2_2.dll. Další možnosti umístění jsou v dokumentaci.


Odkomentovat poslení řádek nepomohlo.
Možná nebude stačit odkomentovat, ale bude se muset napsat celá cesta k modulům.
Např.:
extension_dir = "C:/server/php-5.3.5/ext"
Joan
Profil
Davex:
Možná nebude stačit odkomentovat, ale bude se muset napsat celá cesta k modulům.

Geniální, tak toto byl jeden ze dvou důvodů, proč se rozšíření ne a ne nahrát! Děkuji Ti za skvělou myšlenku!
Je to takto správně, že?

Druhá chyba byla v tom, že na Win 7 jsou přípony dost hloupě defaultně zobrazované tak, že některé jsou vidět a některé nejsou, na Win XP jsou buď všechny anebo žádná. Takže jsem ke konfiguračnímu souboru, nevidíce příponu, dopsala .INI a to jsem neměla dělat. Protože jsem z toho nevědomě dostala "php.ini.ini" a to samozřejmě nemohlo fungovat. Až zobrazení php.ini ve Win XP mě navedlo na tuto chybu.

Hurá, takže odesílání formuláře na mail na localhostu za podpory Test Mail Server Tool mi nyní šlape skvěle. V podstatě poslední chybka před vypuštěním stránek do světa je docela zvláštní:
na začátku odesílacího skriptu mám definované proměnné způsobem
$email = $_POST['email'];

a překvapuje mě toto: když schválně nevyplním nutný input, tak se zobrazí správně chybová hláška těsně u toho políčka a žádná chyba. Jenomže jakmile vyplním vše správně a odešlu, naráz se mi zobrazí všech 7 chybových hlášek typu
Notice: Undefined index: email in... lokální cesta na disku... on line 35

Mě to přijde nelogické, že chyby se ukáží až po odeslání VŠEHO a ne postupně.
Davex
Profil
Joan:
Je to takto správně, že?
Ano správně, modul mbstring je nahraný.

Jenomže jakmile vyplním vše správně a odešlu, naráz se mi zobrazí všech 7 chybových hlášek typu Notice: Undefined index
Domnívám se, že je to tím přesměrováním podle [#6] na řádcích 62 a 68, kde po odeslání e-mailu přesměruješ na ten samý skript zpracuj.php, ale data z $_POST se tím ztratí. Asi by bylo lepší, kdyby se přesměrovalo na jinou stránku, která uživateli oznámí, že byl e-mail odeslán.
Joan
Profil
Davex:
"Asi by bylo lepší, kdyby se přesměrovalo na jinou stránku, která uživateli oznámí, že byl e-mail odeslán. "

Bodejť, máš opět pravdu! Do header jsem napsala přesměrování na původní formulář a na localhostu se mi odesílá jedna báseň. Sice mi není moc jasné, proč se data posílaná mým původním způsobem ztrácejí, ale aspoň vím, jak to nemám dělat. Mockrát děkuji za Tvůj dosavadní čas, hodně mě popostrčil kupředu. Více si dovolím přenést na bedra ostatních ochotných lidiček, protože ještě nejsem u konce své cesty.

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:

0