Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] while - objaśnienie na przykładzie
Forum PHP.pl > Forum > Przedszkole
shpaque
Witajcie - to może paradoksalnie śmieszne, ale nigdy wcześniej nie korzystałem z pętli while smile.gif a podejrzewam, że tutaj będzie jak znalazł. Chodzi o zapętlenie dopóki nazwa pliku nie będzie "wolna"

obecnie jest tak:
  1. if (file_exists('./db/upload/'.$fileName.'.'.$fileExtension)) {$newFileName = $fileName.'[1].'.strtolower($fileExtension);}
  2. else {$newFileName = $fileName.'.'.strtolower($fileExtension);}


jest ok, tylko petla wykona się jeden raz, to znaczy kiedy dam plik 1.txt, to za drugim razem mi stworzy 1[1].txt, ale jesli jeszcze raz dam 1.txt to ZNÓW mi stworzy 1[1].txt i bedzie tu juz duplikat

wiec jak powinna wygladac while? cos takiego?
  1. while (!file_exists('./db/upload/'.$fileName.'.'.$fileExtension)) {
  2. $newFileName = $fileName.'[1].'.strtolower($fileExtension);
  3. })


?
nospor
No ale zastanow sie przez chwile. W petli sprawdzasz ciagle ten sam plik, wiec jakim cudem petla ma kiedys przestac? Zdaje sie masz sprawdzac inny plik co nie? wink.gif
shpaque
to wie,m dlatego zastanawiam sie czy takie cos przejdzie i czy ma sens:
  1. if (file_exists('./db/upload/'.$fileName.'.'.$fileExtension)) {
  2. $countWhile = 1;
  3. $newFileName = $fileName.'['.$countWhile.'].'.$fileExtension;
  4. while (!file_exists('./db/upload/'.$fileName.'['.$countWhile.'].'.$fileExtension)) {
  5. $countWhile++;
  6. $newFileName = $fileName.'['.$countWhile.'].'.$fileExtension;
  7. }
  8. }


czy jednak trzeba pisac 3 razy wiecej i zapetlac wszystkie pliki w katalogu, robic glob'a sprawdzac nazwy, liczyc te nazwy i dopiero dodawac...
trueblue
Wykorzystałbym funkcję glob wyszukując po:
  1. $nazwa . "_*." . $rozszerzenie

Mając liczbę znalezionych plików (count) dodajesz automatycznie licznik do nowej nazwy.
nospor
Wywal ten IF. wystarczy tylko to:

  1. $newFileName = $fileName.'.'.$fileExtension;
  2. $ = 1;
  3. while (file_exists($newFileName)) {
  4. $i++;
  5. $newFileName = $fileName.'['.$i.']'.'.'.$fileExtension;
  6. }

i juz
A w petli nie negacja tylko czy plik istnieje
shpaque
super, dziękuję bardzo smile.gif

Cytat(nospor @ 7.01.2021, 16:25:55 ) *
Wywal ten IF. wystarczy tylko to:

  1. $newFileName = $fileName.'.'.$fileExtension;
  2. $ = 1;
  3. while (file_exists($newFileName)) {
  4. $i++;
  5. $newFileName = $fileName.'['.$i.']'.'.'.$fileExtension;
  6. }

i juz
A w petli nie negacja tylko czy plik istnieje

nie jednak to nei dziala - zapisuje mi dwa razy tren sam plik...

daje w razie czego cala klamerke

  1. if (isset($_FILES['uploads'])) {
  2. $filesToUpload = $_FILES['uploads'];
  3. $countFilesToUpload = count($filesToUpload['name']);
  4. $counter = 0;
  5. for ($i = 0; $i < $countFilesToUpload; $i++) {
  6. $newFileId = newStringId(8);
  7. $fileExtension = explode('.', $filesToUpload['name'][$i]);
  8. $fileExtension = strtolower(end($fileExtension));
  9. $fileName = str_replace('.'.$fileExtension, '', $filesToUpload['name'][$i]);
  10. if (in_array($fileExtension, $allowedExtensions)) {
  11. $newFileName = $fileName.'.'.$fileExtension;
  12. $countWhile = 1;
  13. while (file_exists($newFileName)) {
  14. $countWhile++;
  15. $newFileName = $fileName.'['.$i.'].'.$fileExtension;
  16. }
  17. move_uploaded_file($filesToUpload['tmp_name'][$i], './db/upload/'.$newFileName);
  18. // Dodajmy wpis do bazy danych
  19. $newFile = $loadPageDataBase -> files -> addChild('file', $newFileName);
  20. $newFile -> addAttribute('id', $newFileId);
  21. $newFile -> addAttribute('title', '');
  22.  
  23. $counter++;
  24. }
  25. }
  26. }


