Autor Zpráva
leorond
Profil
Dobré odpoledne, mám tu jeden problém který jsem prozatím vyřešil javascriptem ale chtěl bych ho radši řešit PHP.

Tímto kódem volám jednotlivé stránky

<?php
if(isset($_GET["strana"]))
{
    if(file_exists("./".$_GET["strana"].".php") && (substr_count($_GET["strana"], "../") == 0) && (substr_count($_GET["strana"], "..\\") == 0)) {
        include_once "./$_GET[strana].php"; 
    } else {
        echo    "<script> location.replace('/404'); </script>";
    }
} else {
    echo    "<script> location.replace('/404'); </script>";
}
?>

Měl jsem tam místo javascriptu

header('location: /404', true, 303);

A vše fungovalo perfektně ale najednou jako když utne a začal jsem dostávat chybu

warning: Cannot modify header information - headers already sent by ...

Prošel jsem tedy všechny scripty zda tam nemám BOM ale pravděpodobně to bude způsobeno tím include_once.

Prý se to dá opravit tím že použiji ob_start() a ob_end_flush(), vyzkoušel jsem to ale nepomohlo.

Potřeboval bych pomoci s tímto problémem.

Děkuji za pomoc


Už jsem to dokázal vyřešit sám tím že jsem do hlavního index.php vložil následující řádky.

ini_set('short_open_tag', 'On');
session_start();
//error_reporting(0);
ob_start("ob_gzhandler");
header    ("Cache-control: private");
Keeehi
Profil
leorond:
Prý se to dá opravit tím že použiji ob_start() a ob_end_flush()
To je jen obejití problému a ne jeho vyřešení.

Prošel jsem tedy všechny scripty zda tam nemám BOM
Nejde jen o BOM, ale o jakýkoli výpis čehokoliv. To znamená html kód nebo i jen mezera před <?php, jakékoli echo vypisující něco a podobně.
leorond
Profil
Prošel jsem spoustu článků o tomto problému a v několika psali že to problém nepotlačuje ale řeší. Tak jsem to zkusil použít.
Keeehi
Profil
Řeší to důsledky problému, ne problém samotný.

Je to podobné, jako by jsi měl v nádrži u auta díru a unikal ti benzín. V důsledku toho nezvládneš dojet do cílového místa. A tvé řešení je prostě jen častěji stavět u benzínových pump a stále doplňovat benzín. Tudíž ano, do cílového místa jsi se dostal. Vyřešil jsi problém nedostatku benzínu, ale nevyřešil jsi to, co způsobilo ten nedostatek benzínu - díru v nádrži. Kdyby jsi raději vyřešil díru v nádrži, nemusel by jsi řešit problém nedostatku benzínu.
leorond
Profil
A jak to tedy mohu opravit?
Keeehi
Profil
Jak jsem psal, je potřeba to volat před jakýmkoli výpisem.

Jak zjistíš, co vypisuješ před tím? Můžeš třeba na místo, kde voláš header dát echo '!marker!';. Pak stačí si jen zobrazit zdrojový kód stránky a najít, kde se řetězec !marker! objeví. Cokoli je před ním tak je to, co způsobuje ten problém.
Dusann
Profil
Keeehi:
Jak jsem psal, je potřeba to volat před jakýmkoli výpisem

No ale nie vždy je to možné. Napríklad:

<?php
function errorHandler(){
    header('Location:error.php');
    ob_end_clean();
    exit;
}
set_error_handler('errorHandler',E_ALL);
ob_start();
// tu začínajú úlohy skriptu, okrem logiky obsahuje aj výpis
// niekde v tele skriptu nastane chyba a je zachytená custom funkciou

Tak v tomto prípade je output buffering jediným riešením, nie ?
Davex
Profil
Dusann:
Tak v tomto prípade je output buffering jediným riešením, nie ?
V naprosté většině případů nepotřebuješ v případě výskytu chyby nikam přesměrovávat. Minimálně tím přijdeš o URL, kde k chybě došlo.
Radek9
Profil
Dusann:
Hlavní chyba asi bude to, že logika obsahuje výpis. Doporučil bych ti překopat návrh té aplikace. Potom bys nemusel řešit ani přesměrování na chybovou stránku, neboť by na stránce nebylo nic, takže bys na ni rovnou mohl chybu vypsat.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: