[php] download counter

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Ik heb zelf een downloadsysteem gemaakt, en dat werkt allemaal prima, alleen de download counter werkt te goed 8)7 Het script verhoogt de counter namelijk ook als er op cancel wordt gedrukt, en dat is niet de bedoeling.

Ik heb geprobeerd de query pas na de output van de file uit te voeren, maar zonder resultaat. Hieronder een flink ingekort stukje zonder error-checking die normaal wel aanwezig is. Het script werkt verder dus zonder problemen :)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//
// Update download counter(s)
$dayofweek = strtolower(date('D'));
$sql = 'UPDATE enz...';
$db->sql_query($sql);

//
// Open the filestream and output it to the user
$fp = fopen($file_url, 'rb');

header("Pragma: no-cache");
header("Content-Type: application/octet-stream; name=\"$file_name\"");
header("Content-disposition: attachment; filename=$file_name");

fpassthru($fp);

exit;
Is er een manier om dit zo te krijgen dat gecancelde downloads niet worden geteld?

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

Verwijderd

nee volgens mij niet... of je moet even een popup op de pagina bouwen die na 10 seconden opent en dan de download counter verhoogt.

Acties:
  • 0 Henk 'm!

Verwijderd

Kun je niet de download counter pas met 1 laten verhogen zodra de file succesvol is gedownload? (Heb nie veel verstand van PHP probeer een beetje logisch mee te denken :) )

Acties:
  • 0 Henk 'm!

  • TheDuke
  • Registratie: Juni 1999
  • Niet online
nee, live with it

[ Voor 72% gewijzigd door TheDuke op 09-08-2003 10:58 ]


Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Dat is dus wat ik probeer te bereiken Mr_Hiney ;)

Een popup is voor mij geen optie, omdat ik de bezoekers niet lastig wil vallen met een popup alleen maar om die download counter iets nauwkeuriger te krijgen. Niemand zal er slechter van worden als gecancelde downloads ook worden meegeteld, maar als het tegen te gaan is op simpele manier zou dat leuk zijn.

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Sheesh, bedenken/proberen mensen helemaal niets meer zelf tegenwoordig?!

Je zou op z'n minst kunnen proberen je counter update code (die SQL query neem ik aan?) achter fpassthru te zetten (al dan niet voorafgegaan door een flush()). Grote kans dat als de download afgebroken wordt, het script dan wordt beeindigd voor de query uitgevoerd is.

Acties:
  • 0 Henk 'm!

  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 12-09 09:30
kan je niet kijken of heel het bestand verstuurd is?

zoiets:
PHP:
1
2
3
if (feof($fp)) {
  $db->sql_query($sql);
}


dit natuurlijk aan het einde van je script (of in ieder geval na het uploaden van het bestand :))

Acties:
  • 0 Henk 'm!

  • E-Vix
  • Registratie: Juni 2000
  • Laatst online: 14:25

E-Vix

Nu met sneeuw!

De meeste functies geven een returnwaarde als ze succesvol zijn uitgevoerd. Je zou het volgende kunnen proberen :
PHP:
1
2
3
4
   if (fpassthru($fp)) {
      $sql = 'UPDATE enz...'; 
      $db->sql_query($sql); 
   }

Failed opening '/home/users/7942/signature.inc' for inclusion (include_path='.:') in /home/www/got/userstats.php on line 25


Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Soultaker schreef op 09 augustus 2003 @ 11:06:
Sheesh, bedenken/proberen mensen helemaal niets meer zelf tegenwoordig?!
TheDark schreef op 09 augustus 2003 @ 10:49:
Ik heb geprobeerd de query pas na de output van de file uit te voeren, maar zonder resultaat.
Je had natuurlijk ook even mijn post helemaal kunnen lezen :/ Ik zal eens kijken naar die returnwaarde

[ Voor 15% gewijzigd door MichelVH op 09-08-2003 11:37 ]

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

TheDark schreef op 09 August 2003 @ 11:36:
[...]

[...]
Je had natuurlijk ook even mijn post helemaal kunnen lezen :/ Ik zal eens kijken naar die returnwaarde
Zal ik je even helpen dan ;)
Als er een fout optreedt, geeft fpassthru() FALSE terug. Anders geeft fpassthru() het aantal tekens terug, dat gelezen is van handle en die doorgegeven zijn aan de output.
Moet dus wel lukken :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Ja hoor, wat ik zelf dus al geprobeerd had werkte prima, alleen niet met de kleine testfiles die ik gebruikte 8)7 De files die ik al erin had zitten waren niet groter dan een paar KB, net geprobeerd met een file van 750 KB en die werd niet geteld met die query ná de fpassthru B)

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
TheDark schreef op 09 augustus 2003 @ 12:01:
Ja hoor, wat ik zelf dus al geprobeerd had werkte prima, alleen niet met de kleine testfiles die ik gebruikte 8)7 De files die ik al erin had zitten waren niet groter dan een paar KB, net geprobeerd met een file van 750 KB en die werd niet geteld met die query ná de fpassthru B)
Dan was de maximale executie-tijd verlopen. Die is standaard 30 seconden, dus als een download langer duurt, krijg je wel de hele file binnen, maar wordt de query inderdaad niet uitgevoerd. Om de maximale executie-tijd te verhogen, kun je gebruik maken van set_time_limit().

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
TheDark schreef op 09 augustus 2003 @ 11:36:
Je had natuurlijk ook even mijn post helemaal kunnen lezen :/
Vermeldt dan zinnige resultaten! Je zegt inderdaad dat je al geprobeerd hebt de code eronder te plaatsen, maar "geen resultaat" doet mij vermoeden dat je met watjes in je oren geblinddoekt op knoppen hebt zitten drukken, en daarom niets van het resultaat mee hebt gekregen.

Je had inderdaad een goed idee bedacht en uitgeprobeerd, daar had ik overheen gelezen en mijn reactie was dus niet helemaal terecht, maar dat neemt niet weg dat je dan tenminste je werkwijze en resultaten kunt beschrijven, zodat ik ook begrijp wat er mis ging!

Fijn dat je vervolgens m'n hele reactie aan de kant schuift en daarna zelf doodleuk met de conclusie komt dat ik helemaal gelijk had:
TheDark schreef op 09 August 2003 @ 12:01:Ja hoor, wat ik zelf dus al geprobeerd had werkte prima, alleen niet met de kleine testfiles die ik gebruikte 8)7 De files die ik al erin had zitten waren niet groter dan een paar KB, net geprobeerd met een file van 750 KB en die werd niet geteld met die query ná de fpassthru B)
En als je mijn post nou eens echt goed zou lezen, zou je zien dat ik ook suggereer om flush te gebruiken. Een groot bestand blokkeert de output buffers van PHP/de webserver namelijk, maar een klein bestand niet. De kans is groot dat je met flush kunt wachten tot de output buffers echt leeg zijn (al betekent dat nog niet dat de client ze heeft ontvangen). Dan nog moet je trouwens nog wel heel snel klikken om binnen een paar kilobyte op cancel te drukken.

Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Soultaker schreef op 09 August 2003 @ 12:36:
[...]
Vermeldt dan zinnige resultaten! Je zegt inderdaad dat je al geprobeerd hebt de code eronder te plaatsen, maar "geen resultaat" doet mij vermoeden dat je met watjes in je oren geblinddoekt op knoppen hebt zitten drukken, en daarom niets van het resultaat mee hebt gekregen.

Je had inderdaad een goed idee bedacht en uitgeprobeerd, daar had ik overheen gelezen en mijn reactie was dus niet helemaal terecht, maar dat neemt niet weg dat je dan tenminste je werkwijze en resultaten kunt beschrijven, zodat ik ook begrijp wat er mis ging!
Als er nou twee mogelijkheden zijn waarvan ik de ene wil hebben maar de andere krijg, dan lijkt het me duidelijk wat er gebeurt als een mogelijke oplossing "geen resultaat" oplevert ;)
Fijn dat je vervolgens m'n hele reactie aan de kant schuift en daarna zelf doodleuk met de conclusie komt dat ik helemaal gelijk had:
Als ik aan iets een hekel heb is het aan het negeren van reacties, dus dat zal ik zelf zeker niet doen. Omdat ik het nut van die toevoeging niet zag (er werd al een bestand verstuurd), heb ik eerst de andere oplossingen geprobeerd, wat ik dus in mijn post heb gezegd. Daarna heb ik het nog een keer geprobeerd met een groter bestand, en dat gaf dus wel het gewenste resultaat.

Aangezien het probleem nu naar wens opgelost is, lijkt het me verstandig om de vredespijp te roken en andere hulpbehoevende mensen te gaan helpen :7

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

  • cybermans
  • Registratie: Maart 2001
  • Laatst online: 17-09 09:56
ehm met firebird en mozilla weet ik dattie al een heel eind is als ik op save druk. Dus in hoeverre verpest dit je systeem?

Strava | Runkeeper | Endomondo (mijn leikr uploads)


Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Internet Explorer heeft hetzelfde, en ik kan er eigenlijk niet echt mee zitten :) Voor de grotere bestanden is het systeem nu nauwkeuriger, voor de kleine niet, jammer dan.

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

TheDark schreef op 09 August 2003 @ 12:01:
Ja hoor, wat ik zelf dus al geprobeerd had werkte prima, alleen niet met de kleine testfiles die ik gebruikte 8)7 De files die ik al erin had zitten waren niet groter dan een paar KB, net geprobeerd met een file van 750 KB en die werd niet geteld met die query ná de fpassthru B)
Voor het archief dan even de hele code?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
* bigtree dodges the flames

TheDark; waarom heb ik het idee dat je mijn reactie negeert? :P

Het hele flush-gedoe heeft allemaal geen zin. Mark my words: als een download langer duurt dan de maximale executie-tijd, wordt die query na de fpassthru niet meer uitgevoerd. Of je nou ob_flush() gebruikt of niet.

De oplossing van je probleem zit hem dus in set_time_limit().

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Lijkt me duidelijk, maar hier komt ie (als toetje met extra error-checking :P):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//
// Update download counter(s)
$sql = "UPDATE tabel SET counter=counter+1 WHERE file_id=$file_id"; //pseudo code
    
//
// Open the filestream and output it to the user
if( !$fp = fopen($file_url, 'rb') )
{
    message_die(GENERAL_ERROR, sprintf($lang['File_download_error'], '<a href="' . append_sid(SITE_ROOT_PATH . 'forum/viewforum/10') . '">', '</a>'));
}
    
header("Pragma: no-cache");
header("Content-Type: application/octet-stream; name=\"$file_name\"");
header("Content-disposition: attachment; filename=$file_name");
header("Content-length: " . $file['file_size']);
    
fpassthru($fp);

$db->sql_query($sql);

exit;

@ bigtree: het bestand wordt keurig gedownload, dat was het probleem niet. Ik wilde niet dat de counter werd verhoogd als de download geannuleerd werd door de gebruiker :)

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
TheDark schreef op 09 August 2003 @ 13:29:
@ bigtree: het bestand wordt keurig gedownload, dat was het probleem niet. Ik wilde niet dat de counter werd verhoogd als de download geannuleerd werd door de gebruiker :)
Ok, maar volgens mij is het nog niet duidelijk wat ik bedoelde te zeggen. Weliswaar wordt de teller nu niet opgehoogd als de download wordt afgebroken... werkt prima. Maar de teller wordt OOK NIET opgehoogd als de download langer duurt dan 30 seconden. En dat zal toch wel eens gebeuren denk ik?

Le-zen.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 13:28
In ASP bestaat zoiets als IsClientConnected. Daarmee controleer je in pagina's die veel bewerkingstijd vragen, of de gebruiker nog wel verbonden is met de server (m.a.w. niet op de stopknop heeft gedrukt). Ditzeflde geldt ook voor downloads. Je kunt deze controle dus aan het einde van het script uitvoeren, voordat je de counter verhoogt. Ik weet bijna zeker dat zoiets ook onder PHP bestaat, maar ik weet de naam even niet. Zoeken dus.

Ik heb 'm al gevonden: connection_aborted().

[ Voor 13% gewijzigd door mjax op 09-08-2003 13:41 ]


Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Jawel, want die set_time_limit had ik al gedaan (ook niet gezegd, 'k ben weer lekker bezig)

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
* bigtree joins Soultaker

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.

Pagina: 1