Fehler in Upload-Script

chpa

Erfahrenes Mitglied
Hallo Leute,

weiß jemand, warum das folgende Uploadscript nicht funktioniert?

Ich bin echt am verzweifeln...

Immer wenn ich auf absenden klicke im Upload-Form, dann kommt die Fehlermeldung "Bitte benutzen Sie das Upload-Formular.

PHP:
<?php

	include("dbconnect.php");

	function random($name_laenge)
	{
		$zeichen = "1234567890";
		$name_neu = "";

		mt_srand( (double) microtime() * 1000000);
		for( $i=0; $i<$name_laenge; $i++ ) {
			$name_neu .= $zeichen{ mt_rand(0,strlen($zeichen)) };
		}
		return $name_neu;
	}

?>
<?php

	if( $_GET['upload'] == "yes" ) {
		// Variabeln festlegen
		$max_byte_size = 500000;
		$allowed_types = "(jpg|jpeg|gif|bmp|png)";

		// Formular wurde abgeschickt
		if( $_POST["submit"] == "Upload" ) {

			// Wurde wirklich eine Datei hochgeladen?
			if( is_uploaded_file($_FILES["file"]["tmp_name"]) ) {

				// Gültige Endung? ($ = Am Ende des Dateinamens) (/i = Groß- Kleinschreibung nicht berücksichtigen)
				if( preg_match("/\." . $allowed_types . "$/i", $_FILES["file"]["name"]) ) {

					// Datei auch nicht zu groß 
					if( $_FILES["file"]["size"] <= $max_byte_size ) {

						// Alles OK -> Datei kopieren
						$ziel .= random("10");
						$kontrolle = "SELECT bild FROM bilder WHERE bild='$ziel'";
						$resID_kon = mysql_query($kontrolle);
						$anzahl_ko = mysql_num_rows($resID_kon);

						if( copy($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]) ) {
							rename($_FILES["file"]["name"], $ziel);
							$bild_name = $ziel;

							$sql = "INSERT INTO bilder (bild) VALUES ('$bild_name')";
							$eintragen = mysql_query($sql);

							echo("<meta http-equiv=\"refresh\" content=\"0;url=bauhelfer_ins_bild.php?f=1\">");

						} else {

							echo "Datei konnte nicht hochgeladen werden.";
							echo("<meta http-equiv=\"refresh\" content=\"0;url=bauhelfer_ins_bild.php?f=2\">");

						}

					} else {

						echo "Die Datei darf nur eine Größe von " . $max_byte_size . " Byte besitzen.";
						echo("<meta http-equiv=\"refresh\" content=\"0;url=bauhelfer_ins_bild.php?f=3\">");

					}

				} else {

					echo "Die Datei besitzt keine gültige Endung.";
					echo("<meta http-equiv=\"refresh\" content=\"0;url=bauhelfer_ins_bild.php?f=4\">");

				}

			} else {

				echo "Keine Datei zum Hochladen angegeben.";
				echo("<meta http-equiv=\"refresh\" content=\"0;url=bauhelfer_ins_bild.php?f=5\">");

			}

		} else {

			echo "Bitte benutzen Sie das Upload Formular.";

		}
	}

?>
Gruß

Christoph
 
Spontan würde ich den Fehler in deinem Formular vermuten, da er ja bereits bei der ersten Bedingung den Fehler hat...
 
Mach die Abfrage, ob das Formular abgeschicht wurde lieber unabhängig vom Text des Buttons, da können sich schnell Fehler einschleichen...

Das reicht auch:
PHP:
if(isset($_POST["submit"]))
 
Und versuch deine Skripte nicht so tief zu verschachteln, dadurch wird es nur unnötig unübersichtlich. Arbeite lieber mit zusätzlichen Flags und den Kontrollstruktur-Schlüsselwörtern wie break und continue, beispielsweise:
PHP:
<?php

	$error = false;
	do {
		if( bar ) {
			echo 'foo';
			$error = true;
			break;
		}
		if( bar ) {
			echo 'bar';
			$error = true;
			break;
		}
		…
	} while( false );

	if( $error ) {
		…
	}

?>
Du könntest auch die unterschiedlichen Fehlermeldungen sammeln und zusammen ausgeben:
PHP:
<?php

	$errors = array();

	if( foo ) {
		$errors[] = 'foo';
	}
	if( bar ) {
		$errors[] = 'bar';
	}
	…

	if( !empty($errors) ) {
		echo '<div class="note error"><ul>';
		foreach( $errors as $tmp ) {
			echo '<li>'.$tmp.'</li>';
		}
		echo '</ul></div>';
	}

?>
 
Dir ist schon bewusst, dass deine Datei hier keine Endung mehr hat.
PHP:
rename($_FILES["file"]["name"], $ziel);
Und ändere diese Zeile
PHP:
 $sql = "INSERT INTO bilder (bild) VALUES ('$bild_name')";
noch in
PHP:
 $sql = "INSERT INTO bilder (bild) VALUES ('".mysql_real_escape_string($bild_name)."')";

Und die Funktion random() verwendest du doch, um einen eindeutigen Namen zu erzielen, oder nicht? Aber ob das wirklich zu 100% funktioniert? Es kann dabei schon vorkommen, dass eine Rückgabe die gleiche ist, wie eine andere. Verwende dazu doch eine Funktion wie uniqid()
 
Zuletzt bearbeitet:
Oh man...

da ist praktisch so gut wie alles falsch oder?

Kennt jemand vielleicht ein Tutorial wo beschrieben wird, wie man ein Bild hochlädt und die Datei danach umbenennt?

Gruß

Christoph
 
Das Skript ist vor allem wirr und unstrukturiert. Oft erspart man sich eine Menge Arbeit, wenn man sich vorher ein paar Gedanken über den Ablauf macht. Dort merkt man oft schon, dass gewisse Teile sich exakt oder in leicht veränderter Form wiederholen und der Einsatz einer Funktion oder eines allgemeineren Algorithmusses angebracht wäre.

Das Kapitel „Steuerung von Dateiuploads“ des PHP-Handbuches befasst sich übrigens mit der Steuerung von Dateiuploads.
 
Zurück