Autor Zpráva
Joan
Profil
Dobrý večer,
tak jsem se radovala přečasně, že se mi podařilo vmontovat si do stránek odesílací formulář...
Na localhostu jsem vše úspěšně odladila a na adrese www.handy.localhost.cz mi webový formulář vzorně odesílá zprávy. Upravila jsem si formulář i skript tak, že oba jsou v jednom souboru kontakt.php a hlavičky posílají data na http://www.handy.localhost.cz/kontakt/ a maily skutečně přicházejí. Po odeslání zůstává v adresním řádku požadovaná adresa www.handy.localhost.cz/kontakt/ - bohužel pouze na localhostu.

Když jsem totiž v index.php přepsala (kvůli způsobu zápisu subdomén na hostingu) cestu /handy/ na /www.handy/ a v souboru kontakt.php s odesílacím skriptem jsem v adrese www.handy.localhost.cz/kontakt/ jen vyměnila slovo localhost za název domény = www.handy.zlatberry.cz/kontakt/ tak se mi pro mě nepochopitelně po - úspěšném! - odeslání formuláře zobrazí adresa http://www.handy.zlatberry.cz/kontakt/kontakt.php a tím pádem vidím prázdnou stránku :-(. Kupodivu nepomohlo ani směřování hlaviček pouze na www.handy.zlatberry.cz (bez toho /kontakt/

Stránky i podstránky vkládám do index.php pomocí dvou parametrů a právě z důvodu původního zdvojování /kontakt/kontakt.php i na localhostu jsem formulář i skript nacpala do jednoho souboru. Jenomže - ten běhá jen na localhostu.
Poradí mi prosím pěkně někdo, kde jsem udělala chybu?! Moc bych si přála dneska to mít opravené, všechny ostatní stránky se totiž vkládají dobře. Moje stránky naživo, pokud to pomůže...

Vřele děkuji předem!
panther
Profil
Joan:
můeš sem, prosím, poslat inkriminovaný kousesk toho PHP scriptu? Popis je zdlouhavý a začal jsem se ztrácet v tom, co kde bylo a co kde aktuálně je.

Mimoto, celé to je nějaké divoké. Proč ti fungují obě URL http://www.handy.zlatberry.cz/kontakt/ a http://www.handy.zlatberry.cz/kontakt/kontakt.php (resp. všechny tři, ještě http://www.handy.zlatberry.cz/kontakt)? Ehm, všechny 4, ještě http://www.handy.zlatberry.cz/kontakt.php (bez stylů).
Rellik
Profil
panther:
Myslím, že zdroják je dostupný tu: http://www.psikusy.zlatberry.cz/php/formular/
Joan
Profil
Jasně, díky Ti!

if (mb_strlen($_POST["zprava"], 'utf-8') > 500)
  $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"] <= 500)))
      {
      cs_mail("jk@domena.cz", $predmet, "-- $nick --\n".$zprava, "From: $email\n");
header("location: http://www.handy.zlatberry.cz/kontakt.php");
$_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br>Na shledanou!</h3>";
      }
      if (isset($_POST["kopie"]) == "ano" and (empty($chyba)) and (strlen($_POST["zprava"] <= 500))) 
      {
cs_mail($email, $predmet2, "Z formuláře na webu www.handy.zlatberry.cz jste odeslal/a tuto zprávu:\n---------------------------------------------------------------------------\n\n $zprava", "From: no-reply@domena.cz\n");
header("location: http://www.handy.zlatberry.cz/kontakt.php");   
$_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br />Zpráva byla odeslána i na Vaši adresu.<br>Na shledanou!</h3>";         
      exit; 

Jinak lomítka na konci jsem schválně dala volitelně, protože sama mám ve zvyku umazávat adresu a dostávat se tak o úroveň výš a nejednou jsem umazala i s lomítkem. Adresa http://www.handy.zlatberry.cz/kontakt/kontakt.php přece nefunguje, stránka je po odeslání formuláře prázdná! Přestože maily chodí.
Localhostí adresa header("location: http://www.handy.localhost.cz/kontakt/"); šlape, jak má. Na hostingu musím ukládat do složky www.handy


Rellik:
Však já mám formulář podle všeho dobře, ale asi jsem neměla volit pro ladění subdoménu na doméně LOCALHOST, protože ta je tak trochu vyjímečná a teď mi působí problém...

EDIT: Jenom jsem prohodila slovo localhost za název své domény, nic víc. Jinak zjistila jsem, že ať napíši do header cokoliv, vždy se to odešle na adresu http://www.handy.zlatberry.cz/kontakt/kontakt.php - to je nějaké divné, že?
panther
Profil
Joan:
Jinak zjistila jsem, že ať napíši do header cokoliv, vždy se to odešle na adresu http://www.handy.zlatberry.cz/kontakt/kontakt.php
to je hodně divné.

Když změníš oba headery na něco jiného, musí se to přeci přesměrovat na adresu uvedenou v headeru. Zkoušela jsi jednotlivé větve podmínek trasovat, abys věděla, kde aktuálně jsi, co se děje?

Nejsem si jistý, kam by se správně mělo přesměrovávat v případě, že máš zaškrtnutou i kopii (a tudíž tam máš dvě přesměrování). Tipl bych si, že by se mělo provést to první, ale jen hádám, nezkoušel jsem to.

Jinak v kódu nějakou zásadnější botu nevidím, nebo jsem přepracovaný... Přikládám ten tvůj kód trochu lépe poodsazovaný, aby byl přehlednější (a chtěl se v tom také někdo vrtat).
<?php

if (mb_strlen($_POST["zprava"], 'utf-8') > 500) {
    $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"] <= 500))) {
    cs_mail("jk@domena.cz", $predmet, "-- $nick --\n".$zprava, "From: $email\n");
    header("location: http://www.handy.zlatberry.cz/kontakt.php");
    $_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br>Na shledanou!</h3>";
}

if (isset($_POST["kopie"]) == "ano" and (empty($chyba)) and (strlen($_POST["zprava"] <= 500)))  {
    cs_mail($email, $predmet2, "Z formuláře na webu www.handy.zlatberry.cz jste odeslal/a tuto zprávu:\n---------------------------------------------------------------------------\n\n $zprava", "From: no-reply@domena.cz\n");
    header("location: http://www.handy.zlatberry.cz/kontakt.php");   
    $_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br />Zpráva byla odeslána i na Vaši adresu.<br>Na shledanou!</h3>";         
    exit; 
}

?>


Zkus tohle:
<?php

// zprava je dlouha
if (mb_strlen($_POST["zprava"], 'utf-8') > 500) {
    $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\"";
} else {
    // zprava neni dlouha, odesli mail
    cs_mail("jk@domena.cz", $predmet, "-- $nick --\n".$zprava, "From: $email\n");
    $_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br>Na shledanou!</h3>";

    // pokud je kopie, odesli druhy mail
    if (isset($_POST["kopie"]))  {
        cs_mail($email, $predmet2, "Z formuláře na webu www.handy.zlatberry.cz jste odeslal/a tuto zprávu:\n---------------------------------------------------------------------------\n\n $zprava", "From: no-reply@domena.cz\n");   
        $_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br />Zpráva byla odeslána i na Vaši adresu.<br>Na shledanou!</h3>";         
    }

    // po odeslani (jednoho nebo obou) mailu presmeruj a exit
    header("location: http://www.handy.zlatberry.cz/cokoliv.php"); // presmeruje na neexistujici stranku
    exit;
}

?>

Jinak lomítka na konci jsem schválně dala volitelně, protože sama mám ve zvyku umazávat adresu a dostávat se tak o úroveň výš a nejednou jsem umazala i s lomítkem.
tak si vyber jednu variantu a na tu tu druhou přesměrovávej.

stránka je po odeslání formuláře prázdná!
ale před odesláním je plná :-)
Joan
Profil
panther:
Tak jsem schválně nechala původní hlavičku ve tvaru header("location: http://www.handy.localhost.cz/kontakt/"); noa po úspěšném odeslání vidím v adresním řádku - zase! - http://www.handy.zlatberry.cz/kontakt/kontakt.php prostě hlavičky naprosto nereflektují, kam mají směřovat.
Přitom na localhostu to tak krásně běhalo! Takže kód musím mít správně, navíc totožný formulář mám na svých hlavních stránkách. Ale tady stránky includuji a mám v jednom souboru formulář a ve druhém odesílací skript.

Zkoušela jsi jednotlivé větve podmínek trasovat, abys věděla, kde aktuálně jsi, co se děje?
Nemám ponětí, co tím myslíš! Jak se to prosím Tě dělá?
panther
Profil
Joan:
ten příspěvek výše jsem několikrát zeditoval, zkus to, co píšu později (ten druhý, komentovaný, úryvek kódu).

Tak jsem schválně nechala původní hlavičku ve tvaru header("location: http://www.handy.localhost.cz/kontakt/"); noa po úspěšném odeslání vidím v adresním řádku - zase!
nemáš tam někde ještě jiné přesměrování?
Joan
Profil
Tak ani přesměrování na cokoliv.php vůbec nic nepomohlo... Jediné, co se mi podařilo, je konečně získání http://www.handy.zlatberry.cz/kontakt/ v adresním řádku, přestože se ukáže opět prázdná stránka (teda jen s menu a doleva dolů vyběhnutou patičkou, mimo pozadí). Udělala jsem to tak, že jsem nechala prázdný action, přestože na localhostu to šlapalo s action="kontakt.php"
Pořád nechápu, proč to na lokále tak hezky běhalo a na ostrém serveru stránka kdesi mizí... Nerozumím tomu ani za mák...
Mám navíc vše v jediném souboru a jediné přesměrování může být v header a action, ne?

Stejný formulář jsem si navíc před chvílí nahrála na svou (speciálně emailovou) novou doménu ale je tu jistý rozdíl: zde jsem pouze umazala slovo localhost, protože jde o doménu a nikoliv subdoménu, se kterou momentálně zápasím. Tady mi formulář funguje přesně tak, jak jsem po něm chtěla.
panther
Profil
Joan:
Mám navíc vše v jediném souboru a jediné přesměrování může být v header a action, ne?
přesměrování je v header, v action je adresa, kam se formulář odesílá ke zpracování. Pokud je to na stejnou stránku, můžeš nechat atribut prázdný nebo ho vynechat.

jka vypadá zbytek toho souboru?
Joan
Profil
panther:
Právě jsem se vrátila z večerního venčení našich dvou chlupatých původců, proč se vlastně učím psát stránky :-)) a zkusila jsem právě úplně odstranit action. Výsledek je totožný: adresa se po odeslání ukáže správná, ale do stránky se stále nic nenatáhne.
Vyzkoušela jsem existenci session tímto:

if (isset($_SESSION["zprava"]))
{
echo "ahoj!";
echo $_SESSION["zprava"];
unset ($_SESSION["zprava"]);
}

a to tučné vypsané echo se nikde nezobrazilo, takže se session patrně nevytvoří. Ale PROČ? A proč se rozhodí umístění patičky, když její stylování zůstává? Já pořád vidím zádrhel v té subdoméně...
panther
Profil
Joan:
se subdoménou by to souviset nemělo, přece i ze subdomény můžeš odesílat mail, ne? :-)

Zkus sem dát celý ten script, z těch útržků to těžko podkládáme dohromady.
Joan
Profil
panther:
Tak dobře, ale je to dlouhé :-). Odstranila jsem akorát JS kontrolu. Moc si vážím Tvého času, dík!

<?php
session_start();
?>

<?php
/* *************** diskuse.jakpsatweb.cz *** PHP FAQ ********************** */
$nick = isset($_POST["nick"]) ? $_POST["nick"] : '';
$email = isset($_POST["email"]) ? $_POST["email"] : '';
$predmet = isset($_POST["predmet"]) ? $_POST["predmet"] : '';
$zprava = isset($_POST["zprava"]) ? $_POST["zprava"] : '';
$spam = isset($_POST["spam"]) ? $_POST["spam"] : '';
$poslano = isset($_POST["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);
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); }
/* ********************************************************************** **  */
?>
<?php
if (isset($_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') > 500)
  $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"] <= 500)))
      {
      cs_mail("jk@jkrejci.cz", $predmet, "-- $nick --\n".$zprava, "From: $email\n");
header("location: http://www.handy.zlatberry.cz/kontakt.php");
$_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br>Na shledanou!</h3>";
      }
      if (isset($_POST["kopie"]) == "ano" and (empty($chyba)) and (strlen($_POST["zprava"] <= 500))) 
      {
cs_mail($email, $predmet2, "Z formuláře na webu www.handy.zlatberry.cz jste odeslal/a tuto zprávu:\n---------------------------------------------------------------------------\n\n $zprava", "From: no-reply@jkrejci.cz\n");
header("location: http://www.handy.zlatberry.cz/kontakt.php");   
$_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br />Zpráva byla odeslána i na Vaši adresu.<br>Na shledanou!</h3>";         
      exit; 
          }                   
       }
   if (!$poslano || $chyba)
{
?>
<div id="kontakt">  
<div id="sroubky"><h3>Poštovní prostor</h3></div>

<?php
if (isset($_SESSION["zprava"]))
{
echo $_SESSION["zprava"];
unset ($_SESSION["zprava"]);
}
?>
<form name="webovy" action="" method="post" onSubmit="return zkontroluj(this)">
<h2 id="napiste">Chcete mi odeslat námět, dotaz, připomínku?</h2>
<span id="omez">(do zprávy je povoleno vepsat nebo vložit maximálně 500 znaků)</span>
<label for="nick">Vaše jméno nebo přezdívka:</label><input type="text" size=25 maxlength=25 name="nick" id="nick"><br>
<label for="email"><font color=red>*</font>Váš email:</label><input type="text" size=25 maxlength=25 name="email" id="email"><br>
<label for="predmet"><font color=red>*</font>Předmět zprávy:</label><input type="text" size=25 maxlength=25 name="predmet" id="predmet"><br>
<p id="spambot">Ochrana před spambotem - doplňte prosím výsledek (číslo):</p>
<label for="spam"><font color=red>*</font>čtyři krát tři</font></label><input type="text" size=10 name="spam" id="spam"><br>
<p id="psani"><label for="zprava"><font color=red>*</font>Text Vaší zprávy:</label><br>
<textarea name="zprava" id="zprava" wrap="physical" onKeyPress="odpocet(this);" onKeyUp="textLimit(this.form.zprava, 500);"></textarea></p><br>
<p><input type="checkbox" name="kopie" value="ano" checked="checked" id="checked">Poslat si zprávu i na zadaný email</p><br>
<input type ="submit" name="poslano" value="Odeslat zprávu" id="poslano"><br>
<div id="pocitadlo"><span class="text-kolem"> Zbývá ještě</span><input type="text" name="cislo_zbyva" class="ctverecek" MaxLength=3 value="500"><span class="text-kolem"> znaků, napsáno je již</span><input type="text" name="cislo_napsano" class="ctverecek" MaxLength=3 value="0"><span class="text-kolem">znaků.</span></div><br>
<h5 class="hvezdicka">Políčka s <font color=red>červenou *</font> je nutné vyplnit</h5>
</form>
<?php 
}
?>
</div>
panther
Profil
Joan:
patička
mno, proč ti ujíždí patička, to je jasné. Na ř. 77 otevíráš div v podmínce (neúspěšné odeslání), ale zavíráš ho vždy (ř. 105).

Hláška o úspěšném odeslání (ř. 81-85)
ty řádky sami o sobě jsou v pořádku, chyba je o pár řádků výše, a sice v podmínce na ř. 74. Ta je splněna pouze, je-li formulář neodeslaný nebo vyplněný chybně.

Takže: řádky 1-44 nech beze změny (možná ten spodek nahraď tím, co jsem posílal v [#5] dole.
Od ř. 45 by to mohlo vypadat následovně (snad tam není moc chyb):
<?php

if (isset($_POST["poslano"])) {
    //kontrola vsech vlozenych udaju
    $chyba = array();

    // na kontrolu emailu lze pouzit misto toho regularu (kteremu asi mozna ne uplne rozumis) filter_var
    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:";

    // cele se to da nahradit za if (trim($predmet) == ''), u dalsich promenny nize obdobne    
    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') > 500)
        $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 (mb_strlen($_POST["zprava"], 'utf-8') > 500) {
        $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)) {
        // odesli mail
        cs_mail("jk@jkrejci.cz", $predmet, "-- $nick --\n".$zprava, "From: $email\n");
        $_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br>Na shledanou!</h3>";

        // pokud je kopie, odesli druhy mail
        if (isset($_POST["kopie"]))  {
            cs_mail($email, $predmet2, "Z formuláře na webu www.handy.zlatberry.cz jste odeslal/a tuto zprávu:\n---------------------------------------------------------------------------\n\n $zprava", "From: no-reply@domena.cz\n");   
            $_SESSION["zprava"] = "<h4 id='sent'>Zpráva byla úspěšně odeslána.<br />Zpráva byla odeslána i na Vaši adresu.<br>Na shledanou!</h3>";         
        }

        // po odeslani (jednoho nebo obou) mailu presmeruj a exit
        header("location: http://www.handy.zlatberry.cz/cokoliv.php"); // presmeruje na neexistujici stranku
        exit;
    }
}
 
?>
<div id="kontakt">  
    <div id="sroubky"><h3>Poštovní prostor</h3></div>
    <!-- pokud se toto nema vypisovat vzdy, posuneme to tesne na <form> -->
 
<?php

// je odeslano, vypiseme hlasku
if (isset($_SESSION["zprava"])) {
    echo $_SESSION["zprava"];
    unset ($_SESSION["zprava"]);
} else {
//jinak zobrazime formular (promennou poslano nepotrebujeme)
?>
    <form name="webovy" action="" method="post" onSubmit="return zkontroluj(this)">
        <h2 id="napiste">Chcete mi odeslat námět, dotaz, připomínku?</h2>
        <span id="omez">(do zprávy je povoleno vepsat nebo vložit maximálně 500 znaků)</span>
        <label for="nick">Vaše jméno nebo přezdívka:</label>
        <input type="text" size=25 maxlength=25 name="nick" id="nick"><br>
        
        <label for="email"><font color=red>*</font>Váš email:</label>
        <input type="text" size=25 maxlength=25 name="email" id="email"><br>
        
        <label for="predmet"><font color=red>*</font>Předmět zprávy:</label>
        <input type="text" size=25 maxlength=25 name="predmet" id="predmet"><br>
        
        <p id="spambot">Ochrana před spambotem - doplňte prosím výsledek (číslo):</p>
        <label for="spam"><font color=red>*</font>čtyři krát tři</font></label>
        <input type="text" size=10 name="spam" id="spam"><br>
        
        <p id="psani"><label for="zprava"><font color=red>*</font>Text Vaší zprávy:</label><br>
        
        <textarea name="zprava" id="zprava" wrap="physical" onKeyPress="odpocet(this);" onKeyUp="textLimit(this.form.zprava, 500);"></textarea></p><br>
        
        <p><input type="checkbox" name="kopie" value="ano" checked="checked" id="checked">Poslat si zprávu i na zadaný email</p><br>
        
        <input type ="submit" name="poslano" value="Odeslat zprávu" id="poslano"><br>
        <div id="pocitadlo"><span class="text-kolem"> Zbývá ještě</span><input type="text" name="cislo_zbyva" class="ctverecek" MaxLength=3 value="500"><span class="text-kolem"> znaků, napsáno je již</span><input type="text" name="cislo_napsano" class="ctverecek" MaxLength=3 value="0"><span class="text-kolem">znaků.</span></div><br>
        <h5 class="hvezdicka">Políčka s <font color=red>červenou *</font> je nutné vyplnit</h5>
    </form>
<?php } ?>
</div>
<!-- kontakt -->
Joan
Profil
panther:
Díky, večer na to doma mrknu! Jinak v ř.39 asi mám směrovat hlavičky na soubor s formulářem kontakt.php a ne na cokoliv.php, že.
Ale pořád mi není jasné, proč TENTÝŽ formulář okamžitě chodí na doméně a nechodí na subdoméně, když na localhostu oba šlapou jak hodinky. Ty tomu rozumíš?
panther
Profil
Joan:
Jinak v ř.39 asi mám směrovat hlavičky na soubor s formulářem kontakt.php a ne na cokoliv.php, že.
ano. Ten neesitující soubor jsem tam nechal záměrně, abys viděla, kam to doopravdy jde. Jestli se to nepřesměrovává ještě někde jinde.

Ty tomu rozumíš?
já nerozumím tolika věcem, možná by ses divila :-)
Joan
Profil
panther:
Ahoj, tak jsem napsala skript podle Tebe, důkladně zkontrolovala včetně závorek - a výchozí formulář se vůbec nenatáhne (takže ho nemám jak vyzkoušet) a patička je rovněž šoupnutá vlevo dole stejně, jako se mi to dělo po odesílání mého formuláře... Že vždycky s poslední věcí mám tolik práce :-). Nevadí, nějak to přece jít musí.
Zkusila jsem si přidat do Apache VirtualHost ve tvaru www.handy.doma.cz a stránky běží úplně stejně dobře (až na ten zpropadený formulář) jako na "doméně" locahost. Takže jménem localhostu to není Nekdě se mi ta SESSION ztrácí...

