Jak napisać skrypt w PHP do wysłania kilku zdjęć na serwer?

0

Mam taki kod:

Część formularza:


<form action="index.php?strona=Dodaj-obiekt" method="post" enctype="multipart/form-data">
<fieldset>
<label>
<span>Dodaj zdjęcie1 * </span>
<input type="file" class="wpis" name="tab[]" id="temat" />
</label>
<label>
<span>Dodaj zdjęcie2 * </span>
<input type="file" class="wpis" name="tab[]" id="temat" />
</label>
<label>
<span>Dodaj zdjęcie3 * </span>
<input type="file" class="wpis" name="tab[]" id="temat" />
</label>
<label>
<span>Dodaj zdjęcie4 * </span>
<input type="file" class="wpis" name="tab[]" id="temat" />

</label>
</fieldset>

$tab =  $_POST['tab'];

foreach ($tab as $klucz => $wartosc){
$image=$HTTP_POST_FILES['wartosc']['name'][$klucz];
$image1=$_FILES['wartosc']['type'];
$image2= $_FILES['wartosc']['size'];

$zap3 = mysql_query("INSERT INTO `zdjecia_kwatery` (`ID_kwatery`, `z1`) VALUES ('$idkwatery', '$image');") or die ('Nie mozna dodac zdjec');
}

i problem znajduje się w pętli, po prostu zmiennie jak: $image , $image1 oraz $image2 są puste :( Wie ktoś dlaczego się tak dzieje? Ten sam skrypt bez tablicy i pętli działa... w czym problem? Może trzeba dodać jeszcze jakieś nagłówki? Bo ogólnie pliczek nie kopiuje sie...

1

Kiedy masz input typu file (oraz prawidłowy enctype, ale ten to masz) to dane z niego nie idą do $_POST, ale tylko do $_FILES (przy okazji uwaga - $HTTP_POST_FILES jest zdeprecjonowane). Nie iteruj zatem po $_POST['tab'], bo ta tablica jest pusta.

Dla takiego kodu HTML:

<!DOCTYPE html>

<head> <title>PHP file test</title> </head> <body> <form action="test.php" method="post" enctype="multipart/form-data"> <label for="upload0">Upload 0</label><input type="file" name="upload[]" id="upload0" /> <label for="upload1">Upload 1</label><input type="file" name="upload[]" id="upload1" /> <label for="upload2">Upload 2</label><input type="file" name="upload[]" id="upload2" /> <input type="submit" /> </form> </body>

</html>


Tablica $_POST jest pusta, natomiast tablica $_FILES ma następującą postać:

array(1) {
["upload"]=>
array(5) {
["name"]=>
array(3) {
[0]=>
string(8) "test.upd"
[1]=>
string(8) "test.upd"
[2]=>
string(8) "test.upd"
}
["type"]=>
array(3) {
[0]=>
string(24) "application/octet-stream"
[1]=>
string(24) "application/octet-stream"
[2]=>
string(24) "application/octet-stream"
}
["tmp_name"]=>
array(3) {
[0]=>
string(27) "C:\Windows\Temp\phpE1FA.tmp"
[1]=>
string(27) "C:\Windows\Temp\phpE1FB.tmp"
[2]=>
string(27) "C:\Windows\Temp\phpE1FC.tmp"
}
["error"]=>
array(3) {
[0]=>
int(0)
[1]=>
int(0)
[2]=>
int(0)
}
["size"]=>
array(3) {
[0]=>
int(87)
[1]=>
int(87)
[2]=>
int(87)
}
}
}


To raz. Znając ilość elementów możesz odwołać się do nich za pomocą pętli for, a nie foreach:

```php
for ($i = 0; $i < 3; $i++)
{
    echo $_FILES['upload']['name'][$i]; // nazwa i-tego pliku
}

Dwa, w twoim kodzie zmienna ma nazwę $wartosc, a ty próbujesz odwoływać się do $_FILES['wartosc'] zamiast $_FILES[$wartosc] - może tutaj jest sobie błąd, nie sprawdzałem dokładnie w jaki sposób działa twój kod.

Trzy, elementów <label> używa się w inny sposób (atrybut for), a id dla elementów input powinny być unikalne.

0

Ale po co te fory w label oraz id ? Po co one są ? :( Do czego służą? Zaraz... może problem leży w formularzu. Ponieważ wysyłam w jednym formularzy dane typu $_POST (jak nazawa noclegu, jego, opis) oraz zdjęcia!? Czy można tak robić w jednym formularzy? :O

0

Element <label> opisuje etykietę dla konkretnego elementu <input> (tak naprawdę to nie tylko, także i . Atrybut for określa dla którego elementu <input> to jest opis - korzystając z id. Czyli <label for="jakiesid">jakisopis</label> oznacza opis pola dla elementu <input id="jakiesid">. Daje to tak naprawdę tylko jedną rzecz - pozwala, że po kliknięciu na danego labela aktywna staje się kontrolka do tego konkretnego labela przypisana.

Ale niestety - wprowadziłem w błąd, znów. Po przejrzeniu specyfikacji okazuje się, że można jednak stosować wersję <label>jakiś opis <input /></label>. Przepraszam, moja wina, więc w sumie cały powyższy wywód co najwyżej ma tylko wartość naukową ;-) Zarzut co do stosowania różnych id w różnych inputach pozostaje jednak aktualny.

Ale do rzeczy - nie, stosowanie jednocześnie "zwykłych" danych tekstowych oraz plików nie powinno mieć znaczenia. Sprawdź sobie po prostu korzystając z:

var_dump($_POST);
var_dump($_FILES);

Co i w jakiej formie idzie w jakiej tablicy i będziesz wiedział.

0

Ok, rozumiem :) Dziekuję za wszelkie komentarze. Wszystko się przyda, ale mam dalej problem :( Jak dodaj zdjęcie do formularzu to nie przenosi go w ogóle, nie ma żadnej reakcji. noo jaki grzyb? czy nie potrzebne są jakieś jeszcze nagłowki czy coś? czy np przekierowanie gdzie ma być zapisany ten pliczek? czy coś? pierwszy raz bawie sie z tymi plikami, niby banał, ale coś nie gra :/

czy jak dam coś takiego:


$upload =  $_FILES['upload'];
echo var_dump($_FILES);

z wcześniejszym formularzem to powinno już działać? U mnie cały czas wyświetla pustą tablice :(

0

Samo var_dump(), bez echo.

Powinno działać z wcześniejszym formularzem. Jeśli wyświetla pustą tablicę to sprawdź czy na pewno masz w <form> ustawiony atrybut enctype, tutaj na forum jest, a w rzeczywistym kodzie?

0

jak nie mam w formularzu tablicy (name="tab[]") tylko pojedynczą zmienną (name="tab") to działa o dziwo. dodaj tablice i wszystko się sypie :O ten sam kod... enctype jest ustawione cały czas :)

Jesteś pewien, że taki kod zadziała?

for ($i = 0; $i < $ile; $i++){
echo $image1 = $_FILES['tab1']['name'][$i];
echo $plik_tmp = $_FILES['tab1']['size'][$i];
 }

Chodzi mi o końdówkę echo [$i]??

Może coś takiego:


  echo $_FILES['upload'.$i]['name']; 
0

Zrobiłem tak:


foreach($_FILES['tab']['tmp_name'] as $key => $value){
 $_FILES['tab']['error'][$key];
$_FILES['tab']['size'][$key];
$nazwa = $_FILES['tab']['name'][$key];
if (!empty($nazwa)){
$zap3 = mysql_query("INSERT INTO `zdjecia_kwatery` (`ID_kwatery`, `z1`) VALUES ('$idkwatery', '$nazwa');") or die ('Nie mozna dodac zdjec');
}}

Śmiać się ile chcecie :( Może ktoś potrafi trochę ulepszyć sam ten kod? Bo to co tu jest ? To jest LAMERSTWO, aż mnie boli w środku !!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0