Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Kann in DB gespeicherte Daten nicht mehr auslesen

Frage Entwicklung PHP

Mitglied: facebraker

facebraker (Level 1) - Jetzt verbinden

14.12.2012, aktualisiert 16:48 Uhr, 2421 Aufrufe, 14 Kommentare

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:

01.
if($_GET['todo']==download) { 
02.
    $id_files=$_GET['id']; 
03.
    $connectionid = mysql_connect ("localhost", "user", "password");  
04.
    if (!mysql_select_db ("intranet", $connectionid)) {  
05.
        die ("Keine Verbindung zur Datenbank");  
06.
    }  
07.
    $sql = "SELECT content, type, name, size FROM upload WHERE id=$id_files"; 
08.
         	 
09.
    $result = @mysql_query($sql, $connectionid); 
10.
    if ( !$result ) die('MySQL-Fehler:' . mysql_error()); 	 
11.
    $data = @mysql_result($result, 0, "content"); 
12.
    $name = @mysql_result($result, 0, "name"); 
13.
    $size = @mysql_result($result, 0, "size"); 
14.
    $type = @mysql_result($result, 0, "type"); 
15.
	 
16.
    header("Content-type: $type"); 
17.
    header("Content-length: $size"); 
18.
    header("Content-Disposition: attachment; filename=$name"); 
19.
    header("Content-Description: PHP Generated Data"); 
20.
    echo $data; 
21.
    mysql_close($connectionid); 
22.
}
Eigentlich sollte ich ja dann einen Datei-Download bekommen, läuft aber nicht

Was mache ich falsch?

Danke Gruß Alex
Mitglied: firefly
14.12.2012 um 16:53 Uhr
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
Bitte warten ..
Mitglied: bytecounter
14.12.2012 um 19:19 Uhr
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
Bitte warten ..
Mitglied: facebraker
14.12.2012 um 19:23 Uhr
Hallo Firefly, ich habe das Skript mal schön gemacht.

01.
<?php 
02.
error_reporting( -1 ); 
03.
ini_set('display_errors', TRUE); 
04.
 
05.
session_start ();  
06.
#include ("checkuser.php");  
07.
#echo $_GET ['id']; 
08.
#echo $_SESSION["user_id"]; 
09.
if(isset($_GET['id']) && isset ($_SESSION["user_id"]))   
10.
11.
  $connectionid = mysql_connect ("localhost", "user", "password"); 
12.
  #echo $_GET['todo']; 
13.
  if($_GET['todo']==download) 
14.
15.
      $id_files=$_GET['id']; 
16.
      if (!mysql_select_db ("intranet", $connectionid)) die ("Keine Verbindung zur Datenbank");  
17.
        $sql = "SELECT content, type, name, size FROM upload WHERE id=$id_files"
18.
        $result = mysql_query($sql, $connectionid); 
19.
      echo $sql
20.
      if ( !$result ) die('MySQL-Fehler:' . mysql_error());    
21.
      $data = mysql_result($result, 0, "content"); 
22.
      $name = mysql_result($result, 0, "name"); 
23.
      $size = mysql_result($result, 0, "size"); 
24.
      $type = mysql_result($result, 0, "type"); 
25.
         
26.
      #header("Content-type: $type"); 
27.
      #header("Content-length: $size"); 
28.
      #header("Content-Disposition: attachment; filename=$name"); 
29.
      #header("Content-Description: PHP Generated Data"); 
30.
      echo $data
31.
       
32.
33.
    elseif ($_GET['todo']==delete
34.
35.
        $id_files=$_GET['id']; 
36.
        if (!mysql_select_db ("intranet", $connectionid)) die ("Keine Verbindung zur Datenbank");  
37.
      $sql = "DELETE FROM upload WHERE id=$id_files"
38.
        $result = mysql_query($sql, $connectionid); 
39.
        if ( !$result ) die('MySQL-Fehler:' . mysql_error());    
40.
41.
    mysql_close($connectionid); 
42.
    Header('Location: projekt_portal.php'); 
43.
44.
?>
Komischerweise wird kein "echo" ausgegeben, auch nicht als Debug, könnte das der Fehler sein?

Gruß Alex
Bitte warten ..
Mitglied: bytecounter
14.12.2012 um 19:43 Uhr
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
Bitte warten ..
Mitglied: nxclass
14.12.2012, aktualisiert um 23:08 Uhr
beachte dass gewisse Wörter zum SQL Syntax von MySQL gehören.
01.
SELECT `content`, `type`, `name`, `size` 
02.
FROM `upload` 
03.
WHERE `id`= $id_files
... um Problemen mit dem Escape der Parameter auszuschließen würde ich Dir empfehlen bind zu nutzen oder gleich PDO.

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);
Bitte warten ..
Mitglied: facebraker
16.12.2012 um 12:25 Uhr
Hallo!

Ich habe eure Anmerkungen z.T. umgesetzt.

if($_GET['todo']==download) ist wirklich dämlich natürlich muss es if($_GET['todo']=='download') heißen, aber ich wundere mich warum es trotzdem im "delete" Zweig geht?

Ja, das Skript ist nicht alles.

Ich habe eine Seite, wo in einer Tabelle die Dateien in der DB angezeigt sind, in jeder Zeile sind 2 Button "Download" und "Delete" , wenn der Nutzer "Delete" drückt, wird das Skript aufgerufen und die "id" des Datensatzes in der DB übergeben und die "userid". Beim "Download" das gleiche ... aber der Download klappt sind, es passiert einfach nichts, wenn ich "Download" klicke sagt der Browser "warten auf localhost (WAMP)" und weiter nichts.

Meine Vermutung, das "echo $data" wird zwar ausgeführt aber irgendwie geblockt, Browser oder PHP???? Keine Ahnung.

Das mit mysqli und PDO muss ich auch umsetzen, aber mit Laptop und keiner richtigen Tastatur und Maus ist das nervig, wenn dann schaffe ich es Montag am Schreibtisch

Aber abgesehen von der Anfälligkeit für SQL Injenctions muss es ja funktionieren.

Gibt es im PHP eine globale Variable die Fehlermeldungen auf ein mindest Log-Level setzt, dass ich kein Feedback bekomme?

Gruß Alex
Bitte warten ..
Mitglied: facebraker
16.12.2012 um 13:12 Uhr
Hi habe jetzt auf mysqli umgestellt, erstmal nur den "download" Zweig, aber keine Änderung.

01.
<?php 
02.
#error_reporting( -1 ); 
03.
error_reporting(E_ALL); 
04.
ini_set('display_errors', TRUE); 
05.
 
06.
session_start ();  
07.
#include ("checkuser.php");  
08.
#echo $_GET ['id']; 
09.
#echo $_SESSION["user_id"]; 
10.
if(isset($_GET['id']) && isset ($_SESSION["user_id"]))   
11.
12.
	$connectionid = mysqli_connect ("localhost", "intranet", "intranet"); 
13.
	#echo $_GET['todo']; 
