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!

Předmět Autor Datum
Máš zapnuté výpisy chyb? (error_reporting -> E_ALL) Ještě doporučuju nastudovat příkaz session_writ…
host 30.06.2010 21:19
host
Nestudoval som tvoj odkaz, ale PHP scriptu by malo byt absolutne fuk kam to vypisuje, PHP script nep…
MM.. 30.06.2010 21:24
MM..
Ne tak docela, opravdu je potřeba (a bylo mi to i poraděno) vypsat tu $_SESSION do tagu body, tj. po…
Joan 30.06.2010 22:29
Joan
Ale ved jasne ze to prehliadac inac zobrazi, ale PHP scriptu je fuk kedy co generuje, musi vygenerov…
MM.. 30.06.2010 22:53
MM..
prip. mas tam viac scriptov a tie data nepreziju z prveho scriptu po ten druhy, apod, citaj aj uplne…
MM.. 30.06.2010 22:57
MM..
Vypíš si hodnoty premenných, ktoré používaš v tých if-och pomocou var_dump (rovno si var_dumpni celú…
los 30.06.2010 23:13
los
Zdravim, ten script orezany od toho odosielania funguje bez problemov, chybu by som hladal najskor t…
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 :…
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…
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…
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

Nestudoval som tvoj odkaz, ale PHP scriptu by malo byt absolutne fuk kam to vypisuje, PHP script nepozna html-ovske "<body>" a ani ho to nezaujima ci tam nejake body bolo alebo nie.
Takze ak ti to funguje na inom mieste programu tak sa zameraj na sledovanie rozdielov tych dvoch miest (nejake premenne su na jednom mieste viditelne a na inom nie, apod)

Ne tak docela, opravdu je potřeba (a bylo mi to i poraděno) vypsat tu $_SESSION do tagu body, tj. pod Doctype. Umím vypsat, co potřebuji, nad Doctype, ale stránka se pak zobrazí v Režimu kompatibility a v tom momentě Opera spolu s IE zcela odmítají požadované formátování, nereagují na nic = opravdu nechci, aby se mi hláška o odeslání mailu zobrazovala škaredě nad záhlavím, úplně mimo stránku.
Vím, že můžu echem vypsat PHP kód kamkoliv do stránky, tak proč to nejde u <?php echo $_SESSION["x"]?> ?

Ale ved jasne ze to prehliadac inac zobrazi, ale PHP scriptu je fuk kedy co generuje, musi vygenerovat stejnu vec pred body aj po body aj pred po end a aj o rok, proste PHP je jedno kedy nieco robi. Zobraz si HTML zdrojak ze co ti to tam vygenerovalo. Ak to vygeneruje pred body nieco ine ako po body tak sleduj napr. premenne PHP scriptu - pred body to mas v inej funkcii mozno, a je tam problem viditelnosti premennych z podfunkcie, apod. Pisem ze som to nestudoval co tam robis, robis to predsa ty. Mas tam nejake podfunkcie?

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