Спецы по PHP, объясните, почему так происходит?

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#1
Люди, расскажите, чего я не понимаю в этой жизни?
Делаю скрипт для скачивания файлов с моего сайта с указанием количества раз скачивания:
файл download.php
Код:
<?
$datafile="./download.dat";
$goodlink=0;
function show_count($idd){
global $datafile;
$db=file($datafile);
foreach ($db as $dbd){
list($fileid,$count,$url, $filename)=split("\|", $dbd);
if ($fileid == $idd){
$have=1;
break;
}
}
if (isset($have)){echo $count;}
}
function plusdown($idd){
global $datafile;
global $goodlink;
if (isset($idd)){
$x=0;
$db=file($datafile);
foreach ($db as $dbd){
list($fileid,$count,$url, $filename)=split("\|", $dbd);
if ($fileid==$idd){
$have=1;
break;
}
$x++;
}

if (!isset($have)){
$goodlink=0;
exit;
}

if (!is_file($url)){
$goodlink=0;
exit;
}
$count++;
$db[$x]=$fileid."|".$count."|".$url."|".$filename;
$fp=fopen ($datafile,"w");
fwrite($fp,implode($db,""));
fclose ($fp);
$goodlink=1;
}
}
if ($id!=0){
plusdown($id);
if ($goodlink=1){
Header("Location: download.php?id=0&idf=$id");
}
}
else if (isset($idf)){
Header("Location: action.php?id=$idf"); //проблемная строка
}
?>
<br><a href="download.php?id=1">Скачать</a>
(<b>скачиваний:
<?
show_count(1);
?> </b>)
Файл action.php
Код:
<?
$datafile="./download.dat";
if (isset($id)){
$x=0;
$db=file($datafile);
foreach ($db as $dbd){
list($fileid,$count,$url, $filename)=split("\|", $dbd);
if ($fileid==$id){
$have=1;
break;
}
$x++;
}
header("Content-disposition: filename=".$filename);
header("Content-type: application/octetstream");
header("Pragma: no-cache");
Header("Expires: 0");
Header("Cache-Control: no-cache, must-revalidate");
Header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT");
readfile($url);
}
?>
Далее...
Ссылка на раздел скачиваний:
<a href="download.php?id=0">Файлы</a>
все проходит нормально.
А теперь, внимание! Если комментируем проблемную строку, то скачивания не происходит (ессно), но страница закачек обновляется, т.е. перегружается с обновленным количеством скачиваний. Если проблемную строку разкомментировать, то файл скачивается, но обновления страницы закачек не происходит. Почему?
 

admin

Well-Known Member
08.08.2003
2 754
1
#2
vitfil
потому что если header передан уже после того как браузеру пошли какие-то данные - он не выполнится.
с функцией header надо работать осторожно. если ты перед ней например напишешь echo "hello world";, то уже она не передастся.