Downloadcounter gibt Fehlermeldung?

nordi

Erfahrenes Mitglied
Hallo, ich habe eine Uploadskript, mit dem man Dokumente online stellen kann. Upload, Download etc. funktioniert auch alles wunderbar. Aber wenn ich mein Downloadcounter einbauen will, gibt mir mein Skript die Fehlermeldung aus, dass er die Datei nicht finden kann. Ich glaube, dass die Variablen irgendwie nicht stimmen?! Vielleicht seht ihr den Fehler auf Anhieb:

Hier die download.php

PHP:
<?php


require('../content/config/config.php');


@mysql_connect("$dbhost", "$dbuser", "$dbpass"); 
@mysql_select_db("$dbtable"); 

echo mysql_error();
error_reporting(E_ALL^E_NOTICE);



if(!$_GET['id']) error('Fehlender Parameter!');
if($_GET['id']{0}=='.') error('Fehler Datei!');

if(file_exists($uploadDir.'/'.$_GET['id']))
{

	if(!is_bot())
	mysql_query("	INSERT INTO $essay SET filename='".mysql_real_escape_string($_GET['id'])."'
					ON DUPLICATE KEY UPDATE downloads=downloads+1");
	
	header("Location: ".$uploadDir."/".$_GET['id']);
	exit;
}
else error("Datei wird nicht gefunden!");



function error($str)
{
	die($str);
}


function is_bot()
{

	
	$botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
	"looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
	"Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
	"crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
	"msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
	"Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
	"Mediapartners-Google", "Sogou web spider", "WebAlta Crawler","TweetmemeBot",
	"Butterfly","Twitturls","Me.dium","Twiceler");

	foreach($botlist as $bot)
	{
		if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
		return true;	
	}

	return false;	
}
?>

Hiermit wird der Downloadlink aufgerufen:

PHP:
echo "<p class=\"download\"><a href=\"download.php?id=".$row->id."\">Download</a></p>";

Vielen Dank für Tipps!
 
Du schreibst ja selbst, dass der Inhalt einer Variable nicht stimmt - nämlich entweder $uploadDir oder $_GET['id']. Gib doch den daraus gebastelten Pfad zur Überprüfung mit echo aus oder füge am Anfang
PHP:
print($uploadDir);
print($_GET['id']);
ein. Wenn du dann immer noch der Meinung bist, dass der Pfad stimmt, können wir weitersehen.
P.S.: Wenn eine Variable einen String enthält, musst du natürlich nicht die Variable selbst in einen String setzen.
PHP:
@mysql_connect("$dbhost", "$dbuser", "$dbpass");  
// Entspricht Folgendem
@mysql_connect($dbhost, $dbuser, $dbpass);
 
Beide Werte gibt er mit print(); aus. Es wird ausgegeben:

../data/82This file does not exist!

Ich verstehs nicht..?

Vorher hatte der Download der Datei ganz normal geklappt. Das habe ich so gelöst:

PHP:
//KOMM DIREKT AN DEN ANFANG DER PHP DATEI!

//MYSQL Connect
@mysql_connect($dbhost, $dbuser, $dbpass);  
@mysql_select_db($dbtable); 

