Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

mein Problem ist nicht so einfach wie es im Titel steht. :)

Ich erstelle insgesamt sieben gleiche Upload-Zeilen

durch eine WHILE-Schleife.

Mit diesen sieben Upload-Zeilen sollte es aber möglich

sein, jedes einzeln hochzuladen.

Hier mal ein Stück Code, wie das bei mir aussieht.


<? echo '<form action="index.php?site=forms&func=art&grpid='.$grpid.'" method="post" enctype="multipart/form-data">'; ?>

			<tr>

				<?

					$i = 1;

					while($i <= 7)

					{						

				?>

				<td valign="top">

					Artikel / <? echo $i; ?><br>

					<br>

					<center><input type="submit" name="update" value="Update"></center>

				</td>

				<td valign="top">

					<?

						$art = mysql_query("SELECT * FROM ".$T_ART." WHERE artid = ".$i." AND grpid = ".$_GET['grpid']);

						$artdat = mysql_fetch_assoc($art);


						if($artdat == false)

						{

							/* Leeren Datensatz einfügen, falls nicht vorhanden */

							mysql_query("INSERT INTO ".$T_ART." (artid, grpid, kurz, lang, bild) VALUES ('$i', '$_GET[grpid]', '', '', '')");


							/* Artikelgruppe Kurzbeschreibung */

							echo '<input type="text" name="akb" value="'.$artdat['kurz'].'" size="54"><br>';


							/* Artikelgruppe Langebeschreibung */

							echo '<textarea cols="40" rows="5" name="alb">'.$artdat['lang'].'</textarea><br>';


							/* Auswahl neues Bild */

							echo '<input type="file" name="bild" size="37"><br>';


							/* Auswahl bestehendes Bild */

							?>

							<select name="bild_exist">

								<option value="">Kein Bild</option><br>

								<?

									$dir = "./images/pics/";

									$handle = opendir($dir);

									while($file = readdir ($handle))

									{

										if($file != "." && $file != "..")

										{

											if(is_dir($dir.$file))

											{

												echo '<option value="'.$file.'">'.$file.'</option>\n';

											}

											else

											{

												echo '<option value="'.$file.'">'.$file.'</option>\n';

											}

										}

									}

									closedir($handle);

								?>

							</select><br>

							<font color="#FF0000"><b>Falls Bild nicht erscheint, bitte "F5" drücken!</b></font>

				</td>

				<td width="300" height="250">				

					<?

							/* Bild */

							if($grpdat['bild'] == "")

							{

								echo 'Kein Bild vorhanden';

							}

							else

							{

								echo '<img src="images/pics/'.$artdat['bild'].'" alt="Bild" >';

							}

					?>

				</td>

					<?

						}

						else

						{

							/* Artikelgruppe Kurzbeschreibung */

							echo '<input type="text" name="akb" value="'.$artdat['kurz'].'" size="54"><br>';


							/* Artikelgruppe Langebeschreibung */

							echo '<textarea cols="40" rows="5" name="alb">'.$artdat['lang'].'</textarea><br>';


							/* Auswahl neues Bild */

							echo '<input type="file" name="bild'.$i.'" size="37"><br>';


							/* Auswahl bestehendes Bild */

							?>

							<select name="bild_exist">

								<option value="">Kein Bild</option><br>

								<?

									$dir = "./images/pics/";

									$handle = opendir($dir);

									while($file = readdir ($handle))

									{

										if($file != "." && $file != "..")

										{

											if(is_dir($dir.$file))

											{

												echo '<option value="">Kein Bild</option>\n';

												echo '<option value="'.$file.'">'.$file.'</option>\n';

											}

											else

											{

												echo '<option value="'.$file.'">'.$file.'</option>\n';

											}

										}

									}

									closedir($handle);

								?>

							</select><br>

							<font color="#FF0000"><b>Falls Bild nicht erscheint, bitte "F5" drücken!</b></font>

				</td>

				<td width="300" height="250">				

					<?

							/* Bild */

							if($artdat['bild'] == "")

							{

								echo 'Kein Bild vorhanden';

							}

							else

							{

								echo '<img src="images/pics/'.$artdat['bild'].'" alt="Bild" >';

							}

						}

					?>

				</td>

			</tr>

			<?

				echo '<input type="hidden" name="ai" value="'.$i.'">';

				$i++;

				echo "\n";

				}

			?>

Hoffe es kann mir jemand helfen.

Gruß

TripleD

Hi,

also die Frage wäre, wie bekomm ich das hin,

dass ich jedes dieser Upload-Felder einzeln benutzen kann,

die ich ja in einer WHILE-Schleife erstellen lasse.

Gruß

TripleD

1. Du gibst jedem input vom type file einen eindeutigen namen

2. Du durchläufst in deinem Script alle Elemente des Feldes $_FILES, denn da stehen alle Info sdrin, die man bruacht.

Hi Enrico,

danke für deine Antwort.

Wenn ich das richtig versteh,

mach ich die Inputs folgendermaßen:

zu 1.


<input type="file" name=bild[$i]>

$i ist in dem Fall die Variable der WHILE-Schleife. zu 2.

$var = $_FILES["bild"]["name"];

TripleD

Es reicht, wenn Du den INPUT-Feldern z.B. allen den gleichen Array-Namen gibst, Schlüssel sind nicht zwingend erforderlich...z.B.:

<input type="file" name="bild[]">
Diese kannst Du dann über PHP aus dem Array $_FILE entnehmen. Du kannst Dir ja mal am Anfang vom verarbeitenden Script die Inhalte des Arrays anzeigen lassen, dann weisst Du, wie Du es verarbeiten musst...:

echo "<pre>";

print_r($_FILE);

echo "</pre>";

Danke für deine Hilfe,

aber irgendwie will das ganze nicht so richtig.

Ich hab es jetzt zwar als Array, aber ich komm nicht

drauf, wie ich das Array auslesen kann.

Nochmal den Sachverhalt:

--------------------------

1.0 Formular mit sieben Eingabefeldern (mit WHILE-Schleife realisiert)

2.0 Formularblock:

2.1 <input type="file" name="bild[]">

2.2 <select name="bild_exist[]">

2.3 Ein Textfeld und ein Textarea

3.0 Übergabe an die ausführende Datei


echo "- Bin drin in Artikel<br>";


		echo "<pre>";

		echo "Neues Bild<br>";

		print_r($_FILES["bild"]["name"]);

		echo "</pre>";


		foreach($bild_exist as $key => $bild_exist1)

		{

			echo $key." | ".$bild_exist1."<br>";

			echo "------------------------<br>";

			$bild = $bild_exist1;

		}


		if($bild != "")

		{

			echo "- Beginne Upload<br>";


			$dateipfad="images/pics/";

			$datei=$_FILES["bild"];

			$dateiname=$_FILES["bild"]["name"];

			$dateiuploadname=$_FILES["bild"]["tmp_name"];


			move_uploaded_file($dateiuploadname,$dateipfad.$dateiname);


			$bild = $dateiname;


			echo "- Erfolgreich Upgeloaded<br>";

		}

		else

		{


			echo "- Existierendes Bild verwendet<br>";

		}


		//mysql_query("UPDATE ".$T_ART." SET kurz='$akb', lang='$alb', bild='$bild' WHERE grpid = ".$grpid);

		//header('Location: index.php?site=artikel&grpid='.$grpid);

Hoffe es findet jemand eine Lösung. Ich bin am verzweifeln.

TripleD

Hallo Monty,

hier mal die Ausgabe:

Vom Input Feld:


Neues Bild


Array

(

    [0] => 

    [1] => 

    [2] => 

    [3] => 

    [4] => 

    [5] => 

    [6] => 

)

Vom SELECT-Feld

Existierendes Bild


Array

(

    [1] => pwd.png

    [2] => 

    [3] => 

    [4] => 

    [5] => 

    [6] => 

    [7] => 

)

Ich hab ja in meinem ausführenden Script eine Abfrage drin,

dass wenn das INPUT leer ist, der Eintrag aus dem SELECT

genommen werden soll.

TripleD

Die obere Ausgabe ist sicher die des Arrays $_FILES?? (also print_r($_FILES))

Und mit den Werten aus dem <select>-Feld willst Du, dass die Bilder weiterverwendet werden, die schon auf dem Server liegen?

Wie sieht btw der <form>-Tag aus?

Genau, die obere Ausgabe ist aus dem $_FILE - Array.

Es soll eigentlich mit beiden weitergearbeitet werden.

Je nachdem was ausgewählt wird.

Die ausgewählte Datei aus dem SELECT wird in eine

mySQL-DB eingetragen.

Und die aus dem $_FILE - Array wird hochgeladen und

dann in die DB eingetragen.

Hier mal der FORM-Tag:

<? echo '<form action="index.php?site=forms&func=art&grpid='.$grpid.'" method="post" enctype="multipart/form-data">'; ?>

Have a try...

Parse-Error sind möglich ;)


$dstPath = "/tmp/";

	if (is_Array($_FILES)) {

		foreach ($_FILES as $fkey=>$fval) {		

			if (is_File($fval['tmp_name'])) {

				$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$fval['name']);			

				$dstFPath = realpath($dstPath)."/".$dstFName;


				if (move_uploaded_file($fval['tmp_name'],$dstFPath)) {

					//Datei $fval['name'] wurde hochgeladen und unter $dstFName im Verzeichnis $dstPath gespeichert....

					//Quasi kann hier jetzt Dein Eintrag in die DB erfolgen...


				}							

			}			


		}

	}



	if (is_Array($_POST['bild_exist'])) {

		foreach ($_POST['bild_exist'] as $fkey=>$fval) {

			if (!empty($fval)) {

				//Hier kannst Du jetzt das existierende Bild in die DB schreiben... ($fval)

			}	

		}

	}

Hi Monty,

erst mal einen ganz großen Dank an dich.

Es funktioniert wunderbar, bis auf eine kleinigkeit.

Das Bild aus dem $_FILE wird nicht hochgeladen und

kann somit auch nicht in die Datenbank eingetragen werden.

Der rest funktioniert aber ohne Probleme.

Danke nochmals für deine Hilfe.

Gruß

TripleD

Ich hab da nochmal was ausprobiert, und zwar

geht er nicht in folgende Schleife rein.


if (is_File($fval['tmp_name']))

				{

					$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$fval['name']);

					$dstFPath = realpath($dstPath)."/".$dstFName;


					if (move_uploaded_file($fval['tmp_name'],$dstFPath))

					{

						//Datei $fval['name'] wurde hochgeladen und unter $dstFName im Verzeichnis $dstPath gespeichert....

						//Quasi kann hier jetzt Dein Eintrag in die DB erfolgen...

						//mysql_query("UPDATE ".$T_ART." SET kurz='$akb', lang='$alb', bild='$dstFName' WHERE grpid = ".$grpid." AND artid=".$fkey);

						echo "Erfolgreich hochgeladen<br>";

					}

					else

					{

						echo "Fehler beim Upload<br>";

					}

				}

Damit hat sich "print_r($_FILES);" wohl erledigt, oder?

OK, also hier mal die Ausgabe von $_FILES:


Array ( [bild] => Array ( [name] => Array ( [0] => [1] => hide.gif [2] => [3] => [4] => [5] => [6] => ) [type] => Array ( [0] => [1] => image/gif [2] => [3] => [4] => [5] => [6] => ) [tmp_name] => Array ( [0] => [1] => C:\WINDOWS\TEMP\php4C7.tmp [2] => [3] => [4] => [5] => [6] => ) [error] => Array ( [0] => 4 [1] => 0 [2] => 4 [3] => 4 [4] => 4 [5] => 4 [6] => 4 ) [size] => Array ( [0] => 0 [1] => 379 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 ) ) ) 1

Dann nimm das hier für den oberen Bereich... ;)


	if (is_Array($_FILES['bild']['tmp_name'])) {

		foreach ($_FILES['bild']['tmp_name'] as $fkey=>$fval) {		

			if (is_File($fval))) {

				$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$_FILES['bild']['name'][$fkey]);			

				$dstFPath = realpath($dstPath)."/".$dstFName;


				if (move_uploaded_file($fval,$dstFPath)) {

					//Datei $_FILES['bild']['name'][$fkey] wurde hochgeladen und unter $dstFName im Verzeichnis $dstPath gespeichert....

					//Quasi kann hier jetzt Dein Eintrag in die DB erfolgen...


				}							

			}			


		}

	}

Entweder bin ich zu blöd, das ganze bei mir einzubauen, oder es stimmt irgendwas an dem Script nicht.

Fehler im Script:

Es wird die Temp-Datei in die DB geschrieben.

print_r($_FILE) von INPUT:


Array ( [bild] => Array ( [name] => Array ( [0] => hide.gif [1] => [2] => [3] => [4] => [5] => [6] => ) [type] => Array ( [0] => image/gif [1] => [2] => [3] => [4] => [5] => [6] => ) [tmp_name] => Array ( [0] => C:\WINDOWS\TEMP\php583.tmp [1] => [2] => [3] => [4] => [5] => [6] => ) [error] => Array ( [0] => 0 [1] => 4 [2] => 4 [3] => 4 [4] => 4 [5] => 4 [6] => 4 ) [size] => Array ( [0] => 379 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 ) ) ) 1

print_r($_FILE) von SELECT:

Array ( [bild] => Array ( [name] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => ) [type] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => ) [tmp_name] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => ) [error] => Array ( [0] => 4 [1] => 4 [2] => 4 [3] => 4 [4] => 4 [5] => 4 [6] => 4 ) [size] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 ) ) ) 11

Und hier noch der Coder der Ausführbaren Datei:

echo print_r($_FILES);

		$dstPath = "/images/pics/";

		if (is_array($_FILES['bild']))

		{

			foreach ($_FILES['bild']['tmp_name'] as $fkey=>$fval)

			{

				if (is_file($fval))

				{

					$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$_FILES['bild']['name'][$fkey]);

					$dstFPath = realpath($dstPath)."/".$dstFName;


					if (move_uploaded_file($fval,$dstFPath))

					{

						//Datei $_FILES['bild']['name'][$fkey] wurde hochgeladen und unter $dstFName im Verzeichnis $dstPath gespeichert....

						//Quasi kann hier jetzt Dein Eintrag in die DB erfolgen...

						mysql_query("UPDATE ".$T_ART." SET kurz='$akb', lang='$alb', bild='$dstFName' WHERE grpid = ".$grpid." AND artid=".$fkey);

					}

				}

			}

		}


		echo print_r($bild_exist);

		if (is_Array($_POST['bild_exist']))

		{

			foreach ($_POST['bild_exist'] as $fkey=>$fval)

			{

				if (!empty($fval))

				{

					//Hier kannst Du jetzt das existierende Bild in die DB schreiben... ($fval)

					mysql_query("UPDATE ".$T_ART." SET kurz='$akb', lang='$alb', bild='$fval' WHERE grpid = ".$grpid." AND artid=".$fkey);

				}

			}

		}


		header('Location: index.php?site=artikel&grpid='.$grpid);

Danke für deine Hilfe

TripleD

if (is_array($_FILES['bild']))

{

Zunächst mal der Vollständigkeit halber:


		if (is_array($_FILES['bild']['tmp_name']))

		{

Ich sehe keinen Fehler in meinem Code, vielleicht sieht ihn jemand anderes.

Du kannst Dir doch einfach mal die Variablen, die ich verwende ausgeben lassen...

Vielleicht ist da ja irgendwo der Fehler ($destFName, $destFPath, $fval, ...)

Das Problem mit dem Dateinamen in der Datenbank hab ich behoben,

hab ne falsche Variable eingetragen.

Nur das mit dem Datei-Upload will noch nicht.

Ich hab mir jetzt mal den Inhalt der Variablen anzeigen lassen,

das ist der Inhalt:


- dstPath: /images/pics/

- dstFName: hide.gif

- FILES['bild']['tmp_name']: Array

- FILES['bild']['name']: Array

- fkey: 1

- fval: C:\WINDOWS\TEMP\php72E.tmp

Kann es sein das es Problem mit $FILES und fval gibt?

Muss man da noch irgendetwas umschreiben?

Ich vermute eher, das Problem liegt daran, dass $destPath absolute Linux-Pfade enthält...

Aber da das Script anscheinend auf nem Windows-Server läuft, würde ich es mal mit $destPath = "C:\\verz\unterverz\\.." versuchen oder relative Pfade benutzen...

Gegebenenfalls musst Du den ."/". in der Nähe von realpath() auch noch durch ein ."\\". ersetzen...

Lass Dir deswegen auch mal die Ausgabe von realpath($destPath) anzeigen...

So, jetzt hab ich das Problem gelöst.

War eigentlich ganz easy.

Es lag an folgender Zeile:


$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$_FILES['bild']['name'][$fkey]);

Diese hab ich in folgende Zeile geändert:

$dstFName = $_FILES['bild']['name'][$fkey]);

Nochmal danke für deine Hilfe.

Wünsch dir noch nen schönen Tag.

Gruß

TripleD

Versteh ich zwar nicht, da genau diese Zeile bei mir funktioniert, aber egal :)...

Jetzt kriegst Du nur ein Problem, wenn jemand mit Linux oder Mac eine Datei mit Nicht-Windows-Konformen Sonderzeichen hochlädt...

Aber solange der Workaround läuft ;)...

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.