Vorheriges Thema: Nächstes Thema: |
Autor |
Nachricht |
marck48 Häufiger Poster
Anmeldungsdatum: 10.02.2009 Beiträge: 25 Wohnort: Eberswalde
|
Verfasst am: 10.02.2009 12:31:35 Titel: Bild Upload per php |
|
|
Hallo,
ich habe folgendes Problem und ich hoffe man kann mir helfen...
bin Anfänger was php betrifft.
über folgendes script übertrage ich fotos die in ein verzeichnis auf dem server gespeichert werden und dessen name in einer msql-datenbank gespeichert wird.
Nun habe ich festgestellt das schon vorhandene Bilder überschrieben werden. Meine Frage wie kann ich das verhindern.
Vielen Dank für die Hilfe
Hier das Script das ich benutze
<?
{
$file = $_FILES['userfile']['tmp_name']; // Temporary filename in which the uploaded file was stored on the server
$filename = $_FILES['userfile']['name']; // Original name of the file on the client machine
$filesize = $_FILES['userfile']['size']; // filesize in bytes
$path = "fotos/"; // Pfad zum Upload Verzeichnis
if (file_exists($file)) echo('<p class="upload" align="center">1. Foto wurde gefunden!</p>'); else echo ('<p class="upload" align="center">1. Foto wurde nicht gefunden!</p>');
if (!file_exists($path.$filename)){ // File exists verification
if(!copy($file,$path.$filename)) echo " <font color='red'>".$message["uncomplete"]."</font><br><br>";
else echo " <font color='red'>".$message["complete"]."</font><br><br>";
} else {
echo " <font color='red'>".$message["fileexists"]."</font><br>";
} |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Frosty Häufiger Poster
Anmeldungsdatum: 27.10.2008 Beiträge: 221
|
Verfasst am: 10.02.2009 12:46:18 Titel: |
|
|
Ich versteh nicht ganz. Bilder mit gleichem Namen werden im Verzeichnis überschrieben? Oder in der Datenbank? Wobei ich in deinem Code-Schnipsel keine Datenbank-Implementierung sehe. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
marck48 Häufiger Poster
Anmeldungsdatum: 10.02.2009 Beiträge: 25 Wohnort: Eberswalde
|
Verfasst am: 10.02.2009 12:55:05 Titel: Bild Upload per php |
|
|
Hallo
zB ladet jemand das Foto mit dem Namen foto.jpg hoch das aber in dem Ordner wohin die Fotos auf dem Server gespeichert werden schon vorhanden ist. Also wird es überschrieben. wie kann ich das verhindern?
hier nochmal der code
<?
{
$file = $_FILES['userfile']['tmp_name']; // Temporary filename in which the uploaded file was stored on the server
$filename = $_FILES['userfile']['name']; // Original name of the file on the client machine
$filesize = $_FILES['userfile']['size']; // filesize in bytes
$path = "fotos/"; // Pfad zum Upload Verzeichnis
if (file_exists($file)) echo('<p class="upload" align="center">1. Foto wurde gefunden!</p>'); else echo ('<p class="upload" align="center">1. Foto wurde nicht gefunden!</p>');
if (!file_exists($path.$filename)){ // File exists verification
if(!copy($file,$path.$filename)) echo " <font color='red'>".$message["uncomplete"]."</font><br><br>";
else echo " <font color='red'>".$message["complete"]."</font><br><br>";
} else {
echo " <font color='red'>".$message["fileexists"]."</font><br>";
}
if ($submit) {
$db = mysql_connect("localhost", "Uxxxx","pass");
mysql_select_db("DBxxxx",$db);
$sql = "INSERT INTO oldtimer (anr,firmenname,vorname,name,email_besitzer,tel_besitzer,auto_typ,motorrad_typ,fahrrad_typ,ersatzteile,gesuche,plz,plz_moto,plz_rad,plz_gesuch,plz_ersatz,ort,strasse,baujahr,moto_baujahr,rad_baujahr,gesuch_baujahr,ersatz_baujahr,kilometer,moto_kilometer,gesuch_kilometer,leistung,moto_leistung,preis,moto_preis,rad_preis,gesuch_preis,ersatz_preis,rad_marke,gesuch_marke,ersatz_marke,rad_groesse,rad_zustand,beschreibung,userfile,userfile1,userfile2,userfile3,modell,farbe,bauart,moto_bauart,gesuch_bauart,ersatz_bauart,literatur,ersatz,datum,deutsch) VALUES
('$anr','$firmenname','$vorname','$name','$email_besitzer','$tel_besitzer','$auto_typ','$motorrad_typ','$fahrrad_typ','$ersatzteile','$gesuche','$plz','$plz_moto','$plz_rad','$plz_gesuch','$plz_ersatz','$ort','$strasse','$baujahr','$moto_baujahr','$rad_baujahr','$gesuch_baujahr','$ersatz_baujahr','$kilometer','$moto_kilometer','$gesuch_kilometer','$leistung','$moto_leistung','$preis','$moto_preis','$rad_preis','$gesuch_preis','$ersatz_preis','$rad_marke','$gesuch_marke','$ersatz_marke','$rad_groesse','$rad_zustand','$beschreibung','$filename','$filename1','$filename2','$filename3','$modell','$farbe','$bauart','$moto_bauart','$gesuch_bauart','$ersatz_bauart','$literatur','$ersatz','$datum','$deutsch')";
$result = mysql_query($sql,$db);
echo ('<p class="upload" align="center">Ihre Daten wurden abgeschickt! - Vielen Dank!<br><br></p>');
}
} |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Frosty Häufiger Poster
Anmeldungsdatum: 27.10.2008 Beiträge: 221
|
Verfasst am: 10.02.2009 13:30:30 Titel: |
|
|
Heyjo,
also du kannst jeder hochgeladenen Datei einen eigenen Namen verpassen, mit fortlaufender Nummer.
In deinem Fall ist das die Variable $filename.
Sinnvoll ist es zu gucken, wieviele Dateien denn schon im Foto-Verzeichnis vorhanden sind. Stichwort: scandir()
Anzahl dann + 1 und du hast eine variable Nummer für das Bild, die einmalig ist. MIME-Typ des Bildes müsstest du natürlich dann abfangen mit
Code: |
$_FILES['userfile']['type'] |
damit dein Programm weiss, welchen Typ das Bild hat.
Ja, sieht nach einem spannenden Projekt aus. Bei der Menge von Daten die du da in deiner Tabelle speicherst, solltest du dir mal über Normalisierung von Datenbanken Gedanken machen. Soweit ich sehen kann wird einfach alles in die Tabelle oldtimer gespeichert. Das gibt über kurz oder lang Redundanzen (Doppelte einträge).
Stell dir mal vor es gibt jemanden, der hat mehrere Oldtimer, die aber an verschiedenen Adressen stehen oder verschiedenen Baujahrs sind. Du müsstest für jeden dieser Wagen einen neuen Datensatz anlegen, der immer wieder den selben Besitzernamen enthält. Was aber machst du wenn der Besitzer seine Adresse ändert. Du müsstest die gesamte Tabelle durchlaufen und jeden einzelnen Datensatz der diesen Besitzer enthält ändern. Das geht extrem zu Lasten der Performanz deiner Datenbank.
Hoffentlich bist du jetzt nicht entrüstet.
LG
Frost |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
marck48 Häufiger Poster
Anmeldungsdatum: 10.02.2009 Beiträge: 25 Wohnort: Eberswalde
|
Verfasst am: 10.02.2009 13:44:27 Titel: Bild Upload per php |
|
|
Ersteinmal Danke für die Hilfe,
da ich aber ein Anfäger bin würde ich dich darum bitten mir zu schreiben was ich genau an dem script ändern muß das wär sehr nett von dir
vielen Dank marck |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Frosty Häufiger Poster
Anmeldungsdatum: 27.10.2008 Beiträge: 221
|
Verfasst am: 10.02.2009 14:04:48 Titel: |
|
|
Code: |
$file = $_FILES['userfile']['tmp_name'];
$filesize = $_FILES['userfile']['size'];
$path = "fotos/";
//Type abfangen
$filetype = $_FILES['userfile']['type'];
switch($filetype)
{
case "image/pjpeg":
$type = ".jpg";
break;
case "image/gif":
$type = ".gif";
break;
case "image/jpeg":
$type = ".jpg";
break;
case "image/x-png":
$type = ".png";
break;
//usw.
}
//anzahl der dateien im Verzeichnis
$all_files = count(scandir($path)) - 2;
//Jetzt individuellen Namen für das Bild generieren
$myFilename = "bild_".$all_files.$type;
if (!file_exists($path.$myFilename))
{
if(!copy($file,$path.$myFilename))
echo "Konnte nicht speichern.";
else
echo "Gespeichert.";
}
else
{
echo "Foto schon vorhanden.";
} |
|
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
marck48 Häufiger Poster
Anmeldungsdatum: 10.02.2009 Beiträge: 25 Wohnort: Eberswalde
|
Verfasst am: 10.02.2009 14:28:52 Titel: Bild Upload per php |
|
|
Ist das jetzt der komplette code oder nur die zeilen die geändert werden müssen...
tut mir leid aber ich muß noch viel lernen
gruß
marck |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Frosty Häufiger Poster
Anmeldungsdatum: 27.10.2008 Beiträge: 221
|
Verfasst am: 10.02.2009 14:39:06 Titel: |
|
|
Hm, teils teils...
also Ausgangscode ist dein vorvorletzter Post.
Alles mit neuen Code ersetzen bis Zeile
Wobei die Ausgaben (echo) von mir geändert wurden und du sie ruhig mit deinen wieder austauschen kannst. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
marck48 Häufiger Poster
Anmeldungsdatum: 10.02.2009 Beiträge: 25 Wohnort: Eberswalde
|
Verfasst am: 10.02.2009 14:58:22 Titel: Bild Upload per php |
|
|
Hab das jetzt so geändert und hab folgenden fehler angezeigt bekommen
Fatal error: Call to undefined function: scandir() in /mnt/web1/53/49/520549/htdocs/immobilien/upload.php on line 365 |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Frosty Häufiger Poster
Anmeldungsdatum: 27.10.2008 Beiträge: 221
|
Verfasst am: 10.02.2009 15:00:28 Titel: |
|
|
Ja, dann nutzt dein Webserver noch kein php5.
Erstell mal eine neue php-Datei und schreib
Code: |
<?php
phpinfo();
?> |
rein. und sag mir dann, welche php-version der Webserver nutzt. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
marck48 Häufiger Poster
Anmeldungsdatum: 10.02.2009 Beiträge: 25 Wohnort: Eberswalde
|
Verfasst am: 10.02.2009 15:11:13 Titel: Bild Upload per php |
|
|
Jetzt kam die meldung "konnte nicht speichern" |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Frosty Häufiger Poster
Anmeldungsdatum: 27.10.2008 Beiträge: 221
|
Verfasst am: 10.02.2009 15:17:33 Titel: |
|
|
Ist ziemlich schwer, dir da zu helfen. Wenn du kein PHP5 laufen hast und du auch nicht die möglichkeit hast, auf php5 zu updaten, dann ersetzte zeile:
Code: |
$all_files = count(scandir($path)) - 2; |
mit
Code: |
$file_open = opendir($path);
$all_files = 0;
while ($file = readdir ($file_open))
{
if(!is_dir($file))
{
$all_files++;
}
}
closedir($file_open); |
|
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Frosty Häufiger Poster
Anmeldungsdatum: 27.10.2008 Beiträge: 221
|
Verfasst am: 10.02.2009 15:21:14 Titel: |
|
|
Natürlich steht da "Konnte nicht speichern.", weil noch keine Datei gesendet wurde.
Ich hoffe sehr, dass du ein Formular hast, mit welchem der User sein Bild uploaden kann. Idealerweise trägt das Upload-Steuerelement den Namen "userfile". Erst wenn dieses gesendet wurde, kann das Script das bild auch speichern. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
marck48 Häufiger Poster
Anmeldungsdatum: 10.02.2009 Beiträge: 25 Wohnort: Eberswalde
|
Verfasst am: 10.02.2009 17:30:23 Titel: Bild Upload per php |
|
|
So das Foto wird jetzt in den ordner gespeichert als bild_2 usw. leider werden die anderen daten nicht in die DB geschrieben.
Was muß ich noch ändern wenn ich mehrere fotos übertragen will
Vielen Dank für die Hilfe
Gruß
marck |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Frosty Häufiger Poster
Anmeldungsdatum: 27.10.2008 Beiträge: 221
|
Verfasst am: 11.02.2009 09:33:56 Titel: |
|
|
Der Name der Variable hat sich durch das neue skript geändert.
vorher: $filename
jetzt: $myFilename
Das musst du auch im SQL-Query ändern. Ich vermute mal dass das dafür vorgesehene Feld in der Tabelle userfile ist.
Zitat: |
Was muß ich noch ändern wenn ich mehrere fotos übertragen will |
Nun ja, jetzt haben wir wieder ein Problem. Wenn ein User mehrere Bilder hochladen möchte, dann kommst du mit einer Tabelle niemals mehr hin. Es sei denn du erstellst genau den gleichen Datensatz, nur mit einem anderen Bildnamen. Und das ist das Problem, welches ich zuvor schon ansprach -> Redundanzen (doppelte Einträge).
Du musst also eine zweite Tabelle erstellen, in welcher du die Bildnamen mit zugehörigen User ablegst.
Dafür müssen deine User eine eindeutige ID bekommen (Primärschlüssel) in deiner ersten Tabelle. Also erstelle in deiner ersten Tabelle eine neue Spalte "user_ID", die du als Primärschlüssel deklarierst, am besten mit fortlaufender Nummer (inkrementieren). Ich gehe davon aus, dass du schon etliche Datensätze in der Tabelle hast, deswegen müsstest du die vorhandenen Datensätzen manuell (evtl. mit einem kleinen Skript) mit einer ID belegen. alle Folgenden bekommen dann automatisch die nächst höhere ID.
Dann erstelle eine zweite Tabelle (Bsp: T_Userbilder) mit den Feldern bild_id, user_ID, bild_name. Hier kannst du jetzt alle Bilder speichern, die ein User ablegen will. In user_ID muss die entsprechende user ID der ersten Tabelle 'oldtimer' stehen. Primärschlüssel sollte dann bild_id sein. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|
|