Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Upload wielu plików + dodawanie do bazy
Forum PHP.pl > Forum > Przedszkole
Krkol
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 :/
Neutral
Proponowałbym Tobie "zaorać" ten skrypt i napisać go od nowa, najlepiej już na PHP 7.
leonpro778
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;


Neutral
  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.
nospor
@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
Pyton_000
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
Neutral
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.
nospor
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
Neutral
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()?
nospor
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.
Neutral
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ę.
nospor
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.
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.