EDIT: Ještě mě napadlo: nemůže jít o nějaké nenastavení funkce na hostingu? Něco, co funguje na doméně, ale zkolabuje na subdoméně?
EDIT2: Teď mi docvaklo, že já vlastně potřebuji zobrazovat formulář vždy, nejen při chybách v inputech, ale i po odeslání! A já mám v podmínce vlastně zobrazování formu v případě chyb či neodeslání. Jestli v tomto není zakopaný pes! Ale proč na subdoméně nestačí action sám na sebe jako v případě domény, mi hlava bohužel nebere... Pokus o Lomítko v action="/kontakt.php
způsobilo akorát to, že jsem po úspěšném odeslání viděla naproto bianco stránku
DarkMeni
Profil
Zkus to debugovat - někam na začátek skriptu povol vypisování všech chybových hlášek "error_reporting(E_ALL);", pak si nechávat třeba vypisovat informace o tom, kam až se zpracovávání skriptu dostalo, kterou větví podmínky to projelo a ták (přinejhoršim taky zakomentovat přesměrování, aby to mělo šanci při debugu zobrazit průběh skriptu při úspěšném odeslání emailu) a pár krát si tak zkusit poslat email s chybama/bez chyb.

Jestli chceš zobrazení formuláře vždy, tak jen zruš větev u podmínky na kontrolu nějaké zprávy u $_SESSION (odstraň to "else")
<?php
// je odeslano, vypiseme hlasku
if (isset($_SESSION["zprava"])) {
    echo $_SESSION["zprava"];
    unset ($_SESSION["zprava"]);
} else {
//jinak zobrazime formular (promennou poslano nepotrebujeme)
?>
    <form name="webovy" action="" method="post" onSubmit="return zkontroluj(this)">
        <h2 id="napiste">Chcete mi odeslat námět, dotaz, připomínku?</h2>
        <span id="omez">(do zprávy je povoleno vepsat nebo vložit maximálně 500 znaků)</span>
        <label for="nick">Vaše jméno nebo přezdívka:</label>
        <input type="text" size=25 maxlength=25 name="nick" id="nick"><br>
        
        <label for="email"><font color=red>*</font>Váš email:</label>
        <input type="text" size=25 maxlength=25 name="email" id="email"><br>
        
        <label for="predmet"><font color=red>*</font>Předmět zprávy:</label>
        <input type="text" size=25 maxlength=25 name="predmet" id="predmet"><br>
        
        <p id="spambot">Ochrana před spambotem - doplňte prosím výsledek (číslo):</p>
        <label for="spam"><font color=red>*</font>čtyři krát tři</font></label>
        <input type="text" size=10 name="spam" id="spam"><br>
        
        <p id="psani"><label for="zprava"><font color=red>*</font>Text Vaší zprávy:</label><br>
        
        <textarea name="zprava" id="zprava" wrap="physical" onKeyPress="odpocet(this);" onKeyUp="textLimit(this.form.zprava, 500);">
        <?php echo isset($_POST['zprava']) ? substr($_POST['zprava'], 0, 500) : '' /*toto bych tam dal, aby uživatel nemusel v přídadě nevyplnění nějakého pole psát celou zprávu znovu*/?>
        </textarea></p><br>
        
        <p><input type="checkbox" name="kopie" value="ano" checked="checked" id="checked">Poslat si zprávu i na zadaný email</p><br>
        
        <input type ="submit" name="poslano" value="Odeslat zprávu" id="poslano"><br>
        <div id="pocitadlo"><span class="text-kolem"> Zbývá ještě</span><input type="text" name="cislo_zbyva" class="ctverecek" MaxLength=3 value="500"><span class="text-kolem"> znaků, napsáno je již</span><input type="text" name="cislo_napsano" class="ctverecek" MaxLength=3 value="0"><span class="text-kolem">znaků.</span></div><br>
        <h5 class="hvezdicka">Políčka s <font color=red>červenou *</font> je nutné vyplnit</h5>
    </form>
<?php } /*a tohle je uzavírací závorka pro to "else" - když ho teda odstraníš, tak odstraň i tento řádek*/ ?>

