Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Upload wielu plików + dodawanie do bazy
Krkol
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 9.03.2018

Ostrzeżenie: (0%)
-----


Witam.
Od paru godzin głowię się nad stworzeniem skryptu, który prześle kilka plików na serwer oraz zapisze do bazy informacje o nich.

Formularz:
  1. <form method="POST" name="add" action="add.php" enctype="multipart/form-data" accept="jpg, jpeg, png, gif">
  2. <tr>
  3. <td>
  4. <input type="text" name="tytul" placeholder="Tytuł">
  5. </td>
  6. </tr>
  7. <tr>
  8. <td>
  9. Zdjęcie główne
  10. </td>
  11. <td>
  12. <input type="file" name="obraz-glowny" />
  13. </td>
  14. </tr>
  15. <tr>
  16. <td>
  17. Zdjęcia do galerii
  18. </td>
  19. <td>
  20. <input type="file" name="file[]" multiple="multiple" />
  21. </td>
  22. </tr>
  23. <tr>
  24. <td>
  25. <input type="submit" name="submit" value="Wyślij">
  26. </td>
  27. </tr>
  28. </table>
  29. </form>


Tu sprawa jest prosta... Zdjęcie główne ładnie się uploaduje i zapisuje do bazy. Problem jest, gdy chcę wrzucić kilka zdjęć przez "Zdjęcia do galerii".
Skrypt obsługujący wysyłkę:

  1. function losuj () {
  2. $znaki = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
  3. $i3 = 0;
  4. while ($i3 <= 25) {
  5. $numer3 = rand() % 33;
  6. $tmp3 = substr($znaki, $numer3, 1);
  7. $haslo3 = $haslo3 . $tmp3;
  8. $i3++;
  9. }
  10. return $haslo3;
  11. }
  12.  
  13. foreach ($_FILES['file']['name'] as $filename) {
  14.  
  15. $nazwa2 = explode( '/' , $filename );
  16. $ile2 = count( $nazwa2 );
  17. $rozszerzenie2 = $nazwa2[$ile2-1];
  18.  
  19. losuj ();
  20.  
  21. $filename = $haslo3 . '.' . $rozszerzenie2;
  22. move_uploaded_file($filename, $_SERVER['DOCUMENT_ROOT'] . 'uploads/' . $haslo2 . '/' . $filename);
  23.  
  24. mysql_query("INSERT INTO `images` (`dir`, `url`)
  25. VALUES ('".$haslo2."', '".$filename."');");
  26. }


Skrypt tworzy losową nazwę katalogu ($haslo2) i tam uploaduje wszystkie obrazy. Zmienna $haslo3 to kolejny losowy ciąg znaków, który ma być nazwą pliku. Problem w tym, że do bazy dodaje się wszystko z wyjątkiem `url` - czyli nazwą pliku. Dodaje się samo rozszerzenie. Podejrzewam, że funkcja losuj() nie zwraca mi $haslo3, tylko nie wiem dlaczego :/

Ten post edytował Krkol 2.05.2018, 16:59:48
Go to the top of the page
+Quote Post
Neutral
post
Post #2





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


Proponowałbym Tobie "zaorać" ten skrypt i napisać go od nowa, najlepiej już na PHP 7.
Go to the top of the page
+Quote Post
leonpro778
post
Post #3





Grupa: Zarejestrowani
Postów: 146
Pomógł: 19
Dołączył: 1.03.2012

Ostrzeżenie: (0%)
-----


Cytat(Krkol @ 2.05.2018, 17:57:50 ) *
Podejrzewam, że funkcja losuj() nie zwraca mi $haslo3, tylko nie wiem dlaczego :/


Nie zapisuje bo nigdzie nie przypisujesz zwracanego $haslo3. Funkcje działają trochę w inny sposób. Wywal tą linijkę z losuj(); a zmień linijkę z:

  1. $filename = $haslo3 . '.' . $rozszerzenie2;


na:
  1. $filename = losuj().'.'.$rozszerzenie2;


Go to the top of the page
+Quote Post
Neutral
post
Post #4





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


  1. <form method="post" name="add" action="" enctype="multipart/form-data">
  2. <tr>
  3. <td>You write name picture(s):</td>
  4. <td><input type="text" name="own_name" style="background:green"/></td>
  5. </tr>
  6. <tr>
  7. <td>Picture 1 - Galerry, Picture 2 - Main</td>
  8. <td><input type="file" name="pictures[]" multiple="multiple" /></td>
  9. </tr>
  10. <tr>
  11. <td><input type="submit" name="submit" value="send" /></td>
  12. </tr>
  13. </table>
  14. </form>


  1. <?php
  2.  
  3. function random_name_file() {
  4.  
  5. if(!empty($_FILES['pictures']['name'][0])){
  6. $extension = (explode('.',$_FILES['pictures']['name'][0]));
  7.  
  8. $arr = ['a','b','c','d','e','f','g'];
  9. $randomed_characters = 'x'.$arr[rand(0,6)].'yuo'.$arr[rand(0,6)];
  10.  
  11. if(getcwd()=='C:\xampp\htdocs\forumphp' && !file_exists($randomed_characters.'.'.$extension[1])){
  12. return $randomed_characters;
  13. }else if(getcwd()=='C:\xampp\htdocs\forumphp' && !file_exists($_POST['own_name'].'.'.$extension[1]) && !empty($_POST['own_name']) && ctype_alpha($_POST['own_name'])){
  14. return $_POST['own_name'];
  15. }else if(getcwd()=='C:\xampp\htdocs\forumphp' && !file_exists($extension[0].'.'.$extension[1])){
  16. return $extension[0];
  17. }else{
  18. return 1;
  19. }
  20. }else {
  21. return 1;
  22. }
  23. }
  24.  
  25. $arr_empty = [random_name_file()];
  26.  
  27. if(!empty($_FILES['pictures']['name'][0])){
  28. $extension = (explode('.',$_FILES['pictures']['name'][0]));
  29. if($arr_empty[0]==1){
  30. echo 'This name is busy or consist from disallowed characters, please choose other';
  31. }else{
  32. if(move_uploaded_file($_FILES['pictures']['tmp_name'][0],$arr_empty[0].'.'.$extension[1])===true){
  33. echo 'Successfully uploaded!';
  34. }else{
  35. echo 'Failed uploaded!';
  36. }
  37. }
  38. }else{
  39. echo 'Not send file to server, because you don\'t clicked to "send" and you don\'t choose file to upload';
  40. }
  41. ?>


Trzeba to lekko poprawić, aby było zgodne z zasadą DRY (Don't Repeat Yourseflt (Nie powtarzaj się)). Chodzi mi o tę linię:

  1. if(!empty($_FILES['pictures']['name'][0])){ // ...


w funkcji i poza nią. Chyba, żeby przenieść tę linijkę przed funkcję i żeby to był jeden wielki if. Skrypt napisałem pod plik pojedynczy, nie multiple, gdybyś chciał wiele plików upload'ować, to musiałbyś przerobić ten skrypt.

Ten post edytował Neutral 8.05.2018, 13:19:13
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@neutral tak z czystej ciekawosci bo nie ogarniam...
leonpro778 juz dawno podal rozwiazanie problemu a ty po paru dniach podajesz skrypt ktory:
- jest jakims tam twoim skryptem, ktory robi zupelnie co innego niz oczekuje autor
- zawiera lokalne sciezki do twoich katalogow
- mowisz autorowi by zaoral skrypt i przepisal go na php7 po czym sam podajesz skrypt, ktory z php7 nie ma nic wspolnego
- i generalnie ma sie nijak do problemu autora i trzeba by go przerabiac by dzialalo jak autor chce.
Po co? Mozesz mnie oswiecic jaki byl cel tego posta?

ps:
Cytat
aby było zgodne z zasadą DRY (Don't Repeat Yourseflt (Nie powtarzaj się)). Chodzi mi o tę linię:
to jest tylko wierzcholek gory lodowej w rzeczach ktore tam masz do poprawy wink.gif


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


No i te "lekko poprawić". Raczej zaorać jak już sam wspomniałeś.

jest tyle tam rzeczy do których można by się przyczepić aż mi się nie chce. Ja rozumiem chęć niesienia pomocy ale bądźmy ludź sukcesu a nie bylejakości wink.gif
Go to the top of the page
+Quote Post
Neutral
post
Post #7





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


Wiem, że istnieje takie coś jak:

? ... :
? ?

Oczywiście bez spacji w drugim przypadku, napisałem tak, bo się emotikona pojawiła.
http://php.net/manual/en/migration70.php

Zacząłem pisać, więc chciałem już dokończyć, a że wiele rzeczy jest do poprawy, szczególnie te if'y, to wiem. Może komuś się przyda. Ścieżki do katalogów przecież można sobie pozmieniać na swoje. Gdybym chciał to pisać w OOP chociażby to dłużej by mi to zeszło, zresztą już chciałem zakończyć ten projekt. Może do tego wrócę i poprawię, nie wiem.

Ten post edytował Neutral 8.05.2018, 14:50:35
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Tu nie chodzi o ?: ale o caloksztalt.
Generalnie bym sie nie wtracal gdybys sam najpierw userowi nie pisal by to zaoral i przepisal na php7 a potem ni z gruszki nie z pietruszki wstawiasz takie "cos" co wcale nie jest lepsze od kodu, ktory zaleciles komus innemu zaorac :/

ps:
Cytat
Ścieżki do katalogów przecież można sobie pozmieniać na swoje.

zacznijmy od tego ze te sciezki wpisane z palca sa tam totalnie ZLE


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Neutral
post
Post #9





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


Cytat
zacznijmy od tego ze te sciezki wpisane z palca sa tam totalnie ZLE


Nie wiem za bardzo, co masz na myśli. U mnie jakoś działa. Czy mógłbyś rozwinąć myśl o tym getcwd()?
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
U mnie jakoś działa.
A czy ja mowie ze nie dziala.... Ja mowie, ze to jest zle zrobione. Przenies teraz chociazby ten skrypt do innego katalogu i zobacz czy bez zmian kodu bedzie dzialac. A to tylko jeden z powodow dlaczego te sciezki tam sa ZLE.


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Neutral
post
Post #11





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


Dzięki @nospor, teraz zrozumiałem o co chodzi. W tym kodzie getcwd(), to taki jakby constant (stała), a to, czy zostaną pliki umieszczone w innym katalogu, czy nie to już inna sprawa. Można nawet przypisać do zmiennej tę ścieżkę 'C:\xampp\htdocs\forumphp' i w jednym miejscu tylko zmienić. Jeśli chodzi oto, że byłoby lepiej bez getcwd(), to może i racja, nie pomyślałem chyba, jak kto woli zresztą. Moim zdaniem, aż takie złe to nie jest, chodź może się mylę. Gdybym wykonał jakiś większy projekt z tym, to może bym zobaczył jakie to powoduje kłopoty, ale nie wydaje mi się.

Ten post edytował Neutral 8.05.2018, 15:12:05
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Jeśli chodzi oto, że byłoby lepiej bez getcwd(), to może i racja, nie pomyślałem chyba, jak kto woli zresztą. Moim zdaniem, aż takie złe to nie jest, chodź może się mylę. Gdybym wykonał jakiś większy projekt z tym, to może bym zobaczył, jakie to powoduje kłopoty, ale nie wydaje mi się.
W tym zdaniu jest wiele sprzecznosci wink.gif

Ok, mylisz sie. To jest ZLE - przyjmij to jako aksjomat wink.gif

Co do poprawnego rozwiazania, to gdzies tam, w pliku konfiguracyjnym definiuje sie sciezke, do ktorej wrzuca sie pliki z UPLOAD i poprostu te pliki tam sie wrzuca a nie sprawdza, czy przypadkiem working directory jest wlasnie w tej sciezce. Totalnie podszedles od zlej strony do tego.


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 23:38