• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

[sql, php] Upload-Script trägt Pfad nicht ein

Decomposition

Antonowka
Registriert
09.12.06
Beiträge
363
Hallo!

Ich bastle grad an einem kleinen Katalogsystem und stecke nun an einer Stelle fest.
Mit folgendem Script realisiere ich über eine Admin-Seite den Upload des Produktbildes:

Code:
<?
$tempname = $_FILES['img']['tmp_name'];  
$name = $_FILES['img']['name'];
$type = $_FILES['img']['type'];  
$size = $_FILES['img']['size'];
			
$helper = explode('_', $name); 
$result = $helper[0] . '_' . $helper[1];
			
$path = '../../../img/store/bands/';
			
$fullpath = $path . $result . '/' . $name; 
						
if($type != "image/gif" && $type != "image/pjpeg") {  
$err[] = "nur gif und jpeg Dateien dürfen hochgeladen werden.";  
}  
if($size > "15000") {  
				$err[] = "Die Datei welche du hochladen willst, ist zu gross!<br>Maximale Dateigrosse beträgt 15 KB!";  
			} if(empty($err)) {  
				move_uploaded_file("$tempname", "$fullpath");  
				echo "Die Datei $name wurde erfolgreich hochgeladen!";  
			}  
			else {  
				foreach($err as $error)  
				echo "$error<br>";  
			}  
			?>

Hier also erstmal die Struktur. Das "Besondere" an dem Script ist, dass automatisch über den Namen der hochgeladenen Bilddatei der gewünschte Serverpfad gefunden wird. Die Bildnamen sind dabei immer nach folgendem Muster benannt: wort1_wort2_wort3.gif. Durch die explode()-Funktion werden nur die ersten beiden Wörter samt Unterstrich in die neue Variable geschrieben, denn so heißt imm der jeweilige Ordner, in den die Datei geschoben werden soll. Durch die Angabe des Pfads unter $path wird dann auch noch die restliche Verzeichnisstruktur angegeben.

Das funktioniert ja auch alles super. Allerdings soll neben dem Upload der Datei auch noch der neue Server-Pfad der Datei in die Datenbank geschrieben werden. Dies wollte ich nun so in etwa realisieren, zu finden im Formular der Seite:

Code:
<form enctype="multipart/form-data" action="buttons.php?cat_ID=<? echo $_GET['cat_ID'] ?>&cat_name=<? echo $_GET['cat_name'] ?>" method="post" name="upload"> 

<div class="form_ab"><span class="form_links">Name</span><span class="form_rechts">

<input type="text" size="25" name="product_name">

<input type="hidden" name="cat_ID" value="<? echo $_GET['cat_ID'] ?>"><input type="hidden" name="product_img" value="">

<input type="hidden" name="pathhelper" value="<? echo $fullpath; ?>"></span></div>

<div class="form_ab"><span class="form_links">Bild</span><span class="form_rechts">
<input name="img" type="file" size="500" maxlength="1000" onChange="update()"></span></div>
            
<div class="form_ab"><span class="form_links">Preis</span><span class="form_rechts">
<input type="text" size="25" name="product_price">
<input type="hidden" name="product_ID">
<input type="hidden" name="action" value="products_insert">
<input type="submit" name="Submit" value="Eintragen"></span></span></div>
            </form>

Wie ihr seht, verwende ich ein Javascript, um den Pfad der Datei beim Auswählen (onChange) in das versteckte Input-Feld zu schreiben. Dieses wird dann in die Datenbank geschrieben. Hier mal kurz das verwendete Javascript:

Code:
            <script type="text/javascript">
			<!--
			function update(){
			 document.upload.product_img.value = document.upload.pathhelper.value;
			}
			//-->
			</script>

Das Problem ist nur, dass irgendwie zum Zeitpunkt des OnChange die Variable $name (der Dateiname) keinen Wert mehr zu haben scheint. Denn die Ausgabe des Pfads lautet immer:

../../../img/store/bands/_/

Das zeigt mir, dass $name keinen Wert hat und somit durch das explode() lediglich der Unterstrich ausgegeben wird. Mir ist auch irgendwie klar, dass die Variable ja erst ihren Wert bekommt wenn man das Formular abschickt, aber wie kann ich denn realisieren, das nun der Serverpfad in diese Datenbankspalte geschrieben wird?

Danke erstmal das ihr bis hierhin gelesen habt ^^

..
 

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
Huhu,

wenn ich das richtig verstehe willst du den Pfad, in welchen die Datei geschrieben wird, in die Datenbank speichern , richtig ?

Wieso schreibst du dann nicht einfach den $fullpath in die DB ?

grüße
 

Decomposition

Antonowka
Registriert
09.12.06
Beiträge
363
Das genau wird ja gemacht, wenn ihr euch das Script anschaut:

<input type="hidden" name="pathhelper" value="<? echo $fullpath; ?>">

Dieses Feld wird in die Datenbank eingetragen. Das Problem ist, dass §fullpath immer nur den Wert ../../../img/store/bands/_/ bekommt, nicht aber den kompletten inklusive $name Variable ._.

Ist schwer zu erklären, ich hoffe ihr versteht mich. ^^
 

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
Achso, naja in dem Moment in dem du das Formular abschickst, kennt das Formular ja nicht die Variable $fullpath.

Du müsstest das so machen das mit dem Forumlar ebend diese ganzen Infos an das Script übergeben werden und dort frägst du ab ob das Formular abgeschickt wurde. Falls Ja, speicherst du die Daten in die Variablen und machst ganz normal weiter.

Ich denke wenn du im Formular schon eine Variable zuweißt dann bringt das nichts, weil das Formular diese Variable nicht kennt.

Ich hoffe das war jetzt nicht ganz falsch, bin auch gerade in Eile , was ausführliches folgt nach Silvester ;)

Euch allen einen guten Rutsch ins neue Jahr !! :)
 
Zuletzt bearbeitet:

KoenigKarsten

Cox Orange
Registriert
18.08.07
Beiträge
101
er übergibt es doch durch das input vom Formular.
und auslesen wird er es sicherlich auch $_get[]...

oder sind formular und upload script in getrennten dateien?

lass doch mal $fullpath vorm upload ausgeben und kommentiere den solange aus..
hat die variable da schon den falschen wert?

weil dann würde es ja am explode() liegen..
 
Zuletzt bearbeitet:

Decomposition

Antonowka
Registriert
09.12.06
Beiträge
363
Sind in den gleichen Dateien. Und natürlich hat $fullpath vor dem Upload den falschen Wert, er kennt ja $name da noch gar nicht.

Ich hab in 'nem anderen Forum einen etwas gelungeneren Eintrag verfasst, der auch etwas übersichtlicher und verständlicher geworden ist. Den schreib ich hier jetzt einfach noch mal hin:

***

Hallo!

Ich bastle grad an einem kleinen Katalogsystem und hänge an einer Stelle fest. Ich nutze ein Script über welches ich ein Produktbild hochladen kann. Der Name der Datei wird anhand der explode()-Funktion auseinandergenommen, und ein Teil davon als Ordnername verwendet. So werden die Dateien automatisch in jeweilige Ordner sortiert.

Bis dahin funktioniert auch alles einwandfrei. Um die Bilder nun aber auch anzeigen zu lassen, muss ich ja logischerweise auch irgendwie den Serverpfad des Bildes in die Datenbank schreiben. Dies wollte ich einfach machen, in dem ich im Upload-Formular folgendem Input-Feld den Wert des Pfads gebe:

Code:
<input type="hidden" name="product_img" value="<? echo $fullpath; ?>">

Unter der Variable $fullpath versteckt sich folgendes:

Code:
$helper = explode('_', $name); 
$result = $helper[0] . '_' . $helper[1];

$path = '../../../img/store/bands/';
$fullpath = $path . $result . '/' . $name;

Diese Variable dient also dazu, den kompletten Dateipfad zu erhalten. $name ist dabei, wie ihr euch sicher denken könnt, der Name der hochgeladenen Datei.

Das Problem ist jetzt aber, dass das oben genannte Input-Feld nun ja schon vor dem Hochladen der Datei ihren Wert bekommt - zu einem Zeitpunkt, wo $name (also der Dateiname) noch gar keinen Wert hat. Dies führt logischerweise zu folgender Ausgabe:

../../../img/store/bands/_/

Und jetzt ist die Frage, wie ich diesen Pfad in die Datenbank bekomme. Ich habe schon an eine Javascript-Funktion mit onChange() gedacht, aber auch das ändert irgendwie nichts daran, das $name keinen Wert bekommt ...
 

KoenigKarsten

Cox Orange
Registriert
18.08.07
Beiträge
101
warum übergibst du dann in deinem formular nicht einfach $path und $result und setzt $fullpath nicht einfach nach dem upload zusammen??

also formular füllen, beim senden dateihochladen und dann in dem script für den datenbankeintrag fullpath ergänzen und eintragen?
 

drok

Klarapfel
Registriert
02.06.07
Beiträge
278
also formular füllen, beim senden dateihochladen und dann in dem script für den datenbankeintrag fullpath ergänzen und eintragen?

Das war auch mein zweiter Gedanke, bisher mache ich das bei allen Tools die mit einem Formular laufen. Daten senden, im Script entwerten, Zusammensetzen und ab in die DB.

Das ist irgendwie die bequemste Methode und man kann ganz leicht Abfangroutinen einbauen.
 

Decomposition

Antonowka
Registriert
09.12.06
Beiträge
363
Ah super, so funktioniert's tatsächlich. Danke euch und frohes Neues Jahr ^^