14.
	if($_GET['todo']=='download'
15.
16.
			$id_files=$_GET['id']; 
17.
			if (mysqli_connect_errno($connectionid)) { 
18.
    			echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
19.
20.
	  		$sql = "SELECT 'content', 'type', 'name', 'size' FROM upload WHERE 'id'=$id_files"
21.
	  		var_dump( $sql); 
22.
	  		if ($result = mysqli_query($connectionid, $sql)) { 
23.
 
24.
		    /* fetch associative array *
25.
    		while ($row = mysqli_fetch_assoc($result)) { 
26.
        			$name = $row["name"]; 
27.
        			$size =  $row["size"]; 
28.
        			$type =  $row["type"]; 
29.
        			$data=  $row["content"]; 
30.
31.
 
32.
    		/* free result set *
33.
    		mysqli_free_result($result); 
34.
35.
 
36.
			header("Content-type: $type"); 
37.
			header("Content-length: $size"); 
38.
			header("Content-Disposition: attachment; filename=$name"); 
39.
			header("Content-Description: PHP Generated Data"); 
40.
			echo $data
41.
42.
	  mysqli_close($connectionid); 
43.
	  Header('Location: projekt_portal.php'); 
44.
45.
?>



*Grübel* geht nicht, wieder keine Reaktion, baue ich Fehler ins Skript, dann kriege ich Fehlermeldungen, aber so nicht.

Gruß Alex
Bitte warten ..
Mitglied: nxclass
16.12.2012, aktualisiert um 20:52 Uhr
Beachte die Backticks ` - nicht die Hochkommas ' verwenden im SQL, dann gibt dir die SELECT Anweisung die Tabellen Feldnamen als Konstanten zurück.

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
Bitte warten ..
Mitglied: bytecounter
16.12.2012, aktualisiert um 21:50 Uhr
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.
01.
$id = 5; 
02.
$dbh = mysqli_connect ("localhost", "intranet", "intranet");  
03.
$query = "SELECT * FROM upload WHERE id=$id"; 
04.
echo "Query: $query <br>"; 
05.
$result = mysqli_query($dbh, $query); 
06.
var_dump($result);
Dann mal schauen, was er dazu sagt.

vg
Bitte warten ..
Mitglied: bytecounter
17.12.2012 um 09:56 Uhr
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
Bitte warten ..
Mitglied: facebraker
17.12.2012 um 12:21 Uhr
Hallo Bytecounter & nxclass,

ich hatte gestern Abend richtig die Schnautze voll, und frei nach der Debugging-Regel "Wenn was nicht funktioniert, gehe davon aus, dass das komplette Skript fehlerhaft ist" habe ich noch einmal von Null angefangen.

Das das Skript nicht so spektakulär war, habe ich es von Anfang an versucht sauber zu programmieren.

ABER, ich denke mal nxclass hat recht mit den Backticks, denn in meinen neuen Skript verwende ich ein Select * from upload WHERE... Das könnte der Fehler sein. Denn viel anders mache ich es in den neuen Skript auch nicht.
Bis auf mysqli_* und mysqli_real_escape_string ..


Jedenfalls mein neues funktioniert, vielen Dank für Eure Tipps!

01.
<?php  
02.
session_start ();  
03.
// DB 
04.
$link = mysqli_connect("localhost", "intranet", "intranet","intranet");  
05.
 
06.
if (mysqli_connect_errno()) { 
07.
    printf("Connect failed: %s\n", mysqli_connect_error()); 
08.
    exit(); 
09.
10.
 
11.
if (isset($_GET['id']) &&  isset ($_SESSION["user_id"])) {  
12.
	if($_GET['todo']=='download'){ 
13.
		// SQL String 
14.
		$sql = sprintf("SELECT * FROM upload WHERE id = '%s' LIMIT 1", mysqli_real_escape_string($link,$_GET['id'])); 
15.
		if ($result = mysqli_query($link, $sql)) { 
16.
 
17.
				/* fetch associative array *
18.
				while ($row = mysqli_fetch_assoc($result)) { 
19.
					printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]); 
20.
					// Den Browser zum Download zwingen  
21.
					header("Content-type: " . $row["type"]);  
22.
					header("Content-disposition: attachment; filename=".$row["name"].";");  
23.
					header("Content-length: " . $row["size"]);  
24.
 
25.
					// Daten dekodieren und an den Browser senden  
26.
					echo $row["content"];  
27.
 
28.
29.
 
30.
				/* free result set *
31.
				mysqli_free_result($result); 
32.
33.
		 
34.
		/* close connection *
35.
		mysqli_close($link); 
36.
		exit;  
37.
38.
	elseif ($_GET['todo']=='delete') { 
39.
		$sql = sprintf("DELETE FROM upload WHERE id='%s'",mysqli_real_escape_string($link,$_GET['id'])); 
40.
	  	$result = mysqli_query($link,$sql); 
41.
	  	if ( !$result ) die('MySQL-Fehler:' . mysqli_error($link)); 	 
42.
43.
		Header('Location: http://localhost/extranet/projekt_portal.php'); 
44.
}  
45.
?>


Gruß Alex
Bitte warten ..
Mitglied: bytecounter
17.12.2012 um 12:57 Uhr
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
Bitte warten ..
Mitglied: facebraker
17.12.2012 um 15:05 Uhr
Hallo Bytecounter,

Danke für den Tipp, da habe ich mich schon belesen und es wurde empfohlen dies zu nuten:

mysql_real_escape_string — Maskiert spezielle Zeichen innerhalb eines Strings für die Verwendung in einer SQL-Anweisung

http://php.net/manual/de/function.mysql-real-escape-string.php

Natürlich ist deine Lösung, so einfach wie genial

Aber mysql_real_escape_string sollte auch reichen, oder?

Danke, ich bin schon am nächsten Problem, würde mich freuen wenn du die Augen im Forum offen hälst und mir eventuell da helfen kannst.

Vielen Dank!

Gruß Alex
Bitte warten ..
Mitglied: bytecounter
18.12.2012 um 00:26 Uhr
Hallo Alex,

das kannst Du natürlich auch nehmen.

vg
Bytecounter
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst HTML-Seiten öffnen und bestimmte Daten auslesen (1)

Frage von makroll10 zum Thema Batch & Shell ...

Webbrowser
gelöst Daten in entfernte Mysql DB schreiben (3)

Frage von nullacht15 zum Thema Webbrowser ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...