Avatar billede dotcom1 Nybegynder
04. august 2005 - 10:50 Der er 10 kommentarer og
1 løsning

Indsætte funktion i script

Hej.

Jeg bruger med fornøjelse dette script, der fungerer som force download, samt tæller antal downloads. Det fungerer fint.

Scriptet:

<?php
### Force download script. Save as downloads.php
### Link like this: http://www.site.dk/downloads.php?file=doc.pdf
### Create MySQL table query
/*
CREATE TABLE `downloads` (
  `ID` tinyint(4) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL default '0',
  `titel` text NOT NULL,
  `kategori` varchar(255) NOT NULL default '0',
  `downloads` int(4) NOT NULL default '0',
  `date` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`ID`)
) TYPE=MyISAM AUTO_INCREMENT=20 ;
*/
### config variables.
$config=array();
$config['email'] = 'min@e-mail.dk';
$config['host'] = 'localhost';
$config['database'] = '*****';
$config['login'] = '*****';
$config['password'] = '*****';
$config['file_path']=$_SERVER['DOCUMENT_ROOT'].'/minMappe';//No Trailing Slash!
$config['allowed_files']=array('doc','txt','pdf','zip','wmv','mpeg','jpg');
$config['PHP_SELF']='http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

### Connect To Database
$conn=mysql_connect($config['host'], $config['login'], $config['password']) OR error('MySQL Connect Failed');
mysql_select_db($config['database'],$conn) OR error('MySQL Select DB Failed');

function download($path,$file)
{
    global $config;
    header("Expires: 0");
    header("Content-Transfer-Encoding: binary");
    header("Cache-Control: no-cache, must-revalidate");
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$file);
    header('Content-Length: '.filesize($path.'/'.$file));
    readfile($path.'/'.$file) OR error('Error Reading File');
}

function error($text)
{
    global $config;
    $out = '<p align="center" style="font:12pt Arial"><br><br><br>Fatal Error: <b>'.$text.'</b></p>'."\n";
    mail($config['email'],'File Download Error Report',$out,'From: errors@'.str_replace('www.','',$_SERVER['HTTP_HOST'])."\r\n".'Content-Type: text/html'."\r\n");
    exit($out);
}

$file=(isset($_GET['file']) && $_GET['file']!='') ? $_GET['file'] : null;

if($file)
{
    if(strpos($file,'..')!==false || strpos($file,'/')!==false) error('Access Denied ('.$file.')');
    if(!in_array(substr(strrchr($file,'.'),1),$config['allowed_files'])) error('You do not have access to this type of file! ('.$file.')');
    if(!is_file($config['file_path'].'/'.$file)) error('File "'.$file.'" is not avaliable!');
    $result=mysql_query("SELECT * FROM `downloads` WHERE name='$file'",$conn) OR error('MySQL Query Failed: '.mysql_error());
    $query=(mysql_num_rows($result) === 0) ? "INSERT INTO downloads (ID, name, downloads, date) Values ('', '$file', '1', '".date("Y-m-d H:i")."')" : "UPDATE downloads SET downloads = downloads+1 WHERE name='$file'";
    mysql_query($query,$conn);
    download($config['file_path'],$file);
    mysql_close($conn);
}

?>

På den side, hvor mine download-filer hentes fra, har jeg indtil videre haft følgende kodestump, som jeg egentlig gerne vil have integreret i ovenstående script, således at alt er samlet i ét script.

<?php include("test/downloads.php");
### Hent en fil ad gangen:
function makeDownloadLink($id){
$db = mysql_connect('localhost', '*****', '*****');
mysql_select_db('*****',$db);
$result = mysql_query("SELECT name, downloads FROM downloads WHERE ID='$id'",$db);
$result = mysql_fetch_row($result);
return $result;
}
?>

