Header ve třídách – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Header ve třídách – PHP – Fórum – Programujte.comHeader ve třídách – PHP – Fórum – Programujte.com

 

tribalcz0
Super člen
2. 7. 2014   #1
-
0
-

Ahoj jen bych se chtěl v něčem ujistit chci li modifikovat header pomocí header(Location:"index.php?stranka=uvod") tak modifikaci nesmí předcházet žádný html výstup ani v php tjecho("textový výstup").

Ale když se potřebuji přihlásit a po přihlášení přesměrovat na nějakou stránku tak mi to neustále hlásí chybu : Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\www\e85\class\Login.php:35) in C:\wamp\www\e85\class\Login.php on line 42. i přesto že ověření a přesměrování vypisuji před výpisem formuláře.

Struktura třídy je následovná 

- načtení dat z db

- výpis form frameworku

- validace a přesměrování 

a při výpisu do souboru login.php vypisuji opačně ted 

- validace a přesměrování

- výpis form frameworku

<?php
class Login{

	private $form;
	
	private function selectUser($login, $password){
		$result = Database::query('SELECT `login`, `password` FROM `users` WHERE `login` = ? AND `password` = ?', array($login, $password));
		return $result;
	}

	public function __construct(){
		$this->form = new Form('Přihlášení');
	}

	public function writeForm(){
		$this->form->addTextBox('login', '', true, array(
		'tabindex' => '1',
		'placeholder' => 'Zadejte své přihlašovací jméno',
		'autofocus' => ''
		));
		$this->form->addTextBox('password', '', true, array(
		'tabindex' => '1',
		'placeholder' => 'Zadejte své heslo'
		));
		$this->form->addButton('logGo', 'Přihlásit se');
		echo($this->form->render());
	}

	public function verification(){
		if ($this->form->isPostBack())
		{
			try
			{
				if($_SESSION['login'] == false){
					$log = $_POST['login'];
					$pass = $_POST['password'];
					$verification = $this->selectUser($log, $pass)->rowCount();
					$row = $this->selectUser($log, $pass)->fetch();
					if($verification == 1) {
						$_SESSION['login'] = stripslashes($_POST['login']);
						header("Location: admin.php");
					} else {
						throw new UserException('Zadaná kombinace loginu a hesla je neplatná');
					}
				} else {
					throw new UserException('Již jste přihlášn/a');
					
				}
			}
			catch (UserException $e)
			{
				echo('<span class="exception">' . nl2br($e->getMessage()) . '</span>');
			}
		}
	}
}
Nahlásit jako SPAM
IP: 178.209.131.–
Kit+15
Guru
2. 7. 2014   #2
-
0
-

#1 tribalcz
Některé editory vloží na začátek každého souboru tři neviditelné znaky BOM. Doporučuji zkontrolovat nějakým hexa editorem. Ty znaky tam nesmí být.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
tribalcz0
Super člen
2. 7. 2014   #3
-
0
-
Nahlásit jako SPAM
IP: 178.209.131.–
Kit+15
Guru
2. 7. 2014   #4
-
0
-

#3 tribalcz
Musíš prověřit všechny soubory, které tuto třídu přímo či nepřímo includují, jestli se v nich před voláním header() z třídy náhodou neobjeví nějaký výstup, třeba HTML.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
2. 7. 2014   #5
-
0
-

nez se s tim parat soubor po souboru, tak si stahni treba wgetem tu konkretni stranku a tam uvidis, jestli je tam zrovna BOM nebo jen nejaka mezera kolem <?php/?> ci tak :D

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
tribalcz0
Super člen
2. 7. 2014   #6
-
0
-

#5 KIIV
když to sosnu pomoci wget tak dostanu zdrojak stejny jako v prohližeči ne?

Nahlásit jako SPAM
IP: 178.209.131.–
KIIV
~ Moderátor
+43
God of flame
2. 7. 2014   #7
-
0
-

jo, ale lip se to prohlizi nez ve view source v prohlizeci (jinak to stejne musis ulozit a prohlizet v necem jinym)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
tribalcz0
Super člen
2. 7. 2014   #8
-
0
-

#7 KIIV
podle toho by to mělo bejt čistý 

Nahlásit jako SPAM
IP: 178.209.131.–
KIIV
~ Moderátor
+43
God of flame
2. 7. 2014   #9
-
0
-

cisty i v hex editoru?

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
tribalcz0
Super člen
2. 7. 2014   #10
-
0
-

ano ale podařilo se mi zjistit že to dělá tato část  

if($_SESSION['login'] == false){
					$log = $_POST['login'];
					$pass = $_POST['password'];
					$verification = $this->selectUser($log, $pass)->rowCount();
					$row = $this->selectUser($log, $pass)->fetch();
					if($verification == 1) {
						$_SESSION['login'] = stripslashes($_POST['login']);
						$_SESSION['function'] = $row['function'];
						header("Location: admin.php");
					} else {
						throw new UserException('Zadaná kombinace loginu a hesla je neplatná');
					}
				} else {
					throw new UserException('Již jste přihlášn/a');	
				}

Přišel jsem na to díky tomu že jsem funkci postupně přesouval mezi jednotlivými podmínkami ale momnetálně to vypadá jako by to dělala právě tato podmínka

resp. její obsah

Nahlásit jako SPAM
IP: 178.209.131.–
Kit+15
Guru
2. 7. 2014   #11
-
0
-

#10 tribalcz
V tom kódu není příčina, ale až následek. Zkus místo 

header("Location: admin.php");

napsat 

die("Location: admin.php");

To, co bude ve výstupu před stringem "Location: admin.php", je ten chybný výstup, který tam nepatří.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
tribalcz0
Super člen
2. 7. 2014   #12
-
0
-

#11 Kit
nic to neudělalo akorat se při odeslani formulaře vypsalo Location: admin.php

Nahlásit jako SPAM
IP: 178.209.131.–
Kit+15
Guru
2. 7. 2014   #13
-
0
-

#12 tribalcz
Skutečně před tím není prázdný řádek ani hlavička HTML?

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
tribalcz0
Super člen
2. 7. 2014   #14
-
0
-

třída Login.php 

<?php
class Login{

	private $form;
	
	private function selectUser($login, $password){
		$result = Database::query('SELECT `login`, `password` FROM `users` WHERE `login` = ? AND `password` = ?', array($login, $password));
		return $result;
	}

	public function __construct(){
		$this->form = new Form('Přihlášení');
	}

	public function writeForm(){
		$this->form->addTextBox('login', '', true, array(
		'tabindex' => '1',
		'placeholder' => 'Zadejte své přihlašovací jméno',
		'autofocus' => ''
		));
		$this->form->addTextBox('password', '', true, array(
		'tabindex' => '1',
		'placeholder' => 'Zadejte své heslo'
		));
		$this->form->addButton('logGo', 'Přihlásit se');
		echo($this->form->render());
	}

	public function verification(){
		if ($this->form->isPostBack())
		{
			try
			{
				if($_SESSION['login'] == false){
					$log = $_POST['login'];
					$pass = $_POST['password'];
					$verification = $this->selectUser($log, $pass)->rowCount();
					$row = $this->selectUser($log, $pass)->fetch();
					if($verification == 1) {
						$_SESSION['login'] = stripslashes($_POST['login']);
						$_SESSION['function'] = $row['function'];
					} else {
						throw new UserException('Zadaná kombinace loginu a hesla je neplatná');
					}
				} else {
					throw new UserException('Již jste přihlášn/a');	
				}
			}
			catch (UserException $e)
			{
				echo('<span class="exception">' . nl2br($e->getMessage()) . '</span>');
			}
		}
	}
}

soubor login.php 

<?php
$log = new Login();
$log->writeForm();
$log->verification();
?>
Nahlásit jako SPAM
IP: 178.209.131.–
peter
~ Anonymní uživatel
4014 příspěvků
14. 7. 2014   #15
-
0
-

header problem nastava, jak uz psali, tehdy
- je-li odeslana hlavicka
-- ta se odesle, jestlize mas php nastavene, ze ma odesilat hlavicku pri kazdem echo nebo vypisu html kodu
--- tomu muzes zabranit pouzitim ob_start nebo zmenou v php.ini (nebo mozna .htaccess, httpd.ini)
Cili, nesmi se vypsat zadny html/text kod, treba pri znaku BOM nebo echo a nebo prazdny radek pred <?php a pod. Snadno se to da zjistit, kdyz das na zacatek <pre>, pak ti to bude radkovat prohlizec. Ale lepe, kdyz hned kliknes Zobrazit zdrojovy kod v prohlizeci, pripadne stranku z prohlizece ulozis do souboru.

priklad s prazdnym radkem s pouzitim tveho souboru:
-(1)-

<?php $log = new Login();
$log->writeForm();
$log->verification(); ?>
-(2)-

<?php
class Login{ private $form; ...
-(3)-

<?php
include 'login.php';
?>

<?php
include 'neco.php';
?>
-(4)-
<?php
echo '';
---
(1) prazdny radek pres <?php
(2) prazdny radek pres <?php
(3) prazdny radek pres <?php include 'login.php'; a dalsi pred <?php include 'neco.php';
(4) echo, ted si nejsem uplne jisty, ale myslim, ze i prazdny retezec odesle html hlavicku, nicmene jiste retezec s mezerou ' ' nebo novym radkem '\n' ci '
', pokud ti neco takoveho vyplodi
echo($this->form->render());
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:d135:b4...–
Kit+15
Guru
14. 7. 2014   #16
-
0
-

#14 tribalcz
Někdy bývá problém v symbolu "?>" na konci souborů. Doporučuji ho tam vůbec nedávat.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 57 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý