• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

PHP Datei Upload

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
Hallo Community,

ich habe ein Datei-Upload-Script für Bilddateien geschrieben was soweit ganz gut funktioniert. Die Bilder werden hochgeladen und in einem Ordner abgespeichert. Doch ich würde das Script gerne in sofern erweitern das die hochgeladenen Bilder im Prinzip unterschiedliche Namen haben. Ich würde dafür ganz gerne einem hochgeladenem Bild die id des jeweiligen Users anhängen. Das ganze mit der Variable "$id".

Hier das Script:
Code:
<?php
$upload_folder = 'upload/'; //Das Upload-Verzeichnis
$filename = "profilbild_user".$id;
$extension = strtolower(pathinfo($_FILES['datei']['name'], PATHINFO_EXTENSION));
 
 
//Überprüfung der Dateiendung
$allowed_extensions = array('png', 'jpg', 'jpeg', 'gif');
if(!in_array($extension, $allowed_extensions)) {
    die("Ungültige Dateiendung. Nur png, jpg, jpeg und gif-Dateien sind erlaubt");
}
 
//Überprüfung der Dateigröße
$max_size = 500*1024; //500 KB
if($_FILES['datei']['size'] > $max_size) {
    die("Bitte keine Dateien größer 500kb hochladen");
}
 
//Überprüfung dass das Bild keine Fehler enthält
if(function_exists('exif_imagetype')) { //Die exif_imagetype-Funktion erfordert die exif-Erweiterung auf dem Server
    $allowed_types = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF);
    $detected_type = exif_imagetype($_FILES['datei']['tmp_name']);
    if(!in_array($detected_type, $allowed_types)) {
        die("Nur der Upload von Bilddateien ist gestattet");
    }
}
 
//Pfad zum Upload
$new_path = $upload_folder.$filename.'.'.$extension;
 
//Neuer Dateiname falls die Datei bereits existiert
if(file_exists($new_path)) { //Falls Datei existiert, hänge eine Zahl an den Dateinamen
    $Anzahl = 1;
    do {
        $new_path = $upload_folder.$filename.'_'.$id.'.'.$extension;
        $id++;
    } while(file_exists($new_path));
}
 
//Alles okay, verschiebe Datei an neuen Pfad
move_uploaded_file($_FILES['datei']['tmp_name'], $new_path);
echo 'Bild erfolgreich hochgeladen: <a href="'.$new_path.'">'.$new_path.'</a>';
?>

Ich glaube es geht im wesentlichen um Zeile 3. Die Bilder werden zwar auch hochgeladen, jedoch besitzen alle Bilder den Namen "profilbild_user.jpg" und ich möchte das hinten noch die jeweilige id des Users angehangen wird.
Ich hoffe ihr versteht was ich meine und könnt mir eventuell helfen :)
 

hillepille

Melrose
Registriert
19.07.09
Beiträge
2.508
Hi, wo kommt denn die ID in Zeile 3 her? In dem Script hier muss die Variabkle $id leer sein, die wird nirgendwo vorher intialisiert. Falls es noch Scriptteile vor dem hier einsehbaren Code gibt, dann prüf doch mal vor Zeile 3 den Inhalt der Variablen $id.

Ausserdem gehe ich daovn aus, dass hier ein Fehler im Script ist, das müsste doch so lauten wenn ich dich richtig verstehe. Jedenfalls wäre es unklug die (vermutlich eindeutige) ID des Users per Iteration hochzusetzen. Und die User-ID ($id) steckt ja schon in der Variablen $new_path, sofern die $id in Zeile 3 nicht leer ist.

Code:
if(file_exists($new_path)) { //Falls Datei existiert, hänge eine Zahl an den Dateinamen
    $Anzahl = 1;
    do {
        $new_path = $upload_folder.$filename.'_'.$Anzahl.'.'.$extension;
        $Anzahl++;
    } while(file_exists($new_path));
}
 

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
@hillepille Hey, die Variable $id in meinem Script ist Bestandteil meiner Datenbank. Die neu registrierten User bekommen in meiner Datenbank eine id zugewiesen. Eben genau diese id möchte ich anhängen lassen. So erhoffe ich mir nämlich später die hochgeladenen Bilder eines Users auslesen zu können und anzeigen zu lassen :) Hast du ne Ahnung wie ich das bewerkstelligen kann ?