Det fungerer sådan set fint nok bare at flytte funktionen "makeDownloadLink()" ind i førstnævnte script, men ville gerne undgå at skulle connecte til databasen igen...hvordan skal funktionen se ud hvis den skal gøre brug af scriptets eksisterende databaseforbindelse?

Håber, det giver mening.
Mvh. :)
Avatar billede avminarm Juniormester
04. august 2005 - 10:57 #1
lav en ny funktion der hedder connect - så kan du bruge denne i hver af de to andre funktioner f.eks noget ala:

function connect(){
  $db = mysql_connect('localhost', '*****', '*****');
  mysql_select_db('*****',$db);
}

so kalder du bare funktionen inde i de andre funktioner hvor du skal bruge den
Avatar billede avminarm Juniormester
04. august 2005 - 10:59 #2
du kan også vælge at lægge db forbindelsen i en selvstændig fil f.eks. db.php og så include denne fil i toppen på de sider hvor den skal bruges
Avatar billede dotcom1 Nybegynder
04. august 2005 - 11:32 #3
Hej.

Kan ikke helt få det til at virke. I det store script er databaseoplysningerne en del af et array...så går det vel ikke at inkludere en fil med
function connect(){
  $db = mysql_connect('localhost', '*****', '*****');
  mysql_select_db('*****',$db);
}

Når jeg fjerner funktionen "makeDownloadLink()" fra min download-side virker scriptet ikke. Hvordan vil du foreslå at scriptet skal se ud i sin helhed? :)
Avatar billede avminarm Juniormester
04. august 2005 - 11:49 #4
prøv med en ny fil - sådan her:
<?php
### Force download script. Save as downloads.php
### Link like this: http://www.site.dk/downloads.php?file=doc.pdf
### Create MySQL table query
/*
CREATE TABLE `downloads` (
  `ID` tinyint(4) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL default '0',
  `titel` text NOT NULL,
  `kategori` varchar(255) NOT NULL default '0',
  `downloads` int(4) NOT NULL default '0',
  `date` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`ID`)
) TYPE=MyISAM AUTO_INCREMENT=20 ;
*/
include_once “db.php”;
### config variables.
$config=array();
$config['email'] = 'min@e-mail.dk';
$config['file_path']=$_SERVER['DOCUMENT_ROOT'].'/minMappe';//No Trailing Slash!
$config['allowed_files']=array('doc','txt','pdf','zip','wmv','mpeg','jpg');
$config['PHP_SELF']='http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

function download($path,$file)
{
    global $config;
    header("Expires: 0");
    header("Content-Transfer-Encoding: binary");
    header("Cache-Control: no-cache, must-revalidate");
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$file);
    header('Content-Length: '.filesize($path.'/'.$file));
    readfile($path.'/'.$file) OR error('Error Reading File');
}

function error($text)
{
    global $config;
    $out = '<p align="center" style="font:12pt Arial"><br><br><br>Fatal Error: <b>'.$text.'</b></p>'."\n";
    mail($config['email'],'File Download Error Report',$out,'From: errors@'.str_replace('www.','',$_SERVER['HTTP_HOST'])."\r\n".'Content-Type: text/html'."\r\n");
    exit($out);
}

$file=(isset($_GET['file']) && $_GET['file']!='') ? $_GET['file'] : null;

if($file)
{
    if(strpos($file,'..')!==false || strpos($file,'/')!==false) error('Access Denied ('.$file.')');
    if(!in_array(substr(strrchr($file,'.'),1),$config['allowed_files'])) error('You do not have access to this type of file! ('.$file.')');
    if(!is_file($config['file_path'].'/'.$file)) error('File "'.$file.'" is not avaliable!');
    $result=mysql_query("SELECT * FROM `downloads` WHERE name='$file'",$conn) OR error('MySQL Query Failed: '.mysql_error());
    $query=(mysql_num_rows($result) === 0) ? "INSERT INTO downloads (ID, name, downloads, date) Values ('', '$file', '1', '".date("Y-m-d H:i")."')" : "UPDATE downloads SET downloads = downloads+1 WHERE name='$file'";
    mysql_query($query,$conn);
    download($config['file_path'],$file);
    mysql_close($conn);
}

?>

På den side, hvor mine download-filer hentes fra, har jeg indtil videre haft følgende kodestump, som jeg egentlig gerne vil have integreret i ovenstående script, således at alt er samlet i ét script.

<?php include("test/downloads.php");
### Hent en fil ad gangen:
function makeDownloadLink($id){
include_once “db.php”;
$result = mysql_query("SELECT name, downloads FROM downloads WHERE ID='$id'",$db);
$result = mysql_fetch_row($result);
return $result;
}
?>

Ny fil:
Db.php

<?php
$config['host'] = 'localhost';
$config['database'] = '*****';
$config['login'] = '*****';
$config['password'] = '*****';

### Connect To Database
$conn=mysql_connect($config['host'], $config['login'], $config['password']) OR error('MySQL Connect Failed');
mysql_select_db($config['database'],$conn) OR error('MySQL Select DB Failed');
?

jeg er ikke helt klar over hvad funktionen makeDownloadLink() bruges til i forbindelse med det andet script?
Avatar billede dotcom1 Nybegynder
04. august 2005 - 12:03 #5
Så virker det. :) Nu kunne jeg nemt flytte funktionen makeDownloadLink() over i force download-scriptet og så have databaseoplysningerne i en seperat fil. Funktionen makeDownloadLink() viser hvert download-link på min side vha. et unikt id.

Du skal have mange tak for din hjælp. :)
Avatar billede dotcom1 Nybegynder
04. august 2005 - 12:11 #6
Hov, nej der er lige en lille ting...

Funktionen, jeg nævnte:
function makeDownloadLink($id){
include_once "db.php";
$result = mysql_query("SELECT name, downloads FROM downloads WHERE ID='$id'",$db);
$result = mysql_fetch_row($result);
return $result;
}
- ville jeg gerne have ind i download-scriptet uden at skulle connecte igen - include_once "db.php"; - kan det lade sig gøre?
Avatar billede dotcom1 Nybegynder
04. august 2005 - 12:15 #7
Nu da mine db-oplysninger hedder:
<?php
$config['host'] = 'localhost';
$config['database'] = '*****';
$config['login'] = '*****';
$config['password'] = '*****';

### Connect To Database
$conn=mysql_connect($config['host'], $config['login'], $config['password']) OR error('MySQL Connect Failed');
mysql_select_db($config['database'],$conn) OR error('MySQL Select DB Failed');
?

Hvad skal denne variabel $db i funktionen makeDownloadLink($id)
i denne linie
$result = mysql_query("SELECT name, downloads FROM downloads WHERE ID='$id'",$db);
så hedde?
Avatar billede dotcom1 Nybegynder
04. august 2005 - 12:20 #8
Har prøvet med

$result = mysql_query("SELECT name, downloads FROM downloads WHERE ID='$id'",$conn);

Men det virker ikke.
Avatar billede avminarm Juniormester
04. august 2005 - 13:05 #9
du behøver ikke at have $db med med mindre du benytter flere databaser på en gang.

Hvis du vil have $conn med skal du først gøre den global:

function makeDownloadLink($id){
global $conn;
include_once "db.php";
$result = mysql_query("SELECT name, downloads FROM downloads WHERE ID='$id'",$conn);
$result = mysql_fetch_row($result);
return $result;
}

include_once henter kun filen én gang - dvs hvis den er hentet en gang før - hentes den ikke igen ;o) = en connection
Avatar billede dotcom1 Nybegynder
04. august 2005 - 13:12 #10
Det gjorde tricket. Takker endnu engang. :)
Avatar billede avminarm Juniormester
04. august 2005 - 13:50 #11
det var så lidt ;o)
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