if(isset($_GET['id']))
{
include("../content/config/config.php");

//Download ID wird generiert und übergeben
$id = $_GET['id'];
$query = "SELECT filename, filetype, filesize, filepath FROM $essay WHERE id = '$id'";
$result = mysql_query($query) or die('Error, query failed');
list($fileName, $fileType, $fileSize, $filePath) = mysql_fetch_array($result);

header("Content-Disposition: attachment; filename=$fileName"); 
header("Content-length: $fileSize"); 
header("Content-type: $fileType"); 

readfile($filePath);

exit;

} else { 

// HTML DATEI

Download über folgende Zeile:

PHP:
echo "<p class=\"download\"><a href=\"".$PHP_SELF."?id=".$row->id."\">Download</a></p>";

Eventuell kann man ja den Downloadcounter oben direkt in das alte Skript integrieren?
 
Zuletzt bearbeitet:
Vorher hatte der id-Parameter bei dir auch nur den Datensatz aus der Mysql-Tabelle bezeichnet. In deinem oberen Skript soll $_GET['id'] aber den Dateinamen enthalten. Wenn beide nicht identisch sind, funktioniert deine file_exists-Abfrage natürlich nicht...

Lass dir doch zuerst den Dateinamen aus der DB ausgeben (wie in Post #3) und prüfe dann mit file_exists.
 
Hi, danke für den Tipp! Habe das Skript folgendermaßen umgeändert:

PHP:
<?php


require('../content/config/config.php');

@mysql_connect("$dbhost", "$dbuser", "$dbpass"); 
@mysql_select_db("$dbtable"); 

$id = $_GET['id']; 
$query = "SELECT filename, filetype, filesize, filepath FROM $essay WHERE id = '$id'";
$result = mysql_query($query) or die('Error, query failed'); 
list($fileName, $fileType, $fileSize, $filePath) = mysql_fetch_array($result);

echo mysql_error();
error_reporting(E_ALL^E_NOTICE);



if(!$filePath) error('Missing parameter!');
if($filePath{0}=='.') error('Wrong file!');

// Hier habe ich das ../ davor gesetzt, weil sich die download.php momentan noch in einem Überordner befindet.

if(file_exists('../'.$filePath))
{

	if(!is_bot())
	mysql_query("	INSERT INTO $essay SET filename='".mysql_real_escape_string($_GET['id'])."'
					ON DUPLICATE KEY UPDATE downloads=downloads+1");
	
// das gleiche wie oben mit dem ../ davor.


	header("Location: ../".$filePath);
	exit;
}
else error("Datei existiert nicht!");



function error($str)
{
	die($str);
}


function is_bot()
{

	
	$botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
	"looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
	"Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
	"crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
	"msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
	"Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
	"Mediapartners-Google", "Sogou web spider", "WebAlta Crawler","TweetmemeBot",
	"Butterfly","Twitturls","Me.dium","Twiceler");

	foreach($botlist as $bot)
	{
		if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
		return true;	
	}

	return false;	
}
?>

Die Variable $filePath enthält den komplette Pfad zu den Dokumenten. (data/dokumentname.pdf)

Er gibt mir aber folgende Fehlermeldung aus:

Code:
Warning: Cannot modify header information - headers already sent by (output started at /is/htdocs/wp1166558_W57QY9OV8K/www/hosted/stoke/handouts/beta/download.php:14) in /is/htdocs/wp1166558_W57QY9OV8K/www/hosted/stoke/handouts/beta/download.php on line 31

Woran kann das liegen? Die MYSQL-Anweisung mit INSERT weiß ich auch nicht so recht anzupassen.
 
Hallo,

die Fehlermeldung besagt, dass du in Zeile 14 bereits eine Ausgabe machst, wodurch die Header in Zeile 31 nicht mehr manipuliert werden können. Schau mal ob du an der angegeben Stelle eine Ausgabe machst, ein Leerzeichen würde schon reichen.

// edit:
PHP:
echo mysql_error();
Das ist der Bösewicht ;) Lösche die Zeile raus, dann verschwindet die Fehlermeldung.

Gruß
BK
 
Kommentiere doch
PHP:
echo mysql_error();
mal aus. Vor der Ausgabe von Header-Informationen dürfen keine anderen Ausgaben gemacht werden. Wenn das SQL-Kommando ohne Fehler durchläuft, brauchst du auch keine Ausgabe von mysql_error - musst dir halt überlegen, in welchem Fall doch.
In der INSERT-Anweisung nehme ich an, dass du $_GET['id'] durch $fileName ersetzen solltest. Allerdings kenne ich deine Tabelle essay nicht, da musst du schon selber wissen, wie der Inhalt der Spalte filename aussehen soll.
 
Noch eine Frage zum Datei-Download. Also klappen tut es wunderbar - hätte aber evtl. noch eine Frage zu header();

Momentan wird der Download der Datei mit header header("Location: ".$filePath); aufgerufen. Er zeigt dann das Dokument mit deinem generierten Dateinamen an oder lädt es runter. Der Dateiname wird generiert, damit keine Dateien im Verzeichnis überschrieben werden, da evtl. der gleiche Dateinamen existiert. Dies passiert über:

PHP:
/
/ Datei wird mit randName auf Server gespeichert um doppelte Namen zu umgehen
$filePath = $uploadDir . $fileName;
$ext = substr(strrchr($fileName, "."), 1); 
$randName = md5(rand() * time());
$filePath = $uploadDir . $randName . '.' . $ext;

Ich würde jetzt aber gerne beim Download wieder den "alten" Dokumentennamen wiederherstellen. Dies hatte ich so gedacht, doch die Dokumente sind 0KB groß, wenn sie runtergeladen werden?

PHP:
// Ich habe diese Zeile ersetzt:
header("Location: ".$filePath);

//mit diesen Zeilen:
header("Content-Disposition: attachment; filename=$fileName");  
header("Content-length: $fileSize");  
header("Content-type: $fileType");
 
Zurück