Avatar billede celfa Nybegynder
15. februar 2008 - 01:00 Der er 18 kommentarer og
1 løsning

Redirect virker ikke.

<?php echo"<?xml version='1.0' encoding='ISO-8859-15'?>";?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1//EN'
        'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='da'>
<head>
    <title>Min side</title>
    <?php $id = $_GET['id'];
          $url = $_GET['url'];
    echo"<meta http-equiv='refresh' content='0;url=http://$url'>";?>
</head>

<body>
<?php
       

        $fp = fopen('counters/'.$id.'.txt', 'r') or die('fejl');
          $laest = fgets($fp, 1024); 
          fclose($fp);
       
        $fp = fopen('counters/'.$id.'.txt', 'w') or die ('fejl');   
        $laest +=1;
        fwrite($fp,$laest);
        fclose($fp);

?>       
</body>
</html>

Den redirecter ikke.
Jeg prøvede med $url = $_SERVER['HTTP_REFERER']; Så redirecter den, men man kan ikke nå at downloade filen.

Nogen der har en løsning?
Avatar billede thesurfer Nybegynder
15. februar 2008 - 01:11 #1
Hvorfor ikke bruger PHP's header hvis du vil redirecte?

Eksempel: header('Location: http://www.dinadresse.dk');

Manual: http://dk.php.net/header

Hvis du vil gøre noget (læse/skrive counters-filen) skal du gøre det INDEN du afvikler headeren.. og så er det en god ide, at stoppe udskrivningen/afvikling, ved at bruge:

exit;

Manual: http://dk2.php.net/exit
Avatar billede celfa Nybegynder
15. februar 2008 - 01:21 #2
og hvordan afvikler jeg det inden headeren?

Men det begynder at give mening :)
Avatar billede celfa Nybegynder
15. februar 2008 - 01:24 #3
Problemet er jo at det ikke er særlig dynamisk? Så skal jeg lave en fil manuelt per side.

Eller kan man skrive
header('Location: ".$url."'); ?
Avatar billede thesurfer Nybegynder
15. februar 2008 - 01:27 #4
Hvis det eneste siden skal gøre, er at lægge 1 til, skal du overhovedet ikke bruge HTML kode, men kun PHP..

Eksempel
<?php
$id = $_GET['id'];
$url = $_GET['url'];

$fp = fopen('counters/'.$id.'.txt', 'r') or die('fejl');
$laest = fgets($fp, 1024); 
fclose($fp);

$fp = fopen('counters/'.$id.'.txt', 'w') or die ('fejl');   
$laest +=1;
fwrite($fp,$laest);
fclose($fp);

header('Location: $url');
exit();
?>


Jeg kan aldrig huske hvordan man forbinder variabler med strenge..

Det kan f.eks. en af disse to (eller en helt tredje):

header('Location: $url');
header('Location: ' . $url);
Avatar billede thesurfer Nybegynder
15. februar 2008 - 01:28 #5
..og så vidt jeg ved:

1) XHTML er nærmest ubrugeligt i øjeblikket, så du kan nøjes med HTML 4.01 Strict (det der kommer tættest på)..

2) Linien "<?xml version='1.0' encoding='ISO-8859-15'?>" får Internet Explorer til at gå amok og virke forkert, så den skal vist også fjernes..
Avatar billede celfa Nybegynder
15. februar 2008 - 01:30 #6
Tusinde tak.. Hvordan giver jeg dig point?
Avatar billede thesurfer Nybegynder
15. februar 2008 - 01:31 #7
Jeg smider et svar.. du markerer mit navn i boksen til venstre, og derefter klikker på Accepter-knappen.. :-)
Avatar billede thesurfer Nybegynder
15. februar 2008 - 01:34 #8
Jeg kommer faktisk lige i tanke om noget..

Hvis der opstår en fejl (enten ved læsning eller ved skrivning), vil den udskrive fejlbeskrivelsen.. Det gør at header-linien også vil give en fejl, da man ikke må udskrive noget før header-linien.

Jeg ser lige om jeg kan finde ud om fejlhåndtering i PHP..

Takker for points.. :-)
Avatar billede celfa Nybegynder
15. februar 2008 - 01:38 #9
Jeg endte med den her kode:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
    <title>Logger</title>
    <!--De to linier herunder skal ligger i headeren -->
    <?php $id = $_GET['id'];
          $url = $_GET['url'];
          header("Location: http://$url");?>
</head>

<body>
<?php

        $fp = fopen('counters/'.$id.'.txt', 'r') or die('fejl');
          $laest = fgets($fp, 1024); 
          fclose($fp);
       
        $fp = fopen('counters/'.$id.'.txt', 'w') or die ('fejl');   
        $laest +=1;
        fwrite($fp,$laest);
        fclose($fp);

?>       
</body>
</html>

Eneste problem er at man manuelt skal trykke F5/opdatere for at se den stige 1.
Avatar billede thesurfer Nybegynder
15. februar 2008 - 01:39 #10
Får du ikke en fejl i linien?:

header("Location: http://$url");


Hvad er det egentligt du prøver på..? :-)
Brug mange ord til at forklare det..
Avatar billede celfa Nybegynder
15. februar 2008 - 01:46 #11
Nej får ingen fejl :) Eller har ikek fejl haløj på.

Jeg ville lave en counter der tæller hvor mange gange folk har klikket på et link. I dette tilfælde er linket en zip fil. Så kan man se hvor mange gange filen er blevet hentet.

Kan man undgå selv at skulle F5/opdatere ?
Avatar billede thesurfer Nybegynder
15. februar 2008 - 01:55 #12
Hvis filen f.eks. er en ZIP fil, og browseren er indstilling til at downloade filen (fordi ZIP filer er binære filer), vil en redirect automatisk få browseren til at begynde at downloade filen.. siden skifter altså ikke..

Ser lige om jeg kan finde noget PHP kode..
Avatar billede thesurfer Nybegynder
15. februar 2008 - 01:58 #13
Her er et ligende script ( http://www.opendesigns.org/forum/discussion/1437/php-download-counter/ ):


<?php
$download_dir = 'downloads'; // the folder where the files are stored ('.' if this script is in the same folder)
$counter_dir = 'counters'; // the folder where your counter files are stored
/*
Save this script as download.php
each file to download must have a .txt-file called like "filename.ext.txt" in the 'counters' folder -
call the counter e.g. like this: <? include("counters/filename.pdf.txt"); ?>
download the file [download.php?get=name_of_file]
*/
$path = $download_dir.'/'.$HTTP_GET_VARS['get'];
if(file_exists($path))
{
$file = fopen($counter_dir.'/'.$HTTP_GET_VARS['get'].'.txt','r+');
$count = fread($file,100);
fclose($file); // closes file
$count++;
$file = fopen($counter_dir.'/'.$HTTP_GET_VARS['get'].'.txt','w'); // opens file again with 'w'-parameter
fwrite($file, $count);
fclose($file);
$size = filesize($path);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$HTTP_GET_VARS['get']);
header('Content-Length: '.$size);
readfile($path);
}else{
echo "<font face=$textfont size=2>";
echo "<center><br /><br />The file [<b>$get$extension</b>] is not available for download.<br />";
echo "Please contact the web administrator <a href='http://www.yoursite.com</a>here";
}
?>
Avatar billede thesurfer Nybegynder
15. februar 2008 - 02:03 #14
Jeg har sat koden lidt pænere op.. umiddelbart ser det ud til at være netop den kode du har brug for..


<?php
$download_dir = 'downloads'; // the folder where the files are stored ('.' if this script is in the same folder)
$counter_dir = 'counters'; // the folder where your counter files are stored

/*
Save this script as download.php
each file to download must have a .txt-file called like "filename.ext.txt" in the 'counters' folder -
call the counter e.g. like this: <? include("counters/filename.pdf.txt"); ?>
download the file [download.php?get=name_of_file]
*/

$path = $download_dir.'/'.$HTTP_GET_VARS['get'];

if(file_exists($path))
{

    $file = fopen($counter_dir.'/'.$HTTP_GET_VARS['get'].'.txt','r+');
    $count = fread($file,100);
    fclose($file); // closes file
    $count++;

    $file = fopen($counter_dir.'/'.$HTTP_GET_VARS['get'].'.txt','w'); // opens file again with 'w'-parameter
    fwrite($file, $count);
    fclose($file);

    $size = filesize($path);
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$HTTP_GET_VARS['get']);
    header('Content-Length: '.$size);
    readfile($path);

} else {

    echo "<font face=$textfont size=2>";
    echo "<center><br /><br />The file [<b>$get$extension</b>] is not available for download.<br />";
    echo "Please contact the web administrator <a href='http://www.yoursite.com</a>here";

}
?>
Avatar billede showsource Seniormester
15. februar 2008 - 04:59 #15
$HTTP_GET_VARS['get'];
kunne jo så være "../../connect.php", f.eks.

Brug basename()
$path = $download_dir.'/'.basename($HTTP_GET_VARS['get']);

og is_file() i stedet for file_exists(), da den også kikker på dirnavne.

Og så ville jeg bruge file_get_contents() til at læse indhold af counter.

Og .....
brug GET['get'] i stedet for HTTP_GET_VARS['get'] medmindre selvf. siden ligger på en server med en ældgammel php version.
Avatar billede thesurfer Nybegynder
16. februar 2008 - 19:37 #16
En masse gode råd.. lækkert :-)
Avatar billede Slettet bruger
26. maj 2010 - 09:45 #17
Super script.
Hvad gør den hvis filen ikke er binær - et billede f.eks.
- vil header-info'en override browserens standard-behandling af en kendt filtype ?
Avatar billede Slettet bruger
26. maj 2010 - 09:49 #18
Hov, dér var jeg lige 2 år for sent ude..
- eller var jeg ?
Avatar billede Slettet bruger
26. maj 2010 - 10:03 #19
Nå, jeg svarer lige selv: JA!
- Fra http://dk.php.net/manual/en/function.readfile.php


<?php
$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester