Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Nedokážu vypsat echo $_SESSION["x"] = "ahoj" do <body>

Zdravím,
lopotím se už delší dobu s formulářem, který po správném vyplnění proběhne přes zpracující script v PHP a pomocí header("location: ...) je výsledek přesměrován zpět na výchozí formulář. Odesílání funguje v pořádku, až na to, že se mi vůbec nedaří tu hlášku o odeslání vypsat tam, kam chci :-[
Tady je odkaz na důležitou část zdrojového kódu mého PHP scriptu.

Protože potřebuji zobrazovat DVĚ rozdílné hlášky o odeslání v případě, že si uživatel zatrhne v checkboxu kopii, byla jsem nucena i v <body> použít konstrukci IF. Zpráva s výše uvedeným kódem se odešle bez problému buď na jednu nebo podle volby na dvě adresy, akorát - bohužel nezobrazí ani písmenko hlášky a já jsem už v vyčerpala všechny své nápady. Řádek v kódu 37 a 39 prostě nezobrazuje a nezobrazuje...:.(
Jinak test

<?php
session_start();
$_SESSION['test'] = 'TEST';
echo $_SESSION['test'];
?>

mi funguje. Poradíte mi prosím pěkně někdo, jak $_SESSION donutit, aby se zobrazovala uvnitř tagu body, tj. až pod Doctype kvůli potřebě zobrazení v Režimu prohlížeče standard?
Mnohokrát děkuji předem za funkční radu!

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Hezký den, k předešlým příspěvkům ještě připojuji : skutečně je třeba podívat se znovu na ty testy :…
hynajs 01.07.2010 09:02
hynajs
Zdravím :-), jaktože podmínka isset($_POST["kopie"]) == "ano" projde vždy? Vždyť tam mám znak poro… nový
Joan 01.07.2010 16:17
Joan
Zdravím, ad první dvě věty o podmínce : ta podmínka není dobře ani selským rozumem, protože isset vr… nový
hynajs 01.07.2010 20:23
hynajs
Hurááá, v noci jsem to vyřešila :puff: !! A jak jednoduché řešení bylo na dosah... Dlouhé hodiny bád… poslední
Joan 02.07.2010 09:49
Joan

Hezký den, k předešlým příspěvkům ještě připojuji : skutečně je třeba podívat se znovu na ty testy :
Podmínka

isset($_POST["kopie"]) ==  "ano"

je přinejmenším podezřelá. Projde vždy, je-li splněno

isset($_POST["kopie"])

ať už je hodnota jakákoli.
Pokud plníš proměnnou kopie checkboxem (pravděpodobně), kupodivu podmínka zafunguje správně, ale zkontroluj si to.

Zdravím :-),
jaktože podmínka

isset($_POST["kopie"]) ==  "ano"

projde vždy? Vždyť tam mám znak porovnání a pokud nebude souhlasit, tak přece neprojde.

Btw, možná už tuším, proč mi to žádnou zprávu o odeslání nezobrazí:
- když jsem měla dřív kód

if (empty($chyba))
      {
      cs_mail("adresa@email.cz", $predmet, "--$nick--\n".$zprava, "From: $email\n");
      header("location: http://localhost/adresa/mail_formular.php");
$_SESSION["jeden"] = "<h3 id='anim'>Zpráva byla úspěšně odeslána</h3>";
      }
.....

tak hned na samém začátku scriptu jsem měla

if 
{
(isset($_SESSION["jeden"]))
echo $_SESSION["jeden"];
unset ($_SESSION["jeden"]);
}

a hláška se v pohodě vypsala (i když ve quirku). A proč se vypsala? Protože příkaz k jejímu vypsání byl ve složených závorkách spolu s header("location: ...). Takže zpráva se odeslala, stránka se přesměrovala na výchozí formulář (jak jsem chtěla) a přenesl se i povel k zobrazení.

- nyní mám vypsání hlášky zcela samostatně, header("location: ...) už o ní neví zhola nic a proto se nevypíše na přesměrované stránce. Nemám pravdu?
Ale protože funkce header nemůže být po žádném výstupu, tak ji budu muset nejspíš bufferovat pomocí ob_start();
Zatím mám problém v tom, že ani vložení ob_start(); a vložení header("location: mail_formular.php"); hned za příkaz k zobrazení hlášky (která už je nakódována v tagu body) nesplnilo moje očekávání :-x. Dala jsem ji na začátek zpracujícího scriptu, pak i do souboru s formulářem - a nic.
Zatím ladím lokálně ve WAMPu a mám zapnuté defaultní zobrazování chyb error_reporting = 30719 tj. ALL.
V php.ini (PHP Version 5.3.0) mám "output_buffering = 1". Mám hledat ještě něco dalšího?
Zatím děkuji za pomoc :-)

Zdravím, ad první dvě věty o podmínce :
ta podmínka není dobře ani selským rozumem, protože isset vrací hodnotu boolean.
Navíc tedy proč tvrdím, že projde vždy, když isset vrací true ?
Vyzkoušej si tento skriptík :

if ( vrat_pravdu() == "to je ale sranda"  ) {  echo "o.k. ?" ;  }

function vrat_pravdu() {
  return true ;
}

Jedná se o problematiku loose vs. strict comparison.

Viz např.
http://www.php.net/manual/en/types.comparisons.php
a Google Ti vrátí další diskuse.

Hezké počtení na začátek léta,já jsem z toho kdysi byl taky na infarkt . :-)

Hurááá, v noci jsem to vyřešila :puff: !! A jak jednoduché řešení bylo na dosah...
Dlouhé hodiny bádání byly zapříčiněny mým tragickým nepochopením (učím se PHP tak čtvrt roku) fungování session:
původně jsem měla v souboru s formulářem úplně nahoře kód

<?php session_start();
if (isset($_SESSION["zprava"]))
{
echo $_SESSION["zprava"];
unset ($_SESSION["zprava"]);
}

a v scriptu ve zpracujícím souboru (to "zprava" jsem až potom změnila na "jedna" a "dva", protože jsme už nevěděla kudy kam)

if (empty($chyba))
      {
      cs_mail("adresa@email.cz", $predmet, "--$nick--\n".$zprava, "From: $email\n");
      header("location: http://localhost/adresa/mail_formular.php");
$_SESSION["zprava"] = "<h3 id='anim'>Zpráva byla úspěšně odeslána</h3>";
      }
      if (isset($_POST["kopie"]) == "ano" and (empty($chyba)))
      {
cs_mail($email, $predmet2, "Z formuláře na webu adresa.cz jste odeslali tuto zprávu:\n---------------------------------------------------------------------------\n\n $zprava", "From: no-reply@adresa.cz\n");
header("location: http://localhost/adresa/mail_formular.php");
$_SESSION["zprava"] = "<h3 id='anim'>Zpráva byla úspěšně odeslána<br />Zpráva byla odeslána i na Vaši adresu</h3>";          
      exit;
          }    

což šlapalo bezvadně, až na to, že se zpráva o odeslání zobrazovala v quirku.
Já jsem totiž myslela, že to

$_SESSION["zprava"] = "<h3 id='anim'>Zpráva byla úspěšně odeslána</h3>"; a $_SESSION["zprava"] = "<h3 id='anim'>Zpráva byla úspěšně odeslána<br />Zpráva byla odeslána i na Vaši adresu</h3>"; 

musím šoupnout někam dolů pod Doctype a k tomu dopsat echo. Jenže po vyjmutí výše uvedeného kódu s hláškami a dosazením na jiné místo ve zpracujícím souboru se session nejspíš ztratila do nenávratna a tudíž nebylo jak přenést zprávu o odeslání zpátky na soubor s formulářem (díky header("location:...).

Takže řešení:
nechat

if (empty($chyba))
      {
      cs_mail("adresa@email.cz", $predmet, "--$nick--\n".$zprava, "From: $email\n");
      header("location: http://localhost/adresa/mail_formular.php");
$_SESSION["zprava"] = "<h3 id='anim'>Zpráva byla úspěšně odeslána</h3>";
      }
      if (isset($_POST["kopie"]) == "ano" and (empty($chyba)))
      {
cs_mail($email, $predmet2, "Z formuláře na webu adresa.cz jste odeslali tuto zprávu:\n---------------------------------------------------------------------------\n\n $zprava", "From: no-reply@adresa.cz\n");
header("location: http://localhost/adresa/mail_formular.php");
$_SESSION["zprava"] = "<h3 id='anim'>Zpráva byla úspěšně odeslána<br />Zpráva byla odeslána i na Vaši adresu</h3>";          
      exit;
          }    

na svém místě a na výchozí stránce s formulářem, kam se potom přesměrovává, ponechat na samém začátku scriptu

<?php
session_start();
}

a pouze tento úseček kódu

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

přesunout o kus dolů pod Doctype - a funguje to naprosto správně :-D
Uff, teda, už si budu do smrti pamatovat, že nezáleží na tom, kde se nachází kousek kódu, který chci zobrazit, ale na tom, kam přesunout povel k zobrazení, tedy echo
Hezký den!

Zpět do poradny Odpovědět na původní otázku Nahoru