redirect vyhadzuje InvalidStateException
- Smokie
- Člen | 6
Zdravim,
mam jeden zvlastny problem s funkciou redirect v presenteroch.
Takmer vzdy ked ju v handle zavolam, tak mi vrati vynimku
InvalidStateException
Cannot set HTTP code after HTTP headers have been sent (output started at
/var/www/workspace/12009001/app/templates/@layout.phtml:27).
Pritom je to zvlastne, pretoze mi to vyhodi pri vacsine handleoch, ale nie
pri vsetkych.
Napriklad mam jeden handle, kde okrem redirectu je len insert do databazy.
V nom redirect nema problem. Ale napisem dalsi handle kde je napriklad len
update alebo tiez insert a tam to uz nejde. Tam mi redirect vrati vynimku.
Snazil som sa najst riesenie v navodoch alebo na fore, ale k nicomu som sa
nedopracoval.
Ake su vlastne pravidla pre pouzitie redirect alebo v com moze byt problem?
Dakujem.
EDIT:
Teraz som jeden taky priklad nasiel
<?php
public function handleZmazTriedu($iof_triedy)
{
$this->db->query('DELETE FROM triedy WHERE ID_triedy = %i', $iof_triedy);
$this->redirect('this');
}
?>
Tento redirect funguje bez problemov.
<?php
public function handlePridatTriedu($nazov, $iof_tr_ucitela, $iof_rocnika)
{
$arr = array('iof_tr_ucitela' => $iof_tr_ucitela, 'iof_rocnika' => $iof_rocnika, 'nazov_triedy' => $nazov);
$this->db->query('INSERT INTO triedy', $arr);
//$this->redirect('this');
}
?>
Ale tento napriklad vobec nie.
<?php
public function handleUpravTriedu($iof_triedy, $nazov, $iof_tr_ucitela, $iof_rocnika)
{
$this->db->query('UPDATE triedy SET iof_tr_ucitela = %i, iof_rocnika = %i, nazov_triedy = %s WHERE ID_triedy = %i', $iof_tr_ucitela, $iof_rocnika, $nazov, $iof_triedy);
//$this->redirect('this');
}
?>
A tento tiez. Ak by nahodou malo ist o $arr…
Pritom tieto tri metody su z rovnakeho presentera.
Editoval Smokie (10. 8. 2009 10:21)
- Honza Kuchař
- Člen | 1662
To bude nejspíš zase UTF-8 BOM. Projeť si soubory následujícím skriptem:
$dir = '.';
function fix_bom($fn) {
$file = fopen($fn, 'rb+');
if ($file) {
$bom = fread($file, 3);
if ($bom == ( chr(0xEF) . chr(0xBB) . chr(0xBF) )) {
$data = '';
while (!feof($file)) $data .= fread($file, 8192);
rewind($file);
fwrite($file, $data);
}
fclose($file);
}
}
$mydir = opendir($dir);
while ($fn = readdir($mydir)) {
if (substr($fn, -4) == '.php') {
fix_bom($fn);
}
}
Texy mě nepochopilo
Editoval honzakuchar (12. 10. 2009 22:55)
- Smokie
- Člen | 6
Vyskusal som vyssie uvedeny skript na UTF-8 BOM, ale nepomohlo to.
Nevie mi niekto poradit? Stale nechapem kde je problem.
<?php
public function handleZmazPredmet($iof_predmetu)
{
$this->db->query('DELETE FROM predmety WHERE ID_predmetu = %i', $iof_predmetu);
$this->redirect('this');
}
public function handleUpravPredmet($iof_predmetu, $nazov)
{
$this->db->query('UPDATE predmety SET nazov_predmetu = %s WHERE ID_predmetu = %i', $nazov, $iof_predmetu);
$this->redirect('this');
}
?>
Tieto dve metody su v JEDNOM subore, v JEDNOM presenteri tak ako su tu napisane, za sebou. V prvej redirect funguje, v druhej hadze vyssie spomenutu chybu a ja vobec nerozumiem preco. Z mojho pohladu su tie dve metody rovnake. Jediny rozdiel je v sql prikaze.
Ako vy pracujete s redirectom? Mozno by mi to mohlo pomoct sa pohnut z miesta.
Dakujem vsetkym za pomoc.
- Smokie
- Člen | 6
jasir napsal(a):
Když na tebe vypadne ta Exception, vpravo nahoře na stránce laděnky je taková šipka. Když na ní klikneš, uvidíš, jestli se ti něco nedostalo na výstup.
Vidim tam celu prvu cast html kodu stranky az do bodu, kedy sa ma vykreslit obsah, ktory havaruje kvoli vynimke. Cize zrejme je nieco velmi zle.
- Smokie
- Člen | 6
Dakujem jasir za rady.
Hovori sa, ze zvyk je zelezna kosela a v tomto pripade som na to doplatil. Ako je vidiet v ukazke mojho kodu, tak ide o handle pre upravu existujucich udajov v databaze, comu predchadza template s formularom na upravu tychto udajov. Ja som do toho templatu dal vsetko od vytvorenia toho formularu az po getValues a volanie toho handlu.
Potom mi napadlo vsetko toto dat do metody renderUpravPredmet, ktora predtym iba vytiahla udaje z databazy a poslala ich templatu pre vlozenie do spominaneho formulara. V template ostalo len
<?php
echo $form;
?>
co je premenna, ktoru templatu posiela renderUpravPredmet a obsahuje ten spominany formular.
A zrazu redirect nadherne funguje. Uz ziadna exception.
- jasir
- Člen | 746
Aha, tak to ještě jedna rada – přečti si Jak vytvářet formuláře. Malý spoiler – v metodách render je pozdě.