PHP + MySQL DateiUpload-Probleme

Baron Sengir

Mitglied
Hallo Ihr Lieben,

ich versuche mich gerade an einem Dateiupload per PHP in eine MySQL-Datenbank. Ich bin der pro und contra bewusst, so soll es aber nunmal sein.

Das Problem für mich ist, dass ich so etwas noch nicht gemacht habe. Kenne mich brauchbar gut MySQL aus, bin allerdings in PHP noch nicht wirklich fit, aber gut dabei.

Ich habe hier ein Tutorial gefunden, an dem ich mich orientiert habe. Nur bei mir klappt's nicht und nun bin ich ein klein wenig ratlos.

Hier mein Upload-Skript:

PHP:
<html>
<head><title>Store binary data into SQL Database</title></head>
<body>

<?php
// code that will be executed if the form has been submitted:
if ($_REQUEST['submit']) {

	echo "Yeah";
	MYSQL_CONNECT("*****","*****","*****");
    mysql_select_db("test");

    $data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));

    $result=MYSQL_QUERY("INSERT INTO datei (description,bin_data,filename,filesize,filetype) ".
        "VALUES ('$form_description','$data','$form_data_name','$form_data_size','$form_data_type')");

    $id= mysql_insert_id();
    print "<p>This file has the following Database ID: <b>$id</b>";

    MYSQL_CLOSE();

} else {

    // else show the form to submit new data:
?>

    <form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">
    File Description:<br>
    <input type="text" name="form_description"  size="40">
    <input type="hidden" name="MAX_FILE_SIZE" value="100000000">
    <br>File to upload/store in database:<br>
    <input type="file" name="form_data"  size="40">
    <p><input type="submit" name="submit">
    </form>

<?php
}
?>

</body>
</html>

Wenn ich das Skript starte erhalte ich folgendes auf'm Bildschirm:

Code:
Yeah
Warning: fread(): supplied argument is not a valid stream resource in C:\Programme\xampp\htdocs\test\input.php on line 13

This file has the following Database ID: 2

Und nun?

Bitte helft mir auf die Sprünge.

Liebe Grüße

Markus
 
Gumbo hat gesagt.:
Welchem Wert besitzt die $form_data-Variable und wo kommt dieser überhaupt her?

$form_data bekommt aus dem Formular seinen Wert.

Es ist so, dass bei ersten Aufruf des Skripts das Formular angezeigt wird. Damit kann dann der User eine Datei auf seinem Rechner auswählen. Wenn das Formular dann abgeschickt wird, greift der PHP-Teil. Inhalt von $form_data ist Pfad zur Datei.

HTH
 
Dann liegt es sicher an register_globals=off.
Du solltest $form_data besser auf $_POST holen, aehnlich wie Du oben $_REQUEST eingesetzt hast.
 
Probier mal Folgendes:
PHP:
<?php

	// code that will be executed if the form has been submitted:
	if( !empty($_POST['submit']) ) {

		mysql_connect('*****', '*****', '*****');
		mysql_select_db('test');

		$query = '
			INSERT INTO
			        `datei`
			  SET
			        `description` = "'.mysql_real_escape_string($_POST['form_description']).'",
			        `bin_data`    = "'.mysql_real_escape_string(file_get_contents($_FILES['form_data']['tmp_name'])).'",
			        `filename`    = "'.mysql_real_escape_string($_FILES['form_data']['name']).'",
			        `filesize`    = "'.mysql_real_escape_string($_FILES['form_data']['size']).'",
			        `filetype`    = "'.mysql_real_escape_string($_FILES['form_data']['type']).'"
			';
		echo '<p>This file has the following Database ID: <b>'.mysql_insert_id().'</b></p>';
		mysql_close();

	} else {

		…

?>
 
Danke für die Hinweise. :)

Nachdem ich noch die Durchführung der QUERY eingefügt habe, funktioniert es auch meistens. :rolleyes:

Ja, Ihr lest richtig meistens. Ich habe es mit mehreren Dateien probiert. Mit Dateien, die nicht größer als 1 MB sind, funktioniert das Uploaden super. Dateien, die z.B. 4 MB gross sind, klappen gar nicht. :mad:

Was könnte dafür die Ursache sein? :confused:

Liebe Grüße

Markus
 
Ich vermute, dass ich da etwas an den Systemeinstellungen des Serves ändern muss. Da kenne ich mich aber nicht so gut aus. Ich benutze die aktuelle XAMPP-Version 1.5.1 (Apache/2.2.0 (Win32) DAV/2 mod_ssl/2.2.0 OpenSSL/0.9.8a mod_autoindex_color PHP/5.1.1 MySQL 5)

Ich denke, ich packe zur Sicherheit nocheinmal mein nun überarbeitetes gesamtes Skript rein:

PHP:
<html>
<head><title>Store binary data into SQL Database</title></head>
<body>

<?php
// code that will be executed if the form has been submitted:
   if( !empty($_POST['submit']) ) {

        MYSQL_CONNECT("localhost","root","");
        mysql_select_db("test");
		
		$description = mysql_real_escape_string($_POST['form_description']);
        $bin_data    = mysql_real_escape_string(file_get_contents($_FILES['form_data']['tmp_name']));
        $filename    = mysql_real_escape_string($_FILES['form_data']['name']);
        $filesize    = mysql_real_escape_string($_FILES['form_data']['size']);
        $filetype    = mysql_real_escape_string($_FILES['form_data']['type']);

        mysql_query( "INSERT INTO datei (description,bin_data,filename,filesize,filetype) ".
		             "VALUES ('".$description."','".$bin_data."','".$filename."','".$filesize."','".$filetype."')" );
				 
        echo '<p>This file has the following Database ID: <b>'.mysql_insert_id().'</b></p>';
		echo '<p>Description: <b>'.$description.'</b></p>';
		echo '<p>Filename: <b>'.$filename.'</b></p>';
		echo '<p>Filesize: <b>'.$filesize.'</b></p>';
		echo '<p>Filetype: <b>'.$filetype.'</b></p>';
		
        mysql_close();

} else {

    // else show the form to submit new data:
?>

    <form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">
    File Description:<br>
    <input type="text" name="form_description"  size="40">
    <br>File to upload/store in database:<br>
    <input type="file" name="form_data"  size="40">
    <p><input type="submit" name="submit">
    </form>

<?php
}
?>

</body>
</html>

Vielen Dank nocheinmal für Eure Mühen bislang (und hoffentlich auch weiteren).

Markus
 
Jap da gibt es eine Einstellung. Weiß jetzt nicht genau wie sie heißt aber einfach mal nach Upload in der php.ini suchen. Default ist 2MB.
 
Es gibt unterschiedliche Gründe dafür, dass das Hochladen einer Datei fehlgeschlagen ist. Am besten baust du eine umfangreiche Fehlerbehandlung in dein Skript ein. So kannst du beispielsweise auf die Fehlermeldungen zurückgreifen, um zu prüfen, ob der Upload erfolgreich war und falls nicht, woran es lag.
 
So, Ihr Lieben ich habe mich jetzt ein wenig in der php.ini eingegraben gehabt und diverse upload- und post-buffers erhöht. Zusätzlich habe ich auch eine Fehlerbehandlungsroutine eingebaut, damit ich eine bessere weitere Lösungstrategie entwickeln kann, bzw. damit mir besser weitergeholfen werden kann.

Das Ergebnis meiner Bemühungen ist, dass ich jetzt mitlerweile sicher weiß, dass die Datei per PHP hochgeladen wird. Ich weiß auch, dass die Verbindung zur Datenbank erfolgreich aufgebaut wird.

Das Problem liegt dann in der MySQL-Query. Dort gibt es dann die Fehlermeldung.

Code:
Error Code (mysql_query): 2013: Lost connection to MySQL server during query

Tja, das ist ja nicht wirklich hilfreich. Denn wat nun? Bislang bin ich ideenlos. :confused: :confused:

Liebe Grüße

Markus
 
Zurück