Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [MySQL][PHP]Listowanie folderów i dodawanie wyniku do bazy

Napisany przez: 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 = http://www.php.net/opendir($dir);
  4. while (false !== ($fileName = http://www.php.net/readdir($dh))) {
  5. $ext = http://www.php.net/substr($fileName, http://www.php.net/strrpos($fileName, '.') + 1);
  6. if(http://www.php.net/in_array($ext, http://www.php.net/array("mp4")))
  7. $files1= $fileName;
  8.  
  9.  
  10. http://www.php.net/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ł?

Napisany przez: dublinka 1.09.2019, 09:12:49

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 = http://www.php.net/opendir($dir);
  4. while (false !== ($fileName = http://www.php.net/readdir($dh))) {
  5. $ext = http://www.php.net/substr($fileName, http://www.php.net/strrpos($fileName, '.') + 1);
  6. if(http://www.php.net/in_array($ext, http://www.php.net/array("mp4")))
  7. $files1= $fileName;
  8.  
  9.  
  10. http://www.php.net/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 = http://www.php.net/dir('filmy');
  4. $ro = '.mp4';
  5. $tab = http://www.php.net/array();
  6. while((false!==($pl=$ca->read())))
  7. {
  8. if($pl!="."&&$pl!="..")
  9. {
  10. if(http://www.php.net/substr($pl,-http://www.php.net/strlen($ro))==$ro)
  11. {
  12. $tab[] = $pl;
  13. };
  14. };
  15. };
  16.  
  17. while(list(,$val) = http://www.php.net/each($tab))
  18. {
  19. http://www.php.net/echo 'adres/katalog/' . $val . '<br>';
  20. }
  21. ?>

Napisany przez: viking 1.09.2019, 12:42:03

  1. foreach (http://www.php.net/glob("filmy/*.mp4") as $filename) {
  2. http://www.php.net/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.

Napisany przez: Mis323 8.09.2019, 11:03:35

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 = http://www.php.net/substr($pl, 0, -4); // zwraca nazwe pliku bez rozszerzenia
  2.  
  3. foreach (http://www.php.net/glob("filmy/*.mp4") as $filename) {
  4. http://www.php.net/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.

Napisany przez: dublinka 8.09.2019, 12:30:43

patrz moj przyklad.

  1. $tab;


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

Napisany przez: viking 8.09.2019, 13:40:10

  1. $files = http://www.php.net/glob("filmy/*.mp4");
  2.  
  3. http://www.php.net/array_walk($files, function (&$item) {
  4. $item = http://www.php.net/pathinfo($item, PATHINFO_FILENAME);
  5. });
  6.  
  7. http://www.php.net/var_dump($files);


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

Napisany przez: Mis323 8.09.2019, 15:43:25

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 = http://www.php.net/glob("filmy/*.mp4");
  2.  
  3. http://www.php.net/array_walk($files, function (&$item) {
  4. $item = http://www.php.net/pathinfo($item, PATHINFO_FILENAME);
  5. });
  6.  
  7. http://www.php.net/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.

Napisany przez: dublinka 8.09.2019, 15:55:01

Cytat(Mis323 @ 8.09.2019, 15:43:25 ) *
Ale nie mogę użyć tablicy do zapytania sql



https://stackoverflow.com/questions/10054633/insert-array-into-mysql-database-with-php

Napisany przez: Mis323 8.09.2019, 16:39:17

Cytat(dublinka @ 8.09.2019, 16:55:01 ) *
https://stackoverflow.com/questions/10054633/insert-array-into-mysql-database-with-php


Można coś jaśniej napisać jak to zrobić z tego wątku który podałeś nie rozumiem.

Napisany przez: dublinka 8.09.2019, 17:51:57

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.

Napisany przez: Mis323 9.09.2019, 18:18:34

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. http://www.php.net/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.  

Napisany przez: dublinka 9.09.2019, 18:41:47

Jesli nie radzisz sobie z tym to moze to:

Zrobic to mozna przy pomocy pętli.

https://www.sitepoint.com/community/t/insert-array-into-database/1773

lub

https://stackoverflow.com/questions/54043173/insert-array-values-into-mysql-through-loop

Mam nadzieje ze teraz zrozumiesz wink.gif

Napisany przez: Mis323 9.09.2019, 22:54:08

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/insert-array-into-database/1773

lub

https://stackoverflow.com/questions/54043173/insert-array-values-into-mysql-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 = http://www.php.net/array();
  2.  
  3. foreach($tab as $team)
  4. $data[] = "" . http://www.php.net/addslashes($team) . "";
  5.  
  6. $data = http://www.php.net/implode("," , $data);
  7.  
  8.  
  9.  
  10.  
  11. for($test = 0; $test <= 7; $test++)
  12. {
  13. $conn = mysqli_connect('localhost', 'root', '', 'test') or http://www.php.net/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. }

Napisany przez: viking 10.09.2019, 05:13:57

A po co to addslashes robisz? W moim przykładzie na array_walk też możesz robić od razu insert.

Napisany przez: dublinka 10.09.2019, 07:44:14

  1. <?php
  2.  
  3. $tab = http://www.php.net/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 = http://www.php.net/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. http://www.php.net/echo http://www.php.net/substr($x, 0, -1);
  30. ?>

Napisany przez: Tomplus 10.09.2019, 09:16:33

czy zapytaniu ma być $rest czy $test?

Napisany przez: nospor 10.09.2019, 15:14:16

@dublinka jak rozumiem miales na mysli:

polaczenie do bazy ma byc jedno a nie w petli

Napisany przez: dublinka 10.09.2019, 15:29:29

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

Napisany przez: nospor 10.09.2019, 15:31:14

tylko po grzyba kasowac posta? Zawieral dobra rade tylko cie sie jezyk zaplatal...

Napisany przez: dublinka 11.09.2019, 12:12:43

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 = http://www.php.net/array();
  2.  
  3. foreach($tab as $team)
  4. $data[] = "" . http://www.php.net/addslashes($team) . "";
  5.  
  6. $data = http://www.php.net/implode("," , $data);
  7.  
  8.  
  9.  
  10.  
  11. for($test = 0; $test <= 7; $test++)
  12. {
  13. $conn = mysqli_connect('localhost', 'root', '', 'test') or http://www.php.net/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.




Napisany przez: Mis323 12.09.2019, 11:05:26

Uprościłem kod do minimum

  1. <?php
  2.  
  3. include ('db/connection.php');
  4.  
  5. $katalog = 'test';
  6. $ca = http://www.php.net/dir(''.$katalog.'/');
  7.  
  8. foreach (http://www.php.net/glob("$katalog/*.mp4") as $filename) {
  9. http://www.php.net/echo $filename;
  10. }
  11.  
  12.  
  13. while((false!==($plik=$ca->read())))
  14. {
  15. if (($plik != '.') AND ($plik != '..'))
  16. {
  17. $file = http://www.php.net/pathinfo ($plik);
  18. # echo $file['filename'] . '<br />';
  19.  
  20.  
  21. }
  22. }
  23.  
  24.  
  25. $data = http://www.php.net/array();
  26.  
  27. foreach($file as $team)
  28. $data[] = "" . http://www.php.net/addslashes($team) . "";
  29.  
  30. $data = http://www.php.net/implode("," , $data);
  31.  
  32. $data = http://www.php.net/array();
  33.  
  34. foreach($file as $team)
  35. $data[] = "" . http://www.php.net/addslashes($team) . "";
  36.  
  37. $data = http://www.php.net/implode("," , $data);
  38.  
  39. $conn = mysqli_connect('localhost', 'root', '', 'test') or http://www.php.net/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ć?

Napisany przez: viking 12.09.2019, 12:10:08

  1. $files = http://www.php.net/glob("$katalog/*.mp4");
  2.  
  3. http://www.php.net/array_walk($files, function ($item) {
  4. $id = http://www.php.net/pathinfo($item, PATHINFO_FILENAME);
  5. $query = http://www.php.net/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();

Napisany przez: Mis323 13.09.2019, 23:04:38

Cytat(viking @ 12.09.2019, 13:10:08 ) *
  1. $files = http://www.php.net/glob("$katalog/*.mp4");
  2.  
  3. http://www.php.net/array_walk($files, function ($item) {
  4. $id = http://www.php.net/pathinfo($item, PATHINFO_FILENAME);
  5. $query = http://www.php.net/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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)