Top-Themen

Aktuelle Themen (A bis Z)

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

Frage Entwicklung PHP

GELÖST

Kann in DB gespeicherte Daten nicht mehr auslesen

Mitglied: facebraker

facebraker (Level 1) - Jetzt verbinden

14.12.2012, aktualisiert 16:48 Uhr, 2518 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 ..
Ähnliche Inhalte
Windows Server
PDF Formular - Daten können nicht gespeichert werden
gelöst Frage von el-capitano86Windows Server5 Kommentare

Hallo zusammen, kurz zur Umgebung: 1x SBS 2008 und 1x Terminalserver unter 2008. Die User arbeiten alle ausschließlich auf ...

Microsoft Office
Office 365 anmelde Daten werden nicht gespeichert
Frage von Hans3003Microsoft Office1 Kommentar

Hallo Ich habe auf Unsren Clients mit dem Office Bereitstellungstool Office 365 2016 installiert. Leider ist es so, das ...

Webbrowser
Daten in entfernte Mysql DB schreiben
gelöst Frage von nullacht15Webbrowser3 Kommentare

Hi, ich beschäftige mich derzeit mit einem System, bestehend aus einigen Sensoren, welches Daten regelmäßig ausliest und diese in ...

Router & Routing
OpenWRT Daten auslesen
gelöst Frage von KammiiRouter & Routing2 Kommentare

Hallo, ich habe da mal wieder eine kleine frage zu openWRT. Und zwar wie kann ich mich in der ...

Neue Wissensbeiträge
Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 10 StundenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 11 StundenSicherheit7 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 12 StundenSicherheit8 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Sicherheit

Meltdown und Spectre: Die machen uns alle was vor

Information von Frank vor 12 StundenSicherheit12 Kommentare

Aktuell sieht es in den Medien so aus, als hätten die Hersteller wie Intel, Microsoft und Co den aktuellen ...

Heiß diskutierte Inhalte
Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von 92943Windows 1031 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Batch & Shell
Anmeldevorgang für Informatikraum (Schule) unter Windows
gelöst Frage von IngenieursBatch & Shell29 Kommentare

Hey zusammen, ich werde in naher Zukunft den Informatik Raum meiner jetzigen Schule von dem aktuellen Betreiber übernehmen (Vertrag ...

Netzwerkgrundlagen
Welches Modem für VDSL 50000 der T-Com
Frage von Windows10GegnerNetzwerkgrundlagen20 Kommentare

Hallo, ein Kollege von mir will sich VDSL50000 von der T-Com holen, um daran einen Server zu betreiben. Ich ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...