Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z header- skrypt download
Forum PHP.pl > Forum > Gotowe rozwiązania
stal-sw
Mam straszny problem z nagłowkami.
Moj skrypt do dwonloadu opiera sie na funkcjach i caly skrypt zawiera sie w 1 pliku.

I gdy chce pobrac plik - czyli klikam link
Kod
download2.php?op=getit&idp=6
to wyskakuje mi blad Cannot add header information - headers already sent by. Szukałem opisu tego problemu na tym forum ale nie znalzlem odpowiedzi.

Przed kodem php w pliku download2.php (ktory zwiera wszystkie funkcje) znajduje sie kod HTML.

Kod funkcji getit:

[php:1:cb3ee856ab]<?php
function getit($idp) {
global $DBprefix;
$query = "SELECT url FROM pliki WHERE idp='$idp'";
$wynik = mysql_query($query);
$row = mysql_fetch_array($wynik);

Header("Location: ".$row['url']);


$query = "UPDATE pliki SET ilosc_pobran=ilosc_pobran+1 WHERE id='$id'";
$wynik = mysql_query($query);
exit();
}
?>[/php:1:cb3ee856ab]

Prosze o pomoc.
Wankster
a co za kod wysyłasz przed wywołaniem tej funkcji?
stal-sw
[php:1:325d4bee13]<?php
Z ponizszego kodu odpalam podany wczesniej kod:

function viewfiles($kategoria, $sort="nazwa") {
kat();
global $DBprefix;

$query = "SELECT * FROM pliki WHERE kategoria='$kategoria' ORDER BY $sort";
$wynik = mysql_query($query);
while($row = mysql_fetch_array($wynik)) {
echo " <table bgcolor=#c0c0c0 cellpadding=1 cellspacing=1 width=498>";
echo " <tr><td width=156 bgcolor=#e4e4e4 rowspan=5><center>";
echo " <p><img border=0 src=ogl.gif width=130 height=80></p></td>";
echo " <td width=329 bgcolor=#e4e4e4>Nazwa:" . $row['nazwa'] . "</td></tr>";
echo " <tr><td width=329 bgcolor=#eeeeee>Autor:" . $row['opis'] . "</td></tr>";
echo " <tr><td width=329 bgcolor=#eeeeee>Rozmiar: " . $row['wielkosc'] . " kb</td></tr>";
echo " <tr><td width=329 bgcolor=#eeeeee>Ilosc pobrań:</td></tr>";
echo " <tr><td width=329 bgcolor=#eeeeee><b>Pobierz:</b> <a href="download2.php?op=getit&idp=" . $row['idp'] . "">get</a></td></tr>";
echo " <tr><td bgcolor=#f5f5f5 colspan=2 height=10></td></tr>";

}
}
?>[/php:1:325d4bee13]
zalew
zamiast
echo "<table>"
rob
?><table><?

ale to tak btw.. sprawdz czy header napewno jest pierwsza informacja od gory liczac bo musi byc wyslany przed jakimkolwiek innym fragmentem kodu.
stal-sw
A nie da sie jakos zastosowac funkcji ob_stat aby to jakos rozwiazac questionmark.gifquestionmark.gif?

Prosze o pomoc.
dob
Da się - na samym początku pliku w którym a masz swój kod wpisz:

Kod
<? ob_start(); ?>



//tutaj Twój kod


a na samym końcu pliku wpisz linijkę
Kod
<? ob_end_flush(); ?>


No i powinno działać
wirtus
a jesli nie zadziala to pamietaj, ze setcookie cze header musze byc zqwsze na samym pocztku i przed nimi nie moze bnyc zadnego print, echo albo po prostu kodu html, ktory powoduje pojawienie sie na stronie jakiejs informacji.
stal-sw
Ok. Dzieki. W tej chwili nie mam juz bledu ale niestety nie chce zaczac pobierania pliku - a tylko pojawia sie pusty ekran.
Pole "nazwa" zawiera nazwe plkiu z roszerzeniem (u mnie rar).

[php:1:ebd79dbe6f]<?php
function getit($idp) {
ob_start();
require('config.php');
$query = "SELECT nazwa FROM pliki WHERE idp='$idp'";
$wynik = mysql_query($query);
$row = mysql_fetch_array($wynik);
Header("Location: http://localhost/pliki/".$row['nazwa']);


$query = "UPDATE ".$DBprefix."pliki SET ilosc_pobran=ilosc_pobran+1 WHERE id='$id'";
$wynik = mysql_query($query);
ob_end_clean();
exit();
}
?>[/php:1:ebd79dbe6f]
dob
[php:1:82f8fb226a]
<?php ob_start(); ?>
<?php
function getit($idp) {
require('config.php');
$query = "SELECT nazwa FROM pliki WHERE idp='$idp'";
$wynik = mysql_query($query);
$row = mysql_fetch_array($wynik);
Header("Location: http://localhost/pliki/".$row['nazwa']);


$query = "UPDATE ".$DBprefix."pliki SET ilosc_pobran=ilosc_pobran+1 WHERE id='$id'";
$wynik = mysql_query($query);
exit();
}
?>
<? ob_end_flush(); ?>
[/php:1:82f8fb226a]

Zobacz takie coś..moze zadziała
stal-sw
Niestety jak zrobie tak jak powyzej to znow pojawia sie blad: Cannot add header.

Ogolna struktura tego skryptu przedstawia sie nast:

Kod
kod HTML

<? (kod php)

i tutaj wszystkie funkcje a w tym funkcja getit

?>
DeyV
Jeszcze raz - przed funkcjami typu header nie mogą zostać wysłąne do użytkownika żadne dane, nawet spacje.
Po to właśnie jest ob_stat() - należy go wywałoć na samym poczatku strony - przed wszystkimi tagami HTML'a
dob
czyli ma to wygladac tak:
[php:1:b57bd0714e]<?php ob_start(); ?>
kod HTML
<? (kod php)
i tutaj wszystkie funkcje a w tym funkcja getit
?>
<?php ob_end_flush(); ?>

[/php:1:b57bd0714e]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.