ło matko jakie przeoczenie az wstyd smile.gif

  1. $newFileName = $fileName.'['.$countWhile.'].'.$fileExtension;


...jednak mimo tej poprawki dalje tworzy caly czas ten sam plik - czyli po prostu while nie dziala
nospor
Pokaz kod po poprawkach bo juz nie wiem jaka masz wersje wink.gif
shpaque
  1. if (isset($_FILES['uploads'])) {
  2. $filesToUpload = $_FILES['uploads'];
  3. $countFilesToUpload = count($filesToUpload['name']);
  4. $counter = 0;
  5. for ($i = 0; $i < $countFilesToUpload; $i++) {
  6. $newFileId = newStringId(8);
  7. $fileExtension = explode('.', $filesToUpload['name'][$i]);
  8. $fileExtension = strtolower(end($fileExtension));
  9. $fileName = str_replace('.'.$fileExtension, '', $filesToUpload['name'][$i]);
  10. if (in_array($fileExtension, $allowedExtensions)) {
  11. $newFileName = $fileName.'.'.$fileExtension;
  12. $countWhile = 1;
  13. while (file_exists($newFileName)) {
  14. $countWhile++;
  15. $newFileName = $fileName.'['.$countWhile.'].'.$fileExtension;
  16. }
  17. move_uploaded_file($filesToUpload['tmp_name'][$i], './db/upload/'.$newFileName);
  18. // Dodajmy wpis do bazy danych
  19. $newFile = $loadPageDataBase -> files -> addChild('file', $newFileName);
  20. $newFile -> addAttribute('id', $newFileId);
  21. $newFile -> addAttribute('title', '');
  22.  
  23. $counter++;
  24. }
  25. }
  26. }
nospor
No ale panie kolego, jaj sobie ze mnie nie rob tongue.gif

W while sprawdzasz teraz tylko $newFileName a do upload robisz sciezke './db/upload/'.$newFileName... no przeciez to sa dwie rozne lokalizacje. W while tez masz sprawdzac './db/upload/'.$newFileName
shpaque
Faktycznie niezłe przeoczenie smile.gif Teraz jest bosko i wszystko hula jak powinno - dziękuję bardzo; Zmieniłem jeszcze początkowy count dla while na "0" bo i tak liczy przed sprawdzeniem więc wtedy zaczyna od 1...

Cała klamerka wyglądać powinna właśnie tak:

  1. // W tym kroku sprawdźmy, czy nie należy dodać jakichś plików
  2. if (isset($_FILES['uploads'])) {
  3. $filesToUpload = $_FILES['uploads'];
  4. $countFilesToUpload = count($filesToUpload['name']);
  5. $counter = 0;
  6. for ($i = 0; $i < $countFilesToUpload; $i++) {
  7. $newFileId = newStringId(8);
  8. $fileExtension = explode('.', $filesToUpload['name'][$i]);
  9. $fileExtension = strtolower(end($fileExtension));
  10. $fileName = str_replace('.'.$fileExtension, '', $filesToUpload['name'][$i]);
  11. if (in_array($fileExtension, $allowedExtensions)) {
  12. $newFileName = $fileName.'.'.$fileExtension;
  13. $countWhile = 0;
  14. while (file_exists('./db/upload/'.$newFileName)) {
  15. $countWhile++;
  16. $newFileName = $fileName.'['.$countWhile.'].'.$fileExtension;
  17. }
  18. move_uploaded_file($filesToUpload['tmp_name'][$i], './db/upload/'.$newFileName);
  19. // Dodajmy wpis do bazy danych
  20. $newFile = $loadPageDataBase -> files -> addChild('file', $newFileName);
  21. $newFile -> addAttribute('id', $newFileId);
  22. $newFile -> addAttribute('title', '');
  23.  
  24. $counter++;
  25. }
  26. }
  27. }
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.