Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Upload plików + formularz + walidacja
Forum PHP.pl > Forum > Przedszkole
casperii
Panowie robię poprzez formularz przesył plików oraz zwykły input który jest walidowany, niestety pojawił się problem, który polega na tym, że jeśli wysyłam bez "uaktywnienia" walidacji wszystko działa ok, natomiast jeśli "auaktywni" się walidacja gdzieś gubi zmienną:

kod html:
  1. <form method="post" name="dodaj" enctype="multipart/form-data">
  2. Avatar: <input type="text" name="avatar" value="">
  3. Wgraj plik: <input type="file" name="plik[]">
  4. <input type="submit" name="dodaj" value="Zapisz">
  5. </form>


kod php:
  1. if(array_key_exists('dodaj', $_POST)){
  2. $avatar = $_POST['avatar'];
  3. $mojplik = isset($_FILES['plik'])? $_FILES['plik'] : array();
  4.  
  5. if(empty($avatar)){
  6. $blad = "Brak nazwy avatar.";
  7. }else{
  8. try{
  9. $errors = true;
  10. if(isset($mojplik['name'])){
  11. if (!file_exists(''.server().'/avatar/'.$ids.'')) {
  12. mkdir(''.server().'/avatar/'.$ids.'', 0777);
  13. foreach ($mojplik['name'] as $val=>$fileName){
  14.  
  15. $FileTmpOne = $mojplik['tmp_name'][0];
  16. $FileNameOne = $mojplik['name'][0];
  17. $FileSizeOne = $mojplik['size'][0] / 1000;
  18. $format = explode('.', $FileNameOne);
  19. $obrazek1 = md5($FileTmpOne.$FileSizeOne.$ids);
  20.  
  21. if(is_uploaded_file($FileTmpOne)) {
  22. if($FileSizeOne <= 5000){
  23. if($format[1] == 'jpg'){
  24. move_uploaded_file($FileTmpOne, ''.server().'/avatar/'.$ids.'/'.$obrazek1.'.jpg');
  25. }else{
  26. $msg = 'Dozwolony tylko jpg.';
  27. $errors = false;
  28. }
  29. }else{
  30. $msg = 'Dozwolony tylko do 5 mb';
  31. $errors = false;
  32. }
  33. }
  34.  
  35. $FileTmpTwo = $mojplik['tmp_name'][1];
  36. $FileNameTwo = $mojplik['name'][1];
  37. $FileSizeTwo = $mojplik['size'][1] / 1000;
  38. $format = explode('.', $FileNameTwo);
  39. $obrazek2 = md5($FileTmpTwo.$FileSizeTwo.$ids);
  40.  
  41. if($errors == true){
  42. $pdo = new db_connect();
  43. $sql = $pdo->prepare("INSERT INTO `users` (
  44. `ids`, `obrazek1`, `obrazek2`)
  45. VALUES (
  46. :item, :obrazek1)");
  47.  
  48. $sql->bindValue(':ids', $ids, PDO::PARAM_INT);
  49. $sql->bindValue(':obrazek1', $obrazek1, PDO::PARAM_STR);
  50. $sql->bindValue(':obrazek2', $obrazek2, PDO::PARAM_STR);
  51. $sql->execute();
  52.  
  53. $msg = 'super dodano.';
  54. }else{
  55. $msg = 'błąd';
  56. }
  57.  
  58. }catch(PDOException $e){
  59. echo $e->getMessage();
  60. $msg = 'błąd dodania.';
  61. }
  62. }
  63. }


Robiąc print_r($obrazek1) - widzę, że zmienna $obrazek1 w przypadku wykrycia walidacji i ponownym wysłaniu formularza gdzieś się traci.
Ktoś pomoże ?

Aha operacje na pliku robię na tablicy , gdyż dojdzie jeszcze możliwość wgrania innego formatu.
SmokAnalog
Co dokładnie masz na myśli? Pliki wybrane w input file zostaną zapomniane przy ponownym wyświetleniu formularza i nie da ich się tam ponownie wrzucić (kwestie bezpieczeństwa). Za każdym razem użytkownik będzie musiał ponownie wybrać plik. Możesz to usprawnić w taki sposób, że zapiszesz plik mimo błędu, a w ponownie wyświetlonym formularzu pokażesz np. input hidden, żeby sobie połączyć ten formularz z plikiem.
casperii
@SmokAnalog chodziło mi o sytuacje, gdzie wrzucam plik powyżej 5 mb, walidacja krzyknie błędem, wrzucę ponownie do inputa file plik tym razem mniejszy niż 5 mb , to plik ten już się nie uploaduje. tak jakby nie widział go ?
trueblue
A skąd się biorą wartości dla zmiennych $zdjecie1 oraz $fileTwo?
casperii
@trueblue zobacz teraz smile.gif błędne wartości podałem do zapisu do bazy, ale to nie ma znaczenia bo problem polega na uploadzie plików po wykrzyczeniu błędów.
trueblue
A linii 11 się przyglądałeś?
casperii
A co tam niepokojącego jest w linii 11 ?
Jeżeli plik nie istnieje tworzy katalog.
trueblue
A jeśli istnieje?
casperii
w tym formularzu nie ma możliwości , żeby istniał , ale można w razie W warunek inny zrobić, ale nadal nie wiem gdzie leży problem z tym , że za pierwszym razem uploaduje pliki, za drugim już nie.
trueblue
Zmienna $ids ma wartość niepowtarzalną?
Skąd ona się bierze?
casperii
$ids = jest generowana losowo, jest niepowtarzalna.
trueblue
Czyli kiedy pierwszy raz robię upload, to $ids może mieć wartość 1, a za drugim razem, 2, tak?

Przyjrzyj się INSERT.

Co dokładnie nie działa? Sprawdzałeś krok po kroku jaka fragment jest wywoływany, a jaki nie?
casperii
Ja bym się nie "czepiał" SQLa gdyż ten za każdym razem dodaje do bazy, problem jest wyłącznie przy uploadowaniu po raz drugi ( w sensie po wyświetleniu komunikatu, że za duży plik) pliku na serwer.
Dokładnie jak się odświeży to $ids otrzyma nowy identyfikator ( sensie ponownie na stronie).

Dobra już widzę problem, mimo , że formularz nie został dopisany do bazy to ten katalog się tworzy z $ids i tu się pojawia problem.
trueblue
A ja bym w tym momencie się czepiał, bo wstawiasz do trzech kolumn, dwie wartości.
Po prostu nie podajesz w pełni poprawnego fragmentu kodu.

Sprawdzałeś kroku po kroku gdzie jest problem?

//edycja
Czyli jednak $ids nie jest niepowtarzalne, tak?
I dlatego if, o którym pisałem powoduje za drugim razem ominięcie całego uploadu.
casperii
$ids jest generowany - jest nie powtarzalny, ale widać z każdym wejściem na stronę smile.gif
Zaraz czy działa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.