und in wie fern steckt die Variable $id bereits in $new_path ?
 

hillepille

Melrose
Registriert
19.07.09
Beiträge
2.508
Ja, das kann ja sein, in deinem hier gezeigten Scriopt fehlt aber die Zuordnung von DB-Inhalt zu Variable. Die würde ich gerne mal sehen. Also konkret wo wird die ID aus der DB ausgelesen und der Varaibalen $id zugewiesen.

Dann zum zweiten:

Du weist der Variablen $filename schon die ID zu.
$filename = "profilbild_user".$id;

Und $filename ist Teil der Variablen $new_path da ist ja dann die $id schon drin. Und die $id willst du auch mit Sicherheit nicht hochzählen, wenn du die $id bei jedem Durchlauf durch die Schleife weiter hochzählst dann ist es nicht mehr die eindeutige Datenbank-ID des Users.
 

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
@hillepille Vielen Dank für deine Hilfe. Ich bin gerade im Urlaub doch wenn ich wieder komme schicke ich noch die Zuordnung zur Datenbank :)
 

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
@hillepille Hey bin jetzt wieder zurück. Also ich habe ein wenig nachgedacht und da ist mir eventuell ja ein entscheidender Faktor in den Sinn gekommen. Der User kann ein Bild ja nur dann hochladen, während er eingelogt ist. Das bedeutet das dass Script anhand des erfolgreichen Logins, die Variable $id auslesen müssen könnte oder ?

Ich verstehe allerdings deinen Punkt, dass zuvor im gesamten Script die Variable $id nirgends zugewiesen wird. Wahrscheinlich wird es auch daran liege. Nun ja ich könnte natürlich eine Datenbankabfrage starten die wie folgt aussehen würde:

Code:
<?php
session_start();
$pdo = new PDO('mysql:host=localhost;dbname=Datenbank_NEU', 'root'); //Passwort nicht vorhanden da lokal
?>

Aber durch diese Abfrage würde das Script ja immer noch nicht wissen welcher Nutzer gerade eingelogt ist oder nicht ? Das heißt im Prinzip das ich dem Script klar machen muss wer gerade eingelogt ist oder ?

Dann zum zweiten:
Du hast recht, die id wird prinzipiell Bestandteil von der Variablen $new_path. Was mit dem hoch zählen jedoch gemeint ist, dass wenn ein Bild bereits existiert, an dieses Bild einfach eine Zahl angehangen wird und diese dann halt auch mit hoch geht mit jedem weiterem doppeltem Exemplar das hochgeladen wird. Deswegen auch die Variable $Anzahl
 

hillepille

Melrose
Registriert
19.07.09
Beiträge
2.508
Hi,

ja du musst die User-Legitimation in eine Session packen wenn der sich korrekt eingeloggt hat.

Zu 2, das hast du schon korrekt dargestellt, aber in deinem Code passiert was anderes:

Code:
if(file_exists($new_path)) { //Falls Datei existiert, hänge eine Zahl an den Dateinamen
    $Anzahl = 1;
    do {
        $new_path = $upload_folder.$filename.'_'.$id.'.'.$extension;
        $id++;
    } while(file_exists($new_path));
}

Du zählst nicht die Variable $Anzahl hoch sondern die Variable $id. Daher mein HInweis.
 

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
@hillepille Hey :) also erstmal zum zweiten. Du hast recht so wie das da stand war es natürlich falsch. Ich habe das ganze jetzt einfach umgeschrieben. Da wo überall die Variable $id zu finden war steht nun $Anzahl. Das war ein Fehler den ich die ganze Zeit übersehen hatte :)

Gut aber nun zum ersten. Ich habe deinen Rat befolgt und das ganze in eine Session gepackt. Mir gelingt es jetzt mittels der Informationen vom Login, den Namen eines Users an das Bild anzuhängen. Leider kriege ich das ganze aber nicht mit der id hin. Ich weiß ehrlich gesagt gar nicht richtig wie ich diese Auslese bzw. der Variable $id die Informationen aus Datenbank zuteile.

Hier das Script zum Upload:
Code:
<?php
session_start();
if(!isset($_SESSION['userid'])) {
    die('Bitte zuerst <a href="login.php">einloggen</a>');
}
$userid = $_SESSION['userid'];

$upload_folder = 'upload/'; //Das Upload-Verzeichnis
$filename = "profilbild_user".$userid;
$extension = strtolower(pathinfo($_FILES['datei']['name'], PATHINFO_EXTENSION));

 
//Überprüfung der Dateiendung
$allowed_extensions = array('png', 'jpg', 'jpeg', 'gif');
if(!in_array($extension, $allowed_extensions)) {
    die("Ungültige Dateiendung. Nur png, jpg, jpeg und gif-Dateien sind erlaubt");
}
 
//Überprüfung der Dateigröße
$max_size = 500*1024; //500 KB
if($_FILES['datei']['size'] > $max_size) {
    die("Bitte keine Dateien größer 500kb hochladen");
}
 
//Überprüfung dass das Bild keine Fehler enthält
if(function_exists('exif_imagetype')) { //Die exif_imagetype-Funktion erfordert die exif-Erweiterung auf dem Server
    $allowed_types = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF);
    $detected_type = exif_imagetype($_FILES['datei']['tmp_name']);
    if(!in_array($detected_type, $allowed_types)) {
        die("Nur der Upload von Bilddateien ist gestattet");
    }
}
 
//Pfad zum Upload
$new_path = $upload_folder.$filename.'.'.$extension;
 
//Neuer Dateiname falls die Datei bereits existiert
if(file_exists($new_path)) { //Falls Datei existiert, hänge eine Zahl an den Dateinamen
    $Anzahl = 1;
    do {
        $new_path = $upload_folder.$filename.'_'.$Anzahl.'.'.$extension;
        $Anzahl++;
    } while(file_exists($new_path));
}
 
//Alles okay, verschiebe Datei an neuen Pfad
move_uploaded_file($_FILES['datei']['tmp_name'], $new_path);
echo 'Bild erfolgreich hochgeladen: <a href="'.$new_path.'">'.$new_path.'</a>';
?>

Jetzt habe ich die ganze Zeit versucht der Variable $id einen Wert im "Login-Script" zuzuteilen, da ich meine Userinformationen darüber welcher User gerade online ist ja auch aus dem Login-Script beziehe. Doch leider hat alles was ich probiert habe nicht geklappt.


Hier das Login-Script:
Code:
<?php
error_reporting(E_ALL); /* Alle Fehler werden angezeigt, hilft beim Debuggen, kann man nachher wieder rausnehmen, wenn alles fertig ist */

session_start();

try{
$pdo = new PDO('mysql:host=localhost;dbname=Datenbank_NEU', 'root'); /* Bei mir hat die Datenbank kein Passwort, lokal nicht so das Problem, online muss sie nat¸rlich eins haben */
} catch(PDOException  $e ){
echo "Error: ".$e;
}

if (isset($_POST["form_email"]) && isset($_POST["form_passwort"]) && $_POST["form_email"] <> '' && $_POST["form_passwort"] <> '') { /* Komischerweise kommt das Formular durch, wnen man nichts eigibt, daher habe ich das hier auch ausgeschlossen */
    $sql = "SELECT * FROM `adressen` WHERE `email` = '".$_POST["form_email"]."'";
    $stmt = $pdo -> query($sql);
    $ergebnis = $stmt -> fetch();
    if ($_POST["form_passwort"] == $ergebnis["passwort"]) { /* Diese if-Abfrage funktioniert ja nur, wenn auch in der Form ein Passwort eingegeben wurde, daher habe ich das mit in die erste if-Klammer genommen */
    $_SESSION['userid'] = $ergebnis["vorname"];
        header("Location: LoginCorrect.php");
    }   else {
        $message = "<p>E-mail oder Passwort ist falsch!</p>"; /* Lieber die Meldung in einem String speichern, sonst vor dem HTML-body-Tag schon eine Ausgabe, das gibt Fehlermeldungen */
    }
}  else {
    $message = "<p>Bitte Passwort und Benutzer eingeben!</p>"; /* Meldung, wenn die Felder nicht beide ausgef¸llt wurden */
}

?>
<html>
<head>
<title>Gesch&uuml;tzter Bereich</title>
</head>
<body>

<?php

    echo $message;

?>

<form method="post">
    E-Mail: <input type="text" name="form_email" size="30" value="" /><br/>
    Passwort: <input type="password" name="form_passwort" size="30" value="" /><br/>
    <input type="submit" value="Login"/>
</form>

<?php
if (isset($ergebnis["passwort"]) && isset($_POST["form_passwort"])) { /* Das darf ja auch nur angezeigt werden, wenn ein Passswort eingetragen wurde */
    echo "Eingebenes Passwort: ".$_POST["form_passwort"];
    echo "<br/>"; /* Zur besseren Lesbarkeit eingef¸gt */
    echo "Passwort aus der Datenbank: ".$ergebnis["passwort"];
}
?>

</body>
</html>
 

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
Übrigens kann ich nicht einfach die Zeile $_SESSION['userid'] = $ergebnis["vorname"];
insofern verändern, das ich für vorname einfach id einsetze da ich das ganze noch anderweitig benötige. Deswegen wäre es mir ganz lieb wenn ich die id noch zusätzlich auslesen kann.
Hast du ne Idee ?
 

hillepille

Melrose
Registriert
19.07.09
Beiträge
2.508
Hi, die eindeutige ID des Users muss doch in der Tabelle mit den Userinfos stehen. Wenn ich dich bisher richtig verstanden habe müsste das der Primärschlüssel der Tabelle Userinfos sein. Denn liest du ja eh mit aus, du holst ja mit "select * ..." eh alles aus der Tabelle raus, was dort zu dem eingeloggten User steht. Dann nimmst du ne 2. Session-Variable in die du die ID packst.

Code:
    if ($_POST["form_passwort"] == $ergebnis["passwort"]) {   
 $_SESSION['username'] = $ergebnis["vorname"];
 $_SESSION['userid'] = $ergebnis["id"];
        header("Location: LoginCorrect.php");
    }

Ich weiß ja nicht wie der Spaltename lautet (habe angenommen sie heißt "id"), du musst $ergebnis["id"] mit dem Spaltennamne des Primärschlüssels austauschen, also $ergebnis["spaltenname_des_primärschlüssels"]. Ich würde dir empfelhen Variablen eindeutig zu bezeichnen, also $_SESSION['userid'] sollte dann auch die ID enthalten und nicht den Vornamen des Users.
 

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
@hillepille Hey super es funktioniert jetzt auch bei mir. Wirklich vielen vielen Dank. Ich weiß nicht wie ich ohne dich auf die Lösung gekommen wäre also wirklich großes Dankeschön. Du scheinst aber auch wirklich Ahnung davon zu haben :D Ich hab da nämlich noch eine Frage in der Richtung und zwar habe ich die Bilder zwar mit der ID des User hochgeladen doch nun will ich das ganze natürlich auch noch auf der Website anzeigen. Das bedeutet das ich die Bilder auslesen muss.

Ich wollte das ganze mit dieser Zeile bewerkstelligen:
Code:
<img src="../PHPversion/upload/profilbild_user<?php echo $id; ?>" width="100">

Das Problem ist jedoch das dass leider nicht so funktioniert wie ich mir das gedacht habe :/ Das ganze klappt nur dann, wenn ich den ganzen Namen des Bildes hinschreibe:

Code:
<img src="../PHPversion/upload/profilbild_user29.jpg<?php echo $id; ?>" width="100">

Das ist ja aber nicht wirklich der Sinn der Sache, denn ich will mich ja nicht auf ein Bild eines Users festlegen, sondern egal welches Bild von egal welchem User anzeigen lassen. Es gibt ja immer unterschiedliche id's.

Ne Idee was man da machen kann ?
 

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
@hillepille mir fällt gerade auf das $id ja schon mal grundsätzlich falsch wäre. Habe das ganze mit $userid ausprobiert doch selbst das hat nicht funktioniert :/