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
Zdravim, ten script orezany od toho odosielania funguje bez problemov, chybu by som hladal najskor t… nový
Kio. 01.07.2010 08:09
Kio.
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 :… nový
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

Zdravim,
ten script orezany od toho odosielania funguje bez problemov, chybu by som hladal najskor tam (dole pred zobrazenim toho nadpisu treba skontrolovat ci je premenna $chyba naozaj prazdna - aby sa hlasenia vypisali). ALE v tom kode (ak je v jednom scripte) je podla mna aj ina chyba: na zaciatku scriptu po session start su obidvom premennym jeden aj dva priradene hodnoty(to sa este potom dupluje v odosielani), v takom pripade na konci scriptu bude podmienka jedna vyhovovat vzdy ak aj podmienka dva.

Modelovy priklad: ak nie je zaskrtnuta kopie=ano vyhovuje prva podmienka, vypise:

Zpráva byla úspěšně odeslána

ak je zaskrtnute kopie=ano vyhovuju obe podmienky - aj prva aj druha, vypise:

Zpráva byla úspěšně odeslána

Zpráva byla úspěšně odeslána
Zpráva byla odeslána i na Vaši adresu

Treba odmazat 3. a 4. riadok z toho zverejneneho scriptu.

Kio.

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