Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Listowanie folderów i dodawanie wyniku do bazy
Forum PHP.pl > Forum > Przedszkole
Mis323
Cześć,
Ostatnio pytałem o ffmpeg i rozwiązałem problem z waszą pomocą.
Dziś chciałbym zrobić listowanie katalogu, w którym jest skrót filmu kilka sekund. Nazwa plików to id z bazy danych, mam listowanie ale nie wiem jak pobrać ścieżkę dostępu gdzie znajduje się film i później zrobić update bazy danych.

  1.  
  2. $dir = 'filmy';
  3. $dh = opendir($dir);
  4. while (false !== ($fileName = readdir($dh))) {
  5. $ext = substr($fileName, strrpos($fileName, '.') + 1);
  6. if(in_array($ext, array("mp4")))
  7. $files1= $fileName;
  8.  
  9.  
  10. echo" $files1</br>";
  11.  



Mam jeszcze pytanie, na stronie mam upload plików i tutaj pojawia się pytanie ponieważ wrzucam cały film. Później ffmpeg tworzy z niego skrót
I wrzuca do folderu, funkcja musi dzialac po dodaniu filmu poniewaz zeby ffmpeg stworzyl film musi byc id z bazy danych jak inaczej to rozwiązać może ktoś ma inny pomysł?
dublinka
Cytat(Mis323 @ 1.09.2019, 08:18:11 ) *
Cześć,
Ostatnio pytałem o ffmpeg i rozwiązałem problem z waszą pomocą.
Dziś chciałbym zrobić listowanie katalogu, w którym jest skrót filmu kilka sekund. Nazwa plików to id z bazy danych, mam listowanie ale nie wiem jak pobrać ścieżkę dostępu gdzie znajduje się film i później zrobić update bazy danych.

  1.  
  2. $dir = 'filmy';
  3. $dh = opendir($dir);
  4. while (false !== ($fileName = readdir($dh))) {
  5. $ext = substr($fileName, strrpos($fileName, '.') + 1);
  6. if(in_array($ext, array("mp4")))
  7. $files1= $fileName;
  8.  
  9.  
  10. echo" $files1</br>";
  11.  




Mam jeszcze pytanie, na stronie mam upload plików i tutaj pojawia się pytanie ponieważ wrzucam cały film. Później ffmpeg tworzy z niego skrót
I wrzuca do folderu, funkcja musi dzialac po dodaniu filmu poniewaz zeby ffmpeg stworzyl film musi byc id z bazy danych jak inaczej to rozwiązać może ktoś ma inny pomysł?



Masz katalog to wiesz gdzie sa pliki przeciez.

  1. <?php
  2.  
  3. $ca = dir('filmy');
  4. $ro = '.mp4';
  5. $tab = array();
  6. while((false!==($pl=$ca->read())))
  7. {
  8. if($pl!="."&&$pl!="..")
  9. {
  10. if(substr($pl,-strlen($ro))==$ro)
  11. {
  12. $tab[] = $pl;
  13. };
  14. };
  15. };
  16.  
  17. while(list(,$val) = each($tab))
  18. {
  19. echo 'adres/katalog/' . $val . '<br>';
  20. }
  21. ?>
viking
  1. foreach (glob("filmy/*.mp4") as $filename) {
  2. echo $filename;
  3. }


Równocześnie z wgrywaniem pliku stwórz odpowiedni wpis w bazie, dodaj jakąs flagę która opisuje stan przetwarzania pliku. W przypadku przetwarzania długotrwałego (jakim jest obrabianie filmu) stosuje się zazwyczaj systemy kolejek (np rabbitmq). W takim wypadku możesz mieć dane nie gotowe jeszcze dla użytkownika ale taki urok tego rozwiązania. Zazwyczaj też w systemach rozproszonych (kilka serwerów przerabiających długotrwałe zadania) nie stosuje się id tylko uuid.
Mis323
Dziękuję za pomoc, przepraszam że dopiero teraz ale wcześniej nie miałem czasu.

Problem w tym że nie wiem jak przypisać pętle do zmiennej
  1. $rest = substr($pl, 0, -4); // zwraca nazwe pliku bez rozszerzenia
  2.  
  3. foreach (glob("filmy/*.mp4") as $filename) {
  4. echo $filename;
  5. }
  6.  


Jeśli wpiszę zmienną po za pętla to wypisuje ostatni rekord.
Sprawdzenie czy "tag" jest pusty.
  1. SELECT * FROM baza WHERE OCTET_LENGTH(tag) == 0

i teraz potrzebował bym zrobić znów całe zapytanie w pętli. Jeśli rekord jest pusty to dodaj rekord o id = $rest AND tag = $filename tylko że nie wyświetla wszystkich rekordów tylko ostatni.
dublinka
patrz moj przyklad.

  1. $tab;


Jest tablicą która zawiera wszystkie nazwy plików.
viking
  1. $files = glob("filmy/*.mp4");
  2.  
  3. array_walk($files, function (&$item) {
  4. $item = pathinfo($item, PATHINFO_FILENAME);
  5. });
  6.  
  7. var_dump($files);


Nie bazuj na sprawdzaniu rozszerzenia w ten sposób (cośtam minus przewidywana liczba znaków) bo się możesz przejechać.
Mis323
Cytat(dublinka @ 8.09.2019, 13:30:43 ) *
patrz moj przyklad.

  1. $tab;


Jest tablicą która zawiera wszystkie nazwy plików.


Ale nie mogę użyć tablicy do zapytania sql




Cytat(viking @ 8.09.2019, 14:40:10 ) *
  1. $files = glob("filmy/*.mp4");
  2.  
  3. array_walk($files, function (&$item) {
  4. $item = pathinfo($item, PATHINFO_FILENAME);
  5. });
  6.  
  7. var_dump($files);


Nie bazuj na sprawdzaniu rozszerzenia w ten sposób (cośtam minus przewidywana liczba znaków) bo się możesz przejechać.

Dziękuje za podpowiedz ale w tym przypadku wszystkie filmy muszą mieć rozszerzenie .mp4 dlatego wybrałem łatwiejszy sposób.
dublinka
Cytat(Mis323 @ 8.09.2019, 15:43:25 ) *
Ale nie mogę użyć tablicy do zapytania sql



https://stackoverflow.com/questions/1005463...tabase-with-php
Mis323
Cytat(dublinka @ 8.09.2019, 16:55:01 ) *


Można coś jaśniej napisać jak to zrobić z tego wątku który podałeś nie rozumiem.
dublinka
Cytat(Mis323 @ 8.09.2019, 16:39:17 ) *
Można coś jaśniej napisać jak to zrobić z tego wątku który podałeś nie rozumiem.

To jest odpowiedz na twoja odpowidz ze nie mozesz uzyc tablicy do zapytania sql.

Mało rozumiem z tego co napisales.Tylko tyle ze nie mozesz. Nie siedze w Twojej glowie i nie wiem co chcesz robic a Twoje pytanie jakiej pogmatwane i nie jasne. Ogolnie w tym linku masz odpowiedz jak dodac dane z tablicy do zapisu bo chyba o to Ci chodzi.
Mis323
Przepraszam może jeszcze raz od początku.
Dałeś przykład że moża użyć tablicy array jako zapytania dodającego rekord do bazy. Wszystko fajnie ale czy mógłbym prosić o inny przykład lub kawałek kodu, jak ma wyglądać kod? bo z tego linka
średnio rozumiem jak to zrobić.

Obecnie tak wygląda moja tablica.

  1. Array ( [0] => 1031fa769bd163249a55c53f894edadd.mp4 [1] => 38a199f634e3618042da9468256bffa1.mp4 [2] => 3ca18948d15b7f0530d5b78511885778.mp4 [3] => 4843634a4f99f3bef247c89c6ca58be9.mp4 [4] => 6d6f24a34dcdf70e3126c138a39bc064.mp4 [5] => 74cc24692dac38f0730b81df49c32980.mp4 [6] => 75735a9f3c2c84776603c389ddd1dee5.mp4 [7] => 82651b85cbff6833bc3c40bed59787a4.mp4 [8] => 865b93d1f1d2273dd9d9bc05a7426410.mp4 [9] => 91f0e89ee468989e321895caa0b78bc2.mp4 [10] => ad1ff05c60d55e3f72341d40cfcb545e.mp4 [11] => cf668c61fb4c1196a31b69f823492a00.mp4 [12] => d7b6748d54ab1c3ee0b5afb035c029a5.mp4 [13] => eccecd0522d2b978003e00c0b0120134.mp4 )
  2.  
dublinka
Jesli nie radzisz sobie z tym to moze to:

Zrobic to mozna przy pomocy pętli.

https://www.sitepoint.com/community/t/inser...o-database/1773

lub

https://stackoverflow.com/questions/5404317...ql-through-loop

Mam nadzieje ze teraz zrozumiesz wink.gif
Mis323
Cytat(dublinka @ 9.09.2019, 19:41:47 ) *
Jesli nie radzisz sobie z tym to moze to:

Zrobic to mozna przy pomocy pętli.

https://www.sitepoint.com/community/t/inser...o-database/1773

lub

https://stackoverflow.com/questions/5404317...ql-through-loop

Mam nadzieje ze teraz zrozumiesz wink.gif

Tak dziękuje, ale mam jeszcze pytanie jak rozdzielić teraz filmy tak żeby każdy film był osobno a nie tak jak teraz ze wszytsko dodaje się do jednego. Wiem że można skorzystać z funkcji expload ale wtedy występuję błąd array

  1. $data = array();
  2.  
  3. foreach($tab as $team)
  4. $data[] = "" . addslashes($team) . "";
  5.  
  6. $data = implode("," , $data);
  7.  
  8.  
  9.  
  10.  
  11. for($test = 0; $test <= 7; $test++)
  12. {
  13. $conn = mysqli_connect('localhost', 'root', '', 'test') or die('Error connecting to mysql');
  14. $zapytanie=mysqli_query($conn, "UPDATE `baza` SET `tag`='test/$data' WHERE id='$rest'");
  15.  
  16. mysqli_close($conn);
  17.  
  18. }
viking
A po co to addslashes robisz? W moim przykładzie na array_walk też możesz robić od razu insert.
dublinka
  1. <?php
  2.  
  3. $tab = array(
  4. 'jeden',
  5. 'dwa',
  6. 'trzy',
  7. 'cztery',
  8. 'pięć',
  9. 'sześć',
  10. 'siedem',
  11. 'osiem',
  12. 'dziewięć',
  13. 'dziesięć'
  14. );
  15.  
  16. $t = array();
  17. foreach($tab as $k)
  18. {
  19.  
  20. $t[] = $k . ',';
  21.  
  22. }
  23. $x = '';
  24.  
  25. for($i=0; $i<count($t); $i++)
  26. {
  27. $x .= $t[$i];
  28. }
  29. echo substr($x, 0, -1);
  30. ?>
Tomplus
czy zapytaniu ma być $rest czy $test?
nospor
@dublinka jak rozumiem miales na mysli:

polaczenie do bazy ma byc jedno a nie w petli
dublinka
Cytat(nospor @ 10.09.2019, 15:14:16 ) *
@dublinka jak rozumiem miales na mysli:

polaczenie do bazy ma byc jedno a nie w petli

Ofkoz. tym razem
nospor
tylko po grzyba kasowac posta? Zawieral dobra rade tylko cie sie jezyk zaplatal...
dublinka
Cytat(nospor @ 10.09.2019, 15:31:14 ) *
tylko po grzyba kasowac posta? Zawieral dobra rade tylko cie sie jezyk zaplatal...

se tego posta skasowalem bo sie mnie pomylil przycisk smile.gif i tak juz poszlo

Cytat(Mis323 @ 9.09.2019, 22:54:08 ) *
Tak dziękuje, ale mam jeszcze pytanie jak rozdzielić teraz filmy tak żeby każdy film był osobno a nie tak jak teraz ze wszytsko dodaje się do jednego. Wiem że można skorzystać z funkcji expload ale wtedy występuję błąd array

  1. $data = array();
  2.  
  3. foreach($tab as $team)
  4. $data[] = "" . addslashes($team) . "";
  5.  
  6. $data = implode("," , $data);
  7.  
  8.  
  9.  
  10.  
  11. for($test = 0; $test <= 7; $test++)
  12. {
  13. $conn = mysqli_connect('localhost', 'root', '', 'test') or die('Error connecting to mysql');
  14. $zapytanie=mysqli_query($conn, "UPDATE `baza` SET `tag`='test/$data' WHERE id='$rest'");
  15.  
  16. mysqli_close($conn);
  17.  
  18. }


O jakie explode chodzi i gdzie.



Mis323
Uprościłem kod do minimum

  1. <?php
  2.  
  3. include ('db/connection.php');
  4.  
  5. $katalog = 'test';
  6. $ca = dir(''.$katalog.'/');
  7.  
  8. foreach (glob("$katalog/*.mp4") as $filename) {
  9. echo $filename;
  10. }
  11.  
  12.  
  13. while((false!==($plik=$ca->read())))
  14. {
  15. if (($plik != '.') AND ($plik != '..'))
  16. {
  17. $file = pathinfo ($plik);
  18. # echo $file['filename'] . '<br />';
  19.  
  20.  
  21. }
  22. }
  23.  
  24.  
  25. $data = array();
  26.  
  27. foreach($file as $team)
  28. $data[] = "" . addslashes($team) . "";
  29.  
  30. $data = implode("," , $data);
  31.  
  32. $data = array();
  33.  
  34. foreach($file as $team)
  35. $data[] = "" . addslashes($team) . "";
  36.  
  37. $data = implode("," , $data);
  38.  
  39. $conn = mysqli_connect('localhost', 'root', '', 'test') or die('Error connecting to mysql');
  40. $zapytanie=mysqli_query($conn, "UPDATE `baza` SET `tag`='test/$filename' WHERE id='$data'");
  41.  
  42. ?>


Problem jest w tym że po wykonaniu kodu wszystkie filmy z tego folderu trafiają do 1 rekordu a chciałbym żeby kod pobrał wszystkie nazwy plików i wrzucił do odpowiedniego rekordu

Przykład:

Folder test zawiera:
1.mp4
2.mp4
3.mp4

Kod powinień pobrać nazwy plików tzn: 1, 2, 3 i podstawić w miejsce id a w miejscu tagu powinna być cała nazwa pliku z rozszerzeniem obecnie działa to tak że zapisuje wszystkie nazwy do ostatniego rekordu tj 3. Jak to naprawwić?
viking
  1. $files = glob("$katalog/*.mp4");
  2.  
  3. array_walk($files, function ($item) {
  4. $id = pathinfo($item, PATHINFO_FILENAME);
  5. $query = sprintf('UPDATE `baza` SET `tag`= \'%s\' WHERE id=%d', $item, $id);
  6. mysqli_query($conn, $query);
  7. });


Jakoś tak, nie testowałem. Item i id przepuść przez mysqli_real_escape_string();
Mis323
Cytat(viking @ 12.09.2019, 13:10:08 ) *
  1. $files = glob("$katalog/*.mp4");
  2.  
  3. array_walk($files, function ($item) {
  4. $id = pathinfo($item, PATHINFO_FILENAME);
  5. $query = sprintf('UPDATE `baza` SET `tag`= \'%s\' WHERE id=%d', $item, $id);
  6. mysqli_query($conn, $query);
  7. });


Jakoś tak, nie testowałem. Item i id przepuść przez mysqli_real_escape_string();

Dziękuje za pomoc viking! tego właśnie potrzebowałem.
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.