Antworten auf deine Fragen:
Neues Thema erstellen

php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, wie?

sphinxxx

Noch nicht viel geschrieben

hallo,

nach einer woche erfolglosen probierens wende ich mich wieder an euch und hoffe auf freundliche hilfe und leicht verständliche erklärungen für php/mysql-dummies:)

problem: ich habe ein formular, dass dem user ermöglichen soll, ein foto hochzuladen (<input type="file"... />). nun soll das bild in ein außerhalb der datenbank liegendes verzeichnis (z.b. ) gespeichert werden und der reine bildname (also z.b. tiger.jpg) ohne pfadangabe und verlinkung in der datenbank-tabellenspalte "tierbild" ausgegeben werden. wie löse ich das?

danke schon mal und grüße an alle,

lara
 

DarkFather

Nicht mehr ganz neu hier

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Ganz klassisch mit move_uploaded_file():

PHP:
$uploadfile = $_SERVER['DOCUMENT_ROOT']."/images/".basename($_FILES["userfile"]["name"]);
move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploadfile);

In die Datenbank schreibst du die anderen Infos
$_FILES['userfile']['name']
$_FILES['userfile']['type']
$_FILES['userfile']['size']

Und vergiss nicht eine Kontrolle einzufügen, z.B. if(getimagesize($_FILES["userfile"]["tmp_name"]) > 0)

Weiteres in der php-Doku: .
Oder einfach nochmal fragen.

MfG
Dark
 

dlogic

Allrounder

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Nur Links posten bringt garnichts wenn man es nichtmal erklären kann...
Wiso? Es steht doch dort... falls dabei Fragen auftauchen beantworte ich diese gerne. Eine komplett Anwort mit Schritt für Schritt Anweisungen hierfür zu posten, kommt einem Tutorial gleich.

Aber ich stelle gerne die Frage an die Thread Erstellerin... womit genau hast du denn das Problem? Z.B. in den folgenden Steps welche für eine Umsetzung notwendig sind.

- Beim Eintragen der Daten in die DB
- Beim Gestalten des Upload Formulars
- Beim Schreiben des PHP Codes für das Upload des Bildes
- Beim Schreiben des PHP Codes für das Speichern der Daten in die DB
- Beim Abfangen von Fehlern
- Benötigst du einen Überblick über den kompletten Ablauf in Form eines Flußdiagramms?

@PHP c0mu
Dein Kommentar hat mit dem Thema nichts zu tun! Meiner hingegen wenigstens... wenn auch nicht die komplett Lösung, welche ich hier auch in Form kompletter Dateien mit Administrations GUI anbieten könnte... hilft hier jedoch genauso wenig wie dein Kommentar.
 
Zuletzt bearbeitet:

sphinxxx

Noch nicht viel geschrieben

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Hallo,


erst mal vielen Dank für eure Antworten.

Ich hatte es schon mit "move_uploaded_file" versucht, doch ist wohl ein Fehler in meinem Script (das Bild wird weder in den externen Ordner geladen, noch wird der Bildname in der Datenbank gespeichert).

Hier das Script:


PHP:
<?php
// Verbindung zum Datenbankserver
$db = @mysql_connect('Servername', 'Benutzer', 'Passwort');
if (!$db) {
exit('<p>Verbindungsaufbau zum Datenbankserver ' .
' zurzeit nicht möglich.</p>');
}
// Datenbank auswählen
if (!@mysql_select_db('Datenbankname')) {
exit('<p>Auswahl der Datenbank' .
'zurzeit nicht möglich.</p>');
}
// Bilder hochladen - File upload
if (isset($_POST["abschicken"])) {
$dateiname = $_FILES['dateiname']['name'];
$tmp_name = $_FILES['dateiname']['tmp_name'];
if (!isset($dateiname)) {exit;}
// Fehlermeldungen generieren
if(!is_uploaded_file($tmp_name)) {
echo 'Fehler!<br><ul>';
switch ($_FILES['dateiname']['error']) {
case 1: echo "<li>Die Datei überschreitet die
maximale Größe von 1 Megabyte.";
break;
case 2: echo "<li>Die Datei überschreitet die
maximale Größe von $_POST[MAX_FILE_SIZE] Bytes.";
break;
case 3: echo "<li>Die Datei wurde nur
teilweise übertragen.";
break;
case 4: echo "<li>Sie haben vergessen,
die Datei, die hochgeladen werden soll, anzugeben.";
break;
}
echo "</li></ul>";
exit;
}
// Festlegen des Pfades mit Dateinamen.
$uploadname ="http://www.domainname/images/$dateiname";
move_uploaded_file($tmp_name,$uploadname);
// Einfügen des Datensatzes
$sql = "INSERT INTO Tabellenname (Tierbild)
Values ('$dateiname')"
or die ("SQL-Fehler = ".mysql_error());
$rs = mysql_query($sql);
mysql_close($verbindung);
}
?>


Und hier die wesentlichen Auszüge aus meinem Formular:


HTML:
<form id="..." action="formular.php" method="post" enctype="multipart/form-data">
<table class="...">
<tr>
<td><input type="hidden" name="MAX_FILE_SIZE" value="1024"></td>
<td><input type="file" name="dateiname"></td>
</tr>
</table>
<table class="...">
<tr>
<td><input type="hidden" name="abschicken" value="1"></td>
<td><input type="image" name="submit" src="..." class="..." /></td>
</tr>
</table>
</form>


Es wäre schön, wenn ihr mir sagen könntet, wo der Fehler/die Fehler liegen und sie mir netterweise korrigieren könntet...stehe auf dem Schlauch:rolleyes:


Danke und Grüße,


Lara
 

Paric

von allem ein bisschen

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Hallo Lara,

nimm mal den absoluten Pfad raus, und mache daraus mal einen relativen pfad:

PHP:
$uploadname ="http://www.domainname/images/$dateiname";

in:

PHP:
$uploadname ="images/$dateiname";

Gruß,
Paric
 

DarkFather

Nicht mehr ganz neu hier

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Und achte auf die Schreibrechte.
Gibt es denn eine Ausgabe? Irgend ein Fehler oder nur Stillschweigen?
Denn wenn auch der Upload nicht geht sollte zumindest die Tabelle aktualisiert werden.

Wobei ich diese Zeile nicht ganz nachvollziehen kann:
PHP:
$sql = "INSERT INTO Tabellenname (Tierbild)
Values ('$dateiname')"
or die ("SQL-Fehler = ".mysql_error());

der SQL-Fehler kann doch erst nach mysql_query überhaupt passieren, also macht das vorher keinen Sinn.

MfG
Dark

P.S.
$db = @mysql_connect
mysql_close($verbindung);

Copy & Paste ist schön und gut, aber da musst extrem aufpassen...

//Edit
Eine Frage noch: warum liest du nicht die erste Antwort? Dann wäre das Problem mit dem relativen Pfad nicht entstanden, ich habe sogar eine Superglobale ($_SERVER['DOCUMENT_ROOT']) verwendet, weil viele sowieso nicht wissen wo ihre Website genau liegt...
 
Zuletzt bearbeitet:

sphinxxx

Noch nicht viel geschrieben

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Hi,

war verreist und habe erst heute mein Script mit der anderen (relativen?) Pfadangabe testen können. Leider wird kein Bild in das externe Verzeichnis geladen. Eine Fehlermeldung erscheint auch nicht. In der Datenbank steht in der Spalte Tierbild "Null". Alle anderen Daten wurden hochgeladen.Habe jetzt mal bei meinem Prof. angefragt, ob wir Studenten wirklich Schreibrechte für das externe Verzeichnis haben...gehe jedoch davon aus. Was könnte sonst noch an meinem Script falsch sein?

Danke für eure Hilfe.

Grüße,

Lara
 

DarkFather

Nicht mehr ganz neu hier

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Mach einfach mal ein paar Debug-Ausgaben und Poste was passiert...

Hier der Code zum Debuggen:
Oben im Script:
PHP:
echo "<pre>";
echo "FILES:"; print_r($_FILES);
echo "POST"; print_r($_POST);

Und evtl. noch echo "SQL: $sql"; natürlich weiter unten im Script, sobald $sql verfügbar ist...

Da bin ich mal gespannt...
MfG
Dark
 

dlogic

Allrounder

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Ja, die Ausgaben würden mich auch mal interessieren. Als Tipp, dies ist meist der erste Schritt um fest zu stellen welche Daten an das verarbeitende Script gesendet werden. Firebug kann hierbei ebenfalls gute Dienste leisten.

Zum Script: So wie das Filehandling gemacht wird, empfinde ich das Ganze als durcheinander. Ebenfalls die Deklaraion der Variablen.

Upload Dir und move_uploaded_file
PHP:
//Deklaration Upload Verzeichnis: Wenn der Ordner images auf gleicher Ebene liegt wie das Script. Hier wird nur ein Verweis in den Ordner gegeben... der Dateiname ($dateiname bei dir) wird hier nicht benötigt.

$upload_dir = 'images/';

//Die Datei wird in das  $upload_dir verschoben. Im Anschluss setzte ich noch die 644 Berechtigung für das File.

if (move_uploaded_file($_FILES['dateiname']['tmp_name'], $upload_dir.$_FILES['dateiname']['name'])) {
       chmod($upload_dir.$_FILES['dateiname']['name'],0644);
}
Tipp: Sollte die Zieldatei bereits existieren, wird sie überschrieben.

Es sollten in deinem Script noch Mechanismen greifen welche die Filegröße und die Fileart (Suffix- und Mime-Type Überprüfung) überprüfen. Ebenfalls ob eine Datei mit gleichem Namen bereist vorhanden ist und ob die Datei mittels HTTP-POST upgeloadet wurde.

Futter:
PHP:
//Wenn die Datei hochgeladen wurde... 
if (is_uploaded_file($_FILES['dateiname']['tmp_name'])) { 
    //dann bitte überprüfe...

// Der Mime-Type der Datei
$_FILES['dateiname']['type']

//Die Größe der hochgeladenen Datei in Bytes
$_FILES['dateiname']['size']

//... nachdem alle Prüfungen überstanden sind, erst dann wird das File in $upload_dir verschoben.
}
Evtl. auch hilfreich: http://www.psd-tutorials.de/tutorials/web/php/-/view/819--sicheres-datei-upload
 
Zuletzt bearbeitet:

sphinxxx

Noch nicht viel geschrieben

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Also wenn ich debugge, kommt das raus:

PHP:
FILES:Array
(
)
POSTArray
(
)
SQL:

Bin jetzt etwas verzweifelt:(

Nur damit es kein Missverständnis gibt: Die Bilder sollen in ein Verzeichnis hochgeladen werden, das auf einem anderen Server liegt als meine Webseite. Muss dann nicht doch ein absoluter Pfad eingegeben werden?

Grüße Lara
 

dlogic

Allrounder

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Hm, dein Debug sieht so aus als wenn keine Daten gesendet werden und somit auch keine in die DB geschrieben werden. Das kann so nicht stimmen, da du ja gesagt hast das Daten in die DB geschrieben werden.

Beim Hochladen von Bildern ist es egal ob diese einen relativen oder absoluten Pfad erhalten. Wobei ich persönlich den absoluten bevorzuge und mir diesen aus den $_SERVER Variablen + das Upload Dir zusammensetze.

Um zurück zu deinem Problem zu kommen... kannst du hier bitte den aktuellen Stand des Scripts mit HTML Code posten? Bzw. als Dateidownload angeben? Ich denke da ist einiges mixed up.
 

sphinxxx

Noch nicht viel geschrieben

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

hallo dlogic,

kurz vorweg: euer hinweis bzgl. der schreibrechte war völlig richtig. mein prof. hatte vergessen, das verzeichnis für die bilder mit den entsprechenden rechten zu versehen. allerdings klappt mein script dennoch nicht...zumindest was den bilderupload betrifft. mein prof. meint, er habe nun den usernamen für das bild-verzeichnis (images) geändert. nennen wir den usernamen hier mal xxx. muss xxx denn irgendwo im script eingetragen werden? (xxx ist nicht identlisch mit dem usernamen für die datenbank - das ist aber wohl, denke ich, in dem fall egal, oder?).

hier mein script für das komplette formular mit bilder-upload:

PHP:
<?php
if (isset($_POST['tierart']) && isset($_POST['tiername']) && isset($_POST['merkmale']) && $_POST['tierart'] != '' && $_POST['tiername'] != '' && $_POST['merkmale'] != '') {
try {
$db = new MySQLi ('Hostname', 'User', 'Passwort', 'Datenbankname');
$sql = sprintf('INSERT INTO Tiere (Tierart, Tiername, Merkmale) VALUES (\'%s\', \'%s\', \'%s\')',
$db->real_escape_string($_POST['tierart']),
$db->real_escape_string($_POST['tiername']),
$db->real_escape_string($_POST['merkmale']));
$db->query($sql);
echo '<p>' . 'Vielen Dank. Ihr Text wurde versendet!' . '<br /><br />' . 'Was m&ouml;chten Sie als n&auml;chstes tun?' . '<br /><br />' . '<a href="index.php">Neuen Text eingeben</a>' . '<br /><br />' . '<a href="../index.html">Zur&uuml;ck zur Startseite</a>' . '</p>';
} catch (Exception $e) {
echo 'Fehler' . htmlspecialchars($e->getMessage());
  }
 }
?>
<?php
$db = @mysql_connect('Hostname', 'User', 'Passwort');
if (!$db) {
exit('<p>Verbindungsaufbau zum Datenbankserver ' .
' zurzeit nicht möglich.</p>');
 }
// Datenbank auswählen
if (!@mysql_select_db('Datenbankname')) {
exit('<p>Auswahl der Tierdatenbank' .
'zurzeit nicht möglich.</p>');
}
$query_tierart = "SELECT Tierart FROM Tiere";
$tierart = mysql_query($query_tierart) or die(mysql_error());
$row_tierart = mysql_fetch_assoc($tierart);
$totalRows_tierart = mysql_num_rows($tierart);
// Bilder hochladen - File upload
if (isset($_POST["abschicken"])) {
  $dateiname = $_FILES['dateiname']['name'];
  $tmp_name = $_FILES['dateiname']['tmp_name'];
  if (!isset($dateiname)) {exit;}
  // Definition unterschiedlicher Fehlermeldungen
  if(!is_uploaded_file($tmp_name)) {
    echo 'Fehler!<br><ul>';
    switch ($_FILES['dateiname']['error']) {
        case 1: echo "<li>Die Datei überschreitet die
                maximale Größe von 1 Megabyte.";
                break;
        case 2: echo "<li>Die Datei überschreitet die
                maximale Größe von $_POST[MAX_FILE_SIZE] Bytes.";
                break;
        case 3: echo "<li>Die Datei wurde nur
                teilweise übertragen.";
                break;
        case 4: echo "<li>Sie haben vergessen,
                die zu überspielende Datei anzugeben.";
                break;
    }
    echo "</li></ul>";
    exit;
  }
// Festlegen des Pfades mit Dateinamen.
  $uploadname ="http://www.URL = Datenbank-Hostname.de/images/$dateiname";
   move_uploaded_file($tmp_name,$uploadname);
  // Ausgabe auf dem Bildschirm zur Bestätigung.
  printf("Die Datei <b>%s</b> befindet sich auf dem Webserver im Ordner
            <b>%s</b>!<br>\n",
                  $_FILES['dateiname']['name'], $uploadname);
  printf("Sie ist <b>%s Bytes</b> groß und vom Typ <b>%s</b>.
            <br>\n", $_FILES['dateiname']['size'],
                  $_FILES['dateiname']['type']);
 // Einfügen des Datensatzes
    $sql = "insert into Tiere (Tierbild)
            Values ('$dateiname')"
            or die ("SQL-Fehler = ".mysql_error());
    $rs = mysql_query($sql);
    mysql_close($verbindung);
}
?>

was den upload-pfad betrifft, habe ich es auch schon mit den von euch genannten varianten probiert, klappte aber trotzdem nicht.

Hier mein HTML-Formular:

HTML:
<div id="inhalt">
       <form action="formular.php"  method="post" enctype="multipart/form-data">
       <table>
       <tr>
       <td>Tierart</td>
       <td><select name="tierart"><?php do { ?>
       <option value="<?php echo $row_tierart['Tierart']; ?>"><?php echo $row_tierart['Tierart']; ?></option>
       <?php } while ($row_tierart = mysql_fetch_assoc($tierart)); ?></td>
       </tr>
       <tr>
       <td>Tiername</td>
       <td><input type="text" name="tiername" size="30" /></td>
       </tr>
       <tr>
       <td>Merkmale</td>
       <td><textarea name="merkmale" cols="30" rows="10"></textarea></td>
       </tr>
       <tr>
       <td><input type="hidden" name="MAX_FILE_SIZE" value="1024"></td>
       <td><input type="file" name="dateiname"></td>
       </tr>
       </table>
       <table>
       <tr>
       <td><input type="hidden" name="abschicken" value="1"></td>
       <td><input type="image" name="submit" src="../images/sendebutton.jpg" /></td>
       </tr>
       </table>
       </form>
     </div><!-- Ende Inhalt -->

bitte nicht meckern, wenn das script allzu chaotisch aussieht. bin gerade erst beim erlernen der basics von php... schaffe es daher noch nicht, die aufgaben selbstständig zu lösen.

vielen dank für eure hilfe.

grüße,

lara
 

Paric

von allem ein bisschen

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

öhm... da du die Datei auf einem völlig anderen Server speichern willst, wird wohl Dein gewählter Weg nicht zum ziel führen. Was Du brauchst, sind die ftp-Funktionen von PHP. Leider habe ich mich damit noch nicht beschäftigt, so das ich mich jetzt auch erstmal reinlesen müsste, aber das kannst Du sicher alleine denke ich :)

Gruß,
Paric
 

dlogic

Allrounder

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

@Paric
woher nimmst du die Info dass das Script auf einem anderen Server liegt als der Ordner für den Image Upload?

@sphinxxx
Nehmen wir an deine lokale Datei heißt example.jpg
Du weist ja nun im Script der Variablen $dateiname folgendes zu:
PHP:
$dateiname = $_FILES['dateiname']['name'];
//das wäre wie $dateiname = example.jpg
//und dem Verzeich folgendes:
$uploadname ="http://www.URL = Datenbank-Hostname.de/images/$dateiname";

//somit würde der Upload Pfad wie folgt aussehen:
http://www.domain.de/images/example.jpg
Das sollte ja so nicht sein... sondern eher ../images/xxx/
Um den Pfad auf xxx zu münzen kann man folgendes als upload dir festlegen

PHP:
$uploadname = 'images/xxx/';

Fange bitte nochmal alle gesendeten Daten ab!
PHP:
echo "<pre>";
    print_r($_POST);
echo "</pre>";

Das schreibe bitte vor dem "if (isset($_POST['tierart']" ...
 
Zuletzt bearbeitet:

Paric

von allem ein bisschen

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

Nur damit es kein Missverständnis gibt: Die Bilder sollen in ein Verzeichnis hochgeladen werden, das auf einem anderen Server liegt als meine Webseite. Muss dann nicht doch ein absoluter Pfad eingegeben werden?

Grüße Lara

Da hat sie es doch geschrieben :)
 

sphinxxx

Noch nicht viel geschrieben

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

hallo dlogic,

paric nimmt bezug auf meinen hinweis weiter oben im thread:

Nur damit es kein Missverständnis gibt: Die Bilder sollen in ein Verzeichnis hochgeladen werden, das auf einem anderen Server liegt als meine Webseite. Muss dann nicht doch ein absoluter Pfad eingegeben werden?

will heißen: die datei mit dem script liegt auf meinem webspace, datenbank und upload-ordner liegen auf dem server meines profs.

also ftp-funktionen von php einbinden, wie paric sagt? ohje...

grüße,

lara
 

Paric

von allem ein bisschen

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

auf die datenbank die auf einem anderen Server liegt kann man imho sowieso nicht von extern drauf zugreifen, das geht nur mit einem script auf dem gleichen Server...
 

dlogic

Allrounder

AW: php + mysql: bildupload in ext. verzeichnis + bildnamen in datenbank speichern, w

aha, überlesen... ja, dann funktioniert sowas nur mit ftp-funktionen. Da ja ein Script von einem beliebigen Server ja nicht irgendwo Dateien hochladen sollte...

Damit habe ich mich jedoch auch noch nicht beschäftigt....
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.613
Beiträge
1.538.345
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben