Avatar billede jps2mt Nybegynder
13. januar 2004 - 14:28 Der er 5 kommentarer og
1 løsning

Tillad kun download fra x antal klienter af gangen

Hvordan kan dette lade sig gøre??

Jeg kan godt få mit script til at opdatere en database med +1 før download begynder og -1 efter download er færdigt, men hvad nu hvis brugeren annullerer download undervejs, hvordan får man den så til at tælle en klient fra??

Scriptet ser pt. således ud, der er endnu ikke tilføjet kode til at tælle op og ned ved download, men så er der da lidt at gå ud fra :)

<?
$conn = mysql_connect("xxx", "xxx", "xxx");
mysql_select_db("xxx");

$result = mysql_query("SELECT NumDL FROM download WHERE (Filnavn='".$_original."')") or die(mysql_error());
$row = mysql_fetch_array($result);
$_NumDL = $row[NumDL];
$_NumDL++;

mysql_query("UPDATE download SET NumDL='$_NumDL' WHERE (Filnavn='".$_original."')") or die(mysql_error());

// Opdater database med +1 her!

header("Content-Disposition: attachment; filename=$_original");
header("Content-Type: application/octet-stream");
header("Content-Length: ".filesize("/home/otk-member/$_original"));
header("Pragma: no-cache");
header("Expires: 0");

$fp = @fopen("/home/otk-member/$_original", "r");
print fread($fp, filesize("/home/otk-member/$_original"));
fclose($fp);

// Opdater database med -1 her!
?>

(Points tildeles når Exp har regenereret points)
Avatar billede pgm Nybegynder
13. januar 2004 - 17:58 #1
timeout tid?

når du opdatere databasen så sæt en time() og læg så tiden til som evt. et 56k modem ville tage om at hente filen?
Avatar billede tefcke Nybegynder
13. januar 2004 - 18:15 #2
Optimerings forslag:
$result = mysql_query("SELECT NumDL FROM download WHERE (Filnavn='".$_original."')") or die(mysql_error());
$row = mysql_fetch_array($result);
$_NumDL = $row[NumDL];
$_NumDL++;

mysql_query("UPDATE download SET NumDL='$_NumDL' WHERE (Filnavn='".$_original."')") or die(mysql_error());

Kan erstattes med 1 database forspørgelse:
mysql_query("UPDATE download SET NumDL=NumDL+1 WHERE (Filnavn='$_original')") or die(mysql_error());
Avatar billede jps2mt Nybegynder
13. januar 2004 - 18:17 #3
Det var måske en måde at gøre det på...

Nogle der kan henvise til et sted hvor man kan se gennemsnits hastigheder for modem forbindelser, eller max. forbindelser...

Jeg VED nemlig at der er 56k brugere der henter fra siden, og de skulle jo helst have deres dl-færdig, inden den lukker nye ind...
Avatar billede jps2mt Nybegynder
13. januar 2004 - 18:18 #4
tefcke > 'k...Det havde jeg faktisk aldrig forsøgt, havde da godt overvejet om man ikke kunne nogeet i den stil, men da jeg lavede det (som jeg har kopieret noget fra) var jeg lidt i tidsnød, så jeg tog den sikre metode :D
Avatar billede jps2mt Nybegynder
13. januar 2004 - 21:22 #5
pgm > Det virker fortræffeligt... :)
Avatar billede tefcke Nybegynder
14. januar 2004 - 10:21 #6
jps2mt >> Det er nok mere den usikre metode du har valgt.
Forstil dig en bruger går ind på siden. I mens brugeren er mellem de to sql sætninger:
$result = mysql_query("SELECT NumDL FROM download WHERE (Filnavn='".$_original."')") or die(mysql_error());
og
mysql_query("UPDATE download SET NumDL='$_NumDL' WHERE (Filnavn='".$_original."')") or die(mysql_error());
kommer der en anden bruger ind og udfører de selv samme to mysql sætninger.
Da vil der blive inkonsistens i databasen!

Den første bruger hiver måske 3 ud, inden han får opdateret det til 4 og indsat det igen, kommer der som sagt en anden bruger, hiver ligeledes 3 ud(skulle have været 4), og indsætter 4 (skulle have været 5). Nu indsætter den første bruger ligeledes 4 i databasen. Bang, så gik det galt.
Konklusion, lav altid opdateringer i en forspørgelse, så undgår du problemet med forældet data!
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