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>
2 Odpowiedzi
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
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.