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 |
#3 · Zasláno: 21. 11. 2012, 20:52:59
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 ht>tp://w>ww.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 |
#6 · Zasláno: 21. 11. 2012, 21:37:42
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: ht>tp://w>ww.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 |
#9 · Zasláno: 21. 11. 2012, 22:30:01
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 |
#10 · Zasláno: 21. 11. 2012, 23:31:05
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 |
#11 · Zasláno: 21. 11. 2012, 23:49:58
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 |
#12 · Zasláno: 22. 11. 2012, 00:02:33
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 |
#13 · Zasláno: 22. 11. 2012, 10:11:23
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 |
#14 · Zasláno: 22. 11. 2012, 13:01:07
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 |
#15 · Zasláno: 22. 11. 2012, 13:31:04
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 |
#17 · Zasláno: 22. 11. 2012, 22:05:11
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 |
#19 · Zasláno: 23. 11. 2012, 11:47:18
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 |
#21 · Zasláno: 23. 11. 2012, 12:28:02
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 |
#22 · Zasláno: 23. 11. 2012, 12:44:43
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 :-) |
||
Časová prodleva: 11 let
|
0