Kann in DB gespeicherte Daten nicht mehr auslesen
Hallo,
ich habe vor Jahren mit einen kleinen Projekt angefangen, soll ein Extranet werden.
Mitarbeiter können Dateien hochladen und Kunden können die Dateien bei sich herunterladen.
Jedenfalls habe ich es wieder aufgegriffen und versuche es wieder auf die Beine zu stellen.
Das hochladen der Dateien funktioniert perfekt, das herunterladen nicht.
Ich habe einen Button, der eine PHP Datei aufruft, mit einer Action "download" und der ID der Datei in der
Mysql Datenbank:
Eigentlich sollte ich ja dann einen Datei-Download bekommen, läuft aber nicht
Was mache ich falsch?
Danke Gruß Alex
ich habe vor Jahren mit einen kleinen Projekt angefangen, soll ein Extranet werden.
Mitarbeiter können Dateien hochladen und Kunden können die Dateien bei sich herunterladen.
Jedenfalls habe ich es wieder aufgegriffen und versuche es wieder auf die Beine zu stellen.
Das hochladen der Dateien funktioniert perfekt, das herunterladen nicht.
Ich habe einen Button, der eine PHP Datei aufruft, mit einer Action "download" und der ID der Datei in der
Mysql Datenbank:
if($_GET['todo']==download) {
$id_files=$_GET['id'];
$connectionid = mysql_connect ("localhost", "user", "password");
if (!mysql_select_db ("intranet", $connectionid)) {
die ("Keine Verbindung zur Datenbank");
}
$sql = "SELECT content, type, name, size FROM upload WHERE id=$id_files";
$result = @mysql_query($sql, $connectionid);
if ( !$result ) die('MySQL-Fehler:' . mysql_error());
$data = @mysql_result($result, 0, "content");
$name = @mysql_result($result, 0, "name");
$size = @mysql_result($result, 0, "size");
$type = @mysql_result($result, 0, "type");
header("Content-type: $type");
header("Content-length: $size");
header("Content-Disposition: attachment; filename=$name");
header("Content-Description: PHP Generated Data");
echo $data;
mysql_close($connectionid);
}
Eigentlich sollte ich ja dann einen Datei-Download bekommen, läuft aber nicht
Was mache ich falsch?
Danke Gruß Alex
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 195880
Url: https://administrator.de/contentid/195880
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
14 Kommentare
Neuester Kommentar
Hi @facebraker,
lass Dir als erstes doch mal die $sql Variable ausgeben und überprüfe damit dann die Datenbank. Dann würde ich auch die "@" Zeichen vor den "mysql_" Befehlen löschen, da das @ mögliche Fehlermeldungen unterdrückt. So von der Syntax sollte es korrekt sein.
Gruß
@firefly
lass Dir als erstes doch mal die $sql Variable ausgeben und überprüfe damit dann die Datenbank. Dann würde ich auch die "@" Zeichen vor den "mysql_" Befehlen löschen, da das @ mögliche Fehlermeldungen unterdrückt. So von der Syntax sollte es korrekt sein.
Gruß
@firefly
Moin,
also ich stell mir erst einmal die Frage, was kommt denn überhaupt? Wenn kein Download kommt, muss ja ein Warning, eine Exception oder sonst was kommen.
Könnte mir auch vorstellen, dass Dein Script noch auf einer alten PHP-Version basiert, der Server aber zwischenzeitlich auf einer neueren Version läuft.
vg
also ich stell mir erst einmal die Frage, was kommt denn überhaupt? Wenn kein Download kommt, muss ja ein Warning, eine Exception oder sonst was kommen.
Könnte mir auch vorstellen, dass Dein Script noch auf einer alten PHP-Version basiert, der Server aber zwischenzeitlich auf einer neueren Version läuft.
vg
Versteh ich jetzt nicht...ein echo als debug? Also entweder da ist ein echo, dann wird das auch ausgegeben - oder da ist eben keins.
Wenn er schon in Zeile 19 nix ausgibt, dann passt da was nicht. Ist das das komplette Script? Rufst Du das direkt auf? Oder gibt's da vorher noch was?
Zeile 19 würde ich vor Zeile 18 schreiben. Danach mal ein exit; Dann muss er ja zumindest die Query ausgeben.
vg
Wenn er schon in Zeile 19 nix ausgibt, dann passt da was nicht. Ist das das komplette Script? Rufst Du das direkt auf? Oder gibt's da vorher noch was?
Zeile 19 würde ich vor Zeile 18 schreiben. Danach mal ein exit; Dann muss er ja zumindest die Query ausgeben.
vg
beachte dass gewisse Wörter zum SQL Syntax von MySQL gehören.
... um Problemen mit dem Escape der Parameter auszuschließen würde ich Dir empfehlen bind zu nutzen oder gleich PDO.
EDIT:
SELECT `content`, `type`, `name`, `size`
FROM `upload`
WHERE `id`= $id_files
EDIT:
- benutze lieber var_dump() für debug ausgaben
- if($_GET['todo']==download) ... was ist download ? - eine Konstante ? ... ich glaube nicht. benutze mal error_reporting(E_ALL);
Beachte die Backticks ` - nicht die Hochkommas ' verwenden im SQL, dann gibt dir die SELECT Anweisung die Tabellen Feldnamen als Konstanten zurück.
EDIT:
EDIT:
- Wenn deine DB Verbindung fehlschlägt - wird nach dem IF() trotzdem weitergearbeitet. - daher ein exit() oder throw new Exception() einfügen
- In WHILE: var_dump( $row )
- Wenn deine SQL Anweisung einen Fehler produziert - also $result === false ist - was dann ? - eine Ausgabe des SQL Errors würde bestimmt gut in einen ELSE Zweig passen
Hallo,
man kann die Ausgabe mit PHP zwar nicht blocken, aber z. B. mit ob_start() erst einmal zurückhalten. Sobald das Script aber beendet wird, wird alles ausgegeben, was im Puffer steht. Allerdings kann dieser zwischendrin auch z. B. mit ob_clean() ohne Ausgabe geleert werden. Da sehe ich in Deinem Script aber nicht; dazu könnte natürlich in dem aufrufenden Script was stehen.
Um den Fehler zu suchen, könntest Du ein einfaches Script schreiben, welches Du direkt im Browser aufrufst. Dort sind keine IFs und keine $_GETs..sondern einfach nur z. B.
Dann mal schauen, was er dazu sagt.
vg
man kann die Ausgabe mit PHP zwar nicht blocken, aber z. B. mit ob_start() erst einmal zurückhalten. Sobald das Script aber beendet wird, wird alles ausgegeben, was im Puffer steht. Allerdings kann dieser zwischendrin auch z. B. mit ob_clean() ohne Ausgabe geleert werden. Da sehe ich in Deinem Script aber nicht; dazu könnte natürlich in dem aufrufenden Script was stehen.
Um den Fehler zu suchen, könntest Du ein einfaches Script schreiben, welches Du direkt im Browser aufrufst. Dort sind keine IFs und keine $_GETs..sondern einfach nur z. B.
$id = 5;
$dbh = mysqli_connect ("localhost", "intranet", "intranet");
$query = "SELECT * FROM upload WHERE id=$id";
echo "Query: $query <br>";
$result = mysqli_query($dbh, $query);
var_dump($result);
Dann mal schauen, was er dazu sagt.
vg
Sowas ähnliches hatte er vorher schon, allerdings mit die(); was ja grundsätzlich auf das gleiche rauskommt. Ist zwar auch nicht sauber, aber das Script ist ja auch schon älter ;)
Mein gestern gepostete Script sollte etwas Licht ins Dunkel bringen. Die Sache mit den Backticks hab ich auch schon vermutet. Daher hab ich das in meinem Bsp "anders" gelöst. Mal schauen, was facebraker postet.
Euch allen eine angenehme und stressfreie Vorweihnachtswoche!
vg
Bytecounter
Mein gestern gepostete Script sollte etwas Licht ins Dunkel bringen. Die Sache mit den Backticks hab ich auch schon vermutet. Daher hab ich das in meinem Bsp "anders" gelöst. Mal schauen, was facebraker postet.
Euch allen eine angenehme und stressfreie Vorweihnachtswoche!
vg
Bytecounter
Freut mich, dann den Thread bitte noch als gelöst markieren.
Allerdings noch ein Tip: Um das Script ein wenig abzusichern, solltest Du keine Variablen direkt (also ungefiltert) an den SQL übergeben.
Bei einer ID (welche vermutlich ein Integer ist), ist das recht einfach:
$id = (int) $_GET['id'];
Ist es ein String, müsstest Du ihn auf erlaubte Zeichen prüfen. Da Du das aber nur intern einsetzt- und ich vermute, dass der Server von außen gar nicht erreichbar ist, ist das nicht ganz so dramatisch.
Weiterhin viel Erfolg!
vg
Bytecounter
Allerdings noch ein Tip: Um das Script ein wenig abzusichern, solltest Du keine Variablen direkt (also ungefiltert) an den SQL übergeben.
Bei einer ID (welche vermutlich ein Integer ist), ist das recht einfach:
$id = (int) $_GET['id'];
Ist es ein String, müsstest Du ihn auf erlaubte Zeichen prüfen. Da Du das aber nur intern einsetzt- und ich vermute, dass der Server von außen gar nicht erreichbar ist, ist das nicht ganz so dramatisch.
Weiterhin viel Erfolg!
vg
Bytecounter