Webprofis is een Forum waarin je vragen kunt stellen die webgerelateerd zijn. Heb je vragen over of problemen met je Webpagina, HTML, CSS, Javascript, PHP of andere client of serverside scriptingtalen? Stel ze dan gerust op dit forum. Op dit forum zijn een aantal vrijwilligers actief die u graag met uw vragen willen helpen en u waar mogelijk een passend antwoord aanbieden. Hebt u zelf veel ervaring en kennis met betrekking tot het bovenstaande? U bent van harte welkom om uw kennis met anderen te delen!

We hopen dat eenieder op dit Forum een leerzame ervaring mag opdoen.

Team Webprofis

php Downloadteller

bewerkt di 12 mei 2015 in Tutorials (Develop) Posts: 879
Een simpele downloadteller die het aantal keren telt dat een bestand gedwonload is. Hierbij worden de counts opgeslagen in text bestanden ipv database.
Als eerste maken we een map aan waarin de downloads staan met de text bestanden waarin het aantal bijgehouden wordt. Voor het gemak noemen we deze map downloads
In deze map zetten we een betand download.php met daarin:

<?php

// ophalen bestandsnaam
$Down=$_GET['Down'];

// bestandsnaam met .txt extensie
$filePath = $Down.".txt";

// Als bestand bestaat: lees het aantal, anders waarde 0 toekennen
$count = file_exists($filePath) ? file_get_contents($filePath) : 0;

// Tel 1 erbij op en overschrijf de oude waarde
file_put_contents($filePath, ++$count);

// redirect naar pagina waar de links staan
header('Content-Disposition: attachment; filename="'.$Down.'"');

?>
Buiten deze map maken we een bestand aan waarin de links komen, bijv. link.php met daarin:

<?php
// textbestanden toekennen aan $textfile
$textfile = array(
'downloads/a.zip.txt',
'downloads/b.zip.txt',
'downloads/c.zip.txt'
);
// loop over de array
foreach (array_keys($textfile) as $value) {
?>
<!-- we creeren de link; we gebruiken de namen uit de array en strippen die tot er staat bijv. a.zip, b.zip etc... -->
<!-- bijv: a href="downloads/download.php?Down=a.zip" -->
<a href="downloads/download.php?Down=<?php echo substr($textfile[$value], 10, -4);?>"><br />Download <?php echo substr($textfile[$value], 10, -4);?></a>

<?php
// als txt bestand bestaat
if(file_exists($textfile[$value]))
{
// terug uitlezen en echo inhoud textbestand
$f = fopen($textfile[$value], "r");
echo ' Downloads: '.fgets($f);
fclose($f);
}
} // eind foreach

?>
DEMO

Feedback welkom!

Reacties

  • bewerkt di 12 mei 2015
    PMPosts: 415
    Beetje onhandig dat je zelf bestanden moet toevoegen aan de linklijst?

    <?php
    if ($handle = opendir('.'))
    {
    while (false !== ($entry = readdir($handle)))
    {
    if ($entry != "." && $entry != ".." && $entry != basename(__FILE__) && !is_dir($entry)) //alle directories en dit bestand verwijderen uit de lijst
    {
    ?>
    <a href="download.php?file=<?php echo $entry;?>"><?php echo $entry;?></a><!--downloads ophalen..--><br>
    <?php
    }
    }
    closedir($handle);
    }
    Verder is koppelen aan een db veel veiliger en sneller, zo hoef je niet per file op zoek naar een txt bestand en daarui de waarden te halen, je voorkomt een directory met per download ook nog eens een txt bestand etc..


    Verder is download.php niet echt veilig
    Er staan misschien nog meer files in die dir die ik maakte, maar dan was ik de naam vergeten :D
    nuet
  • PMPosts: 879
    @vinTage ik snap wat je bedoelt; je kunt een textbestand aanmaken met: http://webprofis.nl/demo/vd/1/php-scripten/downloadteller/downloads/download.php?Down=nuetwashere.zip in de url. Ff kijken wat je hierboven gemaakt hebt...
  • bewerkt di 12 mei 2015
    PMPosts: 415
    ja, ik weet dat dat gaat, ik wilde alleen niet keihard roepen hoe ik het deed :p
    Er zijn waarschijnlijk meer lezers die er wel iets ergers mee doen ^^
  • bewerkt di 12 mei 2015
    PMPosts: 879
    Die files uitlezen ipv array opstellen is idd efficient. Maar ik weet ff niet hoe ik dan met die foreach aan de slag moet. FF hardop denken: ik moet alle files die in de map downloads staan muv de txt files aan een variable koppelen (normaal gesproken de array). Dan .txt bestanden die bij de files horen moeten de $value zijn.
  • bewerkt wo 13 mei 2015
    PMPosts: 415
    Die foreach bestaat niet in mijn voorbeeld.
    Je zult daar (als je op deze manier wilt blijven werken...?) een request per entry moeten doen. (zie de html comments)
    Hoe je die files filtert uit de lijst die nu automatisch gemaakt wordt....dunnow, maak een rule die past in regel 6 van het voorbeeldje...

    Maar nogmaals...txt files i.p.v database....Niet de slimste oplossing.
Login of Registreer om te reageren.