Nemáš někde v tomto nebo vyšším adresáři soubor .htaccess?
Joan
Profil
DarkMeni:
Nemáš někde v tomto nebo vyšším adresáři soubor .htaccess?
Mám, v adresáři pro doménu (tj. nad tímto inkriminovaným adresářem):

#podstrceni
RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.html$ $1.php [nc,L]

#presmerovani na www
RewriteCond %{HTTP_HOST} ^zlatberry\.cz [NC]
RewriteRule (.*) http://www.zlatberry.cz/$1 [R=301,L]

#chybova stranka
ErrorDocument 404 /zlatberry/chybovka.php

a přímo v adresáři pro tuto subdoménu:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?([^/]+)?/?$ ?x=$1&y=$2 [L,QSA]

Vypisování chybových hlášek vůbec není hloupý nápad, díky Ti! Zkusím zjistit, kde se to na Onebitu zapíná.

Původně jsem tam to else neměla, ale chci formulář zobrazit vždy i po odeslání: jednak si pisatel může ještě na něco vzpomenout a taky aby nezůstala po odeslání prázdná stránka. Jinak je zvláštní, že se mi zobrazuje po odeslání pouze menu, patička už vůbec (a nevím proč...)

A ještě jedné věci jsem si všimla: když teda odešlu úspěšně formulář, ukáže se prázdná stránka - obsahující pouze menu napravo. Ale když hned potom kliknu znova na ten odkaz s formulářem, zobrazí se zpráva o odeslání přesně tam, kde na localhostu a taky přibude patička. Action mám prázdný a skript totožný jako zezačátku, akorát jsme odstranila to první header("location: ...") a nechala jen jedno. Znamená to, že nefunguje správně "refresh" stránky?

Tak to jsem z toho jelen :-(. Zapnula jsem zobrazování všech chyb a po odeslání formuláře se mi na stránce s menu zjevilo toto:

Warning: Cannot modify header information - headers already sent by (output started at /hosting/www/zlatberry.cz/www.handy/index.php:22) in /hosting/www/zlatberry.cz/www.handy/kontakt.php on line 73 

No a na řádku 73 mám:

header("location: http://www.handy.zlatberry.cz/kontakt/");

Copak vypsání hlavičky je pro Apače už zakázaný výpis??
panther
Profil
Joan:
nee, výstup začal na ř. 22 v index.php (řádky si dopočítej, pravděpodobně tam bude nějaký include). Může to být i BOM, když na něj přijde (na 1. řádku includovaného souboru, celkově tedy třeba i takto daleko v dokumentu).
Joan
Profil
panther:
Už jsem pochopila...
A hle, už mi to píše (na localhostu) ...headers already sent... a na ř.22 v index.php mám otevírací značku PHP.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="cs">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
     <meta name="description" content="Stránky věnované mým kutilským buňkám">
      <meta name="keywords" content="kutil, kutilský, vlastnoruční, výrobky">
      <meta name="author" content="Jana Krejčí">
       <meta name="robots" content="all, follow">
    <!--[if lt IE 7]>
 <p>Používáte Internet Explorer verze 6 nebo nižší. Nechcete si nainstalovat modernější prohlížeč k příjemnějšímu prohlížení stránek?</p>
                <![endif]-->
  <!--[if gte IE 7]><!-->
  <link rel="stylesheet" type="text/css" href="/styl-handy.css">
<!--<![endif]-->
<!--[if IE 7]>
  <style type="text/css">
  div#nav li a {width: 9.5em;}
  </style>
    <![endif]-->
  </head>
  <body>
<?php
    /*nastavení defaultní hodnoty - aby se nezobrazovalo "Undefined index" */
$x = isset($_GET['x']) ? $_GET['x'] : 'uvod';
$y = isset($_GET['y']) ? $_GET['y'] : '';   

    ?>
  <div id="obal">
<div id="nav">
   <ul class="lev1">
<li><a href="/uvod/"<?php echo in_array($x, array('uvod', '')) ? 'class="vybr"' : ''; ?>>Úvodní stránka</a></li>.....

ale to všechno přece v index.php mít musím!? V PSPadu mám BOM vypnuté a v includovaném kontakt.php mám otevírací značku PHP úplně na začátku...

A druhá chyba, co parser píše, že na ř.2 v kontakt.php mám session_start();
A po odeslání na localhostu přibude varování o odeslaných hlavičkách na řádcích, kde mám headres("location: ..."); a patička není, jen menu - ale proč jen menu?

Promiň, nenapadá mě, co s tím... Zapnout bufferování na hostingu asi není dobrý nápad, že?
panther
Profil
Joan:
ale to všechno přece v index.php mít musím!?
to ano, ale zpracování formuláře (a odesláíní mailů apod.) musíš mít úplně nad vším, tzn. jakoby na začátku toho indexu, ještě před doctypem.

Ono teoreticky i ř. 24 a 25 z tvého kódu mohou být na začátku souboru a bude to fungovat úplně stejně.
Joan
Profil
Díky, jsem o krůček dál!
<?php
session_start();
?>

jsem vkopírovala na samý začátek index.php a z kontakt.php smazala, protože vyskočila notice, že už session byla nastartována. Deklaraci obou proměnných jsem přilepila hned za session_start. Takže po kliknutí na položku s formulářem už zaplaťpánbu se zobrazí správně stránka s formulářem.
Ovšem po odeslání vidím zase jen menu plus odsunutou patičku a warning o začátku výstupu v index.php na 31.ř. To nechápu, protože php kód mi zabírá od zač. stránky 6 řádků a zbytek až do 31 ř. je HTML - na 31 ř. se začíná v HTML objevovat $x - tuto proměnnou myslí parser tím výstupem? Ale já ji tam potřebuji...
DarkMeni
Profil
Joan:
Zapnout bufferování na hostingu asi není dobrý nápad
Mám takový pocit, že na některých hostingách je to dokonce jako výchozí nastavení (output_buffering=on | ob_start()) / takže si myslim že to dobrej nápad je - nemusí se pak řešit tato situace s posílánám HTTP_Headers přes header()

A v tomto případě, kde používáš v soboru PHP+HTML, tak to asi ani jinak řešit nepude - myslim, že to je tak, že ve chvíli, kdy se má poslat 1. bit výstupu prohlížeči, tak se mají zároveň poslat i HTTP_Headers (ještě před tím 1. bitem), a pak už se s tím nedá nic dělat.
Takže "<?php" pochopí PHP parser jako značku pro něj, a na výstup ještě nic neposílá, ale <!DOCTYPE... už vidí jako HTML výstup, tak ho pošle i s předgenerovanými HTTP_Headers, což je vlastně 1. akce u index.php (v řádcích 1-22 posílá výstup)

Což je celkem divný, protože v takovém případě by neměl fungovat refresh přes header() vůbec (maximálně možná přes html značku <meta> s příkazem na refresh), ale tobě se stejně nějaká stránka načte

Každopádně bych zkusil Output Buffering zapnout, jestli nějaký problém zmizí, tak to bude dobrý, a když ne, tak se tim nic neztratí a aspoň se vyloučí to, že by to bylo kvůli tomu co sem psal

Ještě jen - nikde sem nenašel, kde by se do index.php napojoval kontakt.php, tak jestli to menu s patičkou bez obsahu neni způsobeno tím
Joan
Profil
DarkMeni:
Každopádně bych zkusil Output Buffering zapnout,
Teda, to byla šťastná myšlenka, to Ti řeknu! Napsala jsem na podporu Onebitu (je fantasticky rychlá a ochotná) a napsali mi způsoby, jak si u nich zapnu bufferování. Pro mě je nejjednodušší (zatím nyní na localhostu) dát na samý začátek index.php

<?php
ob_start();
session_start();
?>

a před poslední značku ?> dát ob_flush(); - a hle - maily se odesílají a oznámení o úspěšném odeslání se zobrazuje, kde jsem chtěla a formulář se znova pěkně natáhne! A s action="/kontakt/" to už vše už funguje k mé radosti.
Děkuji Vám pánové oběma, bez Vaší pomoci bych to dala dohromady možná na vánoce...
Hezký den :-)

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: