Za darmo na e-mailPraktyczny kurs PHP (aż 200 stron!)

Krok po kroku, opanuj podstawy PHP za darmo - praktyczny kurs w formie e-booka prosto na Twój e-mail

Upload file

odsłon: 2.71Kfile mysql php Upload
0

Mam problem z wrzucaniem plików na serwer.

Poniższy kod działa prawidłowo jako osobny plik ale jak go wrzucę do innego gdzie jest już inny formularz wrzucający dane do bazy to upload plików nie działa. Dziwne jest to ze kiedyś działał ale aplikacja była mniej rozbudowana o kod tak PHP jak i js. Oczywiście isset wskazuje na inny input niż główny do edycji rekordu w bazie. Nie wiem jak do tego podejść, zacząłem już czytać o podwójnym formularzu na stronie ale nie wiem czy to dobry kierunek. Czytałem też to https://www.w3schools.com/TAgs/att_button_formenctype.asp ale nie do końca rozumiem działanie. Jakieś porady jak to ogarnąć?

<?php
require('db.php');
?>
 <!DOCTYPE HTML>
<html lang="pl">
<head>
 <meta charset="utf-8" />
 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
 <title>Upload file</title>
</head>
 <body>
  <form action="" method="post" enctype="multipart/form-data">
 <fieldset>
    <legend>Upload file</legend>
      <label for="zl">Zlecenie</label><input type="text" name="zl" id="zl"><br>
      <input type='file' id='file' name='file'><br>
      <input name='submit' type='submit' value='Dodaj'></br>
 </fieldset>
</form>
<?php
if (isset($_POST['submit']))
  {
  #retrieve file name from file
  $fileName = $_FILES['file']['name'];
  #max mb
  $fileSize = $_FILES['file']['size'];
  #temporary file name to store file
  $tname = $_FILES['file']["tmp_name"];
  #get file ext from file
  $fileExt = explode('.', $fileName);
  #change to lower case
  $fileActualExt = strtolower(end($fileExt));
  #allowed ext
  $allowed = array('jpg','jpeg','png','pdf');
 if (in_array($fileActualExt,$allowed)){
  if($fileSize <= 5000000){
  #file name with a random number so that similar don't get replaced
  $pname = rand(1000,10000)."-".$fileActualExt;
  #upload directory path
  $uploads_dir = 'uploads';
  #TO move the uploaded file to specific location
  move_uploaded_file($tname, $uploads_dir.'/'.$pname);
    echo "OK";
  }else{
    echo "File too big";
  }
  }elseif(!in_array($fileActualExt,$allowed)){
    echo "Bad format";
  }
}                       
  if(isset($_POST['submit'])){
  $zl = $_REQUEST['zl'];
  $upload = "UPDATE guitars SET img2 ='".$pname."' WHERE ID=$zl";
  mysqli_query($con,$upload);
}
?>
 </body>
</html>

odpowiedział na pytanie
Dodaj komentarz
0

Jak masz dwa formularze, to może problemem jest rozpoznawanie, z jakiego idzie submit. Może starczy do każdego formularza dodać pole hidden, które go zidentyfikuje i wtedy obsługę dodania robisz tak:

// Jeśli w ogóle jest POST

if (isset($_POST)) {

// Jeśli to właściwy formularz

if ($_POST[fid] == “upl”) {

// obsługujemy file upload z formularza “upl”

Ogólnie radzę zobaczyć, co Ci w ogóle przychodzi

error_log(print_r($_POST, true));

error_log(print_r($_FILES, true));

może Ci wiele wyjaśnić, a może i pomoże w problemie.

Podany przykład pokazuje, że jeden form może mieć wiele klawiszy submit (zresztą może to wywołać też np zmiana listy, są formy bez klawisza, gdzie tylko wybierasz np kolor i od razu idziesz dalej, bo wybór robi submit). Jeden z nich puszcza oryginalne znaki, a drugi robi z nich plain text.

Po lekkiej zmianie kodu widać zysk tego typu podejścia. Wpisz w kod np

Ståle <br> i zrób run. W plain dostaniesz to poniżej, co zabezpiecza np przed injection SQL, bo to w ogóle ani nie wykona SQL ani nie zmodyfikuje wyświetlania, <br> zostanie przeformatowany.
St%C3%A5le+%3Cbr%3E

odpowiedział na pytanie
Dodaj komentarz
0

Hej Mariusz,

Musiałbyś pokazać, w jaki sposób łączysz te dwa formularze w jednym pliku. Bez tego to trochę jak wróżenie z fusów.

Generalnie tendencja jest taka, że kod HTML wyświetlający dany formularz jest w innym pliku, niż kod PHP obsługujący dane z formularza. Wtedy mając jeden plik z widokiem, na którym masz wiele różnych formularzy – każdy z formularzy miałby parametr action odpowiadający plikowi przetwarzającemu jego dane.

Wtedy nie masz też problemu z wieloma zmiennymi o tych samych nazwach, które mogłyby przyjść z różnych formularzy.

odpowiedział na pytanie
Dodaj komentarz
Wpisz swoją odpowiedź.
Ominiesz taką okazję?Praktyczny Kurs PHP (aż 200 stron!) za darmo

Gorąco polecam, naprawdę warto skorzystać! To nic nie kosztuje. Krok po kroku, opanuj podstawy PHP za darmo - praktyczny kurs w formie e-booka prosto na Twój e-mail.