[GELOEST] move_uploaded_file - Wo ist der Fehler

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Lu4ap

Neues Mitglied
7 März 2020
11
0
1
35
Hallo an alle,

ich weiß nicht genau wo der Fehler ist bei "move_uploaded_file". Ich kann den Text übergeben aber das Bild will nicht so recht und ich habe absolut keine Ahnung woran das liegen kann. Vielleicht sieht irgendjemand den Fehler.

Hier ist der Code:

Code:
<form action="admin.php?section=eintrag" method="POST" enctype="multipart/form-date">
    <table>
        <tr>
            <td>
                Titel
            </td>
            <td>
                <textarea name="Titel" cols="80"></textarea>
            <td>
        </tr>
            <tr>
            <td valign="center">
                Datum
            </td>
            <td>
                Tag<textarea name="Tag" cols="2" rows="1"></textarea>
                Monat<textarea name="Monat" cols="2" rows="1"></textarea>
                Jahr<textarea name="Jahr" cols="4" rows="1"></textarea>
            <td>
        </tr>
        <tr>
            <td>
                Image
            </td>
            <td>
                <input type="File" name="image">
            <td>
        </tr>
        <tr>
            <td valign="center">
                Teaser:
            </td>
            <td>
                <textarea name="Teaser" cols="80" rows="10"></textarea>
            <td>       
        </tr>
        <tr>
            <td valign="center">
                Text:
            </td>
            <td>
                <textarea name="Text" cols="80" rows="25"></textarea>
            <td>       
        </tr>
        <tr>       
            <td>
                <input type="submit" name="upload" value="Eintragen">
            <td>       
        </tr>
    </table>
</form>
<?php
    if(isset($_POST['upload']))
    {
    
    include_once 'mysql.php';   
        
    $ID = $_POST['ID'];
    $Titel = $_POST['Titel'];
    $Tag = $_POST['Tag'];
    $Monat = $_POST['Monat'];
    $Jahr = $_POST['Jahr'];
    $Teaser = $_POST['Teaser'];
    $Text = $_POST['Text'];
        
    //File Name aus dem Formular
    $image = $_FILES['image']['name'];
        
    //Temporärer Name
    $timage = $_FILES['image']['tmp_name'];
        
    //Ordner zu hochladen
    $target = 'bilder/';
        
    move_uploaded_file($timage, $target);   

    $sql = "INSERT INTO eintrag (ID, Titel, image, Tag, Monat, Jahr, Teaser, Text) VALUES ('$ID', '$Titel', '$image', '$Tag', '$Monat', '$Jahr','$Teaser', '$Text')";
    
    $ergebnis = mysqli_query($db_con, $sql);
        
    }   
?>
Keine Sorge diesmal gibt es kein Crossposting ;-).
 

m.scatello

Senior HTML'ler
15 Februar 2017
1.095
130
63
Du solltest auch $_FILES['image']['error'] prüfen und dein Daten nicht einfach ohne escapen in die Datenbank schreiben. Außerdem solltest du die DB fragen, ob es beim Insert einen Fehler gab, denn eigentlich müsste dein Insert schief gehen, da du ein reserviertes Word als Spaltennamen benutzt. Man schreibt das daher so
PHP:
$sql = "INSERT INTO eintrag
           (`ID`, `Titel`, `image`, `Tag`, `Monat`, `Jahr`, `Teaser`, `Text`)
        VALUES
           ('$ID', '$Titel', '$image', '$Tag', '$Monat', '$Jahr','$Teaser', '$Text')";
Eine ID verwaltet man nicht selber, dass sollte man MySQL überlassen, genauso wie man das date-Format nutzt, anstatt für Tag, Monat, Jahr jeweils ein Spalte zu verwenden. Und man sollte auch nicht Variablen und Namen mal mit Groß- und mal mit Kleinbuchstaben schreiben, das führt früher oder später zu einem Chaos.

Und: was hat dieses Thema mit Datenbanken zu tun?
 

Lu4ap

Neues Mitglied
7 März 2020
11
0
1
35
So habe die Datenbank komplett neu aufgesetzt mit neuen Namen für die Spalten und es hat dann geklappt.

Hier ist der Code:

Code:
<?php
include_once 'mysql.php';
if (isset($_POST['submit']))
{
    $id = $_POST['id'];
    $title = $_POST['title'];
    $tag = $_POST['tag'];
    $monat = $_POST['monat'];
    $jahr = $_POST['jahr'];
    $teaser = $_POST['teaser'];
    $text = $_POST['text'];

    #file name with a random number so that similar dont get replaced
    $pname = rand(1000,10000)."-".$_FILES['file']['name'];

    #temporary file name to store file
    $tname = $_FILES['file']['tmp_name'];

    #upload
    $uploads_dir = 'images';

    #TO move the uploaded file to specific location
    move_uploaded_file($tname, $uploads_dir.'/'.$pname);

    #sql query to insert into database
    $sql = "INSERT into upload(id, title, image, tag, monat, jahr, teaser, text) VALUES('$id', '$title', '$pname', '$tag', '$monat', '$jahr', '$teaser', '$text')";

$ergebnis = mysqli_query($db_con, $sql);

    if($ergebnis)
    {
        echo "UPLOAD ERFOLGREICH";
    }
    else
    {
        echo "ERROR";
    }
}
 
Zuletzt bearbeitet:

m.scatello

Senior HTML'ler
15 Februar 2017
1.095
130
63
Tipp an andere: dieses Script nicht übernehmen!!!

@Lu4ap
Hat das einen besonderen Grund, warum du meine Hinweise ignorierst? :mad: :mad: :mad:
Und in die DB wird da auch nichts geschrieben!
 

Lu4ap

Neues Mitglied
7 März 2020
11
0
1
35
@m.scatello

Nö ich ignoiere nicht deine Hinweise. Ich versuche sie so gut wie möglich umzusetzen! So habe ich zum Beispiel die Groß- und Kleinschreibung seingelassen und mache jetzt alles klein. Ich weiß, dass man für das Datum auch $datum = date(...) benutzen könnte wie ich aber in diesem Zusammenhang einfach nicht!

Ansonsten funktioniert das Skript genau so wie es soll. Es wird was in die Datenbank geschrieben und auch ebenfalls ein Foto hochgeladen. Somit habe ich mein Ziel erreicht. Ich weiß, dass das nicht perfekt ist aber es funktioniert.

Habe übrigens noch "mysql_close" eingefügt, damit die Verbindungen zur Datenbank beendet wird! Habe ich nur vergessen mit den obrigen Code zunehmen!
 

m.scatello

Senior HTML'ler
15 Februar 2017
1.095
130
63
Diese Zeile
PHP:
$ergebnis = mysqli_query($db_con, $sql);
hast du nachträglich eingefügt.

Und nein, du hast selbst die einfachsten Hinweise nicht umgesetzt. Tabellen- und Spaltennamen gehören zwischen Backticks ` damit man keine Kollision mit reservierten Wörtern bekommt. Außerdem schreibst du die Daten immer noch ohne zu escapen in die DB, damit bist du in Sachen SQL-Injektions gefährdet und somit ist das Script unbrauchbar!
 

Lu4ap

Neues Mitglied
7 März 2020
11
0
1
35
Ja habe ich nachträglich eingefügt weil mir das vorhin aufgefallen war!

Die Backticks sind jetzt auch eingefügt! Dann ist jetzt die große Frage! Wenn mysql_close nicht ausreicht dann erkläre mir doch bitte wie ich richtig aus der DB escape.
 

Felixprogram

Mitglied
18 Dezember 2017
93
3
8
dann erkläre mir doch bitte wie ich richtig aus der DB escape.
Kurze Anmerkung dazu:
Escapen hat in dem Kontext nichts damit zu tun, die Verbindung zu schließen.
Es geht darum, aus vom Benutzer eingegebenen Strings Zeichen zu ersetzen, die es dem Benutzer bei Eingabe eines ermöglichen würden, deine Abfrage an das MySQL-Backend zu unterbrechen und eine eigene zu stellen, z..B. eigene Schreib-/Leseoperationen (Datenbank leeren oder, wenn du irgendwo auf deiner Seite einen Login hast und die Daten auf dem selben Datenbankserver speicherst, die Logindaten auslesen, etc.) durchführen, etc., wodurch deinem Server geschadet werden könnte.

Grüße,
Felixprogram
 

Lu4ap

Neues Mitglied
7 März 2020
11
0
1
35
@Felixprogram vielen Dank für deine Erklärung! So richtig blicke ich dabei aber immer noch nicht durch! Was müsste ich genau an dem oberen Code jetzt genau ändern damit ich dahin gehend sicher bin???
 

Felixprogram

Mitglied
18 Dezember 2017
93
3
8
Hallo @Lu4ap ,
Zitat von https://www.php.net/manual/de/mysqli.real-escape-string.php:
Code:
mysqli_real_escape_string ( mysqli $link , string $escapestr ) : string
This function is used to create a legal SQL string that you can use in an SQL statement. The given string is encoded to an escaped SQL string, taking into account the current character set of the connection.
In deinem Beispiel, müsstest du Folgendes machen:
PHP:
$id = mysqli_real_escape_string($db_con, $_POST['id']);
$title = mysqli_real_escape_string($db_con, $_POST['title']);
$tag = mysqli_real_escape_string($db_con, $_POST['tag']);
$monat = mysqli_real_escape_string($db_con, $_POST['monat']);
$jahr = mysqli_real_escape_string($db_con, $_POST['jahr']);
$teaser = mysqli_real_escape_string($db_con, $_POST['teaser']);
$text = mysqli_real_escape_string($db_con, $_POST['text']);
@m.scatello bitte korregiere mich, wenn ich es falsch gemacht habe.

Grüße,
Felixprogram