Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP]obsluga formularza z tablica
eminiasty
post 30.09.2015, 22:26:16
Post #1





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


Mam taki formularz, pole czy jak to nazwac:

  1. <div class="col-xs-8">
  2. <label for="inputUsernameEmail">Zdjęcia</label>
  3. <span class="pull-right">W przypadku większej ilości zdjęć używaj klawiszy SHIFT lub zaznaczenia myszkowego.</span>
  4. <div class="input-group">
  5. <span class="input-group-btn">
  6. <span class="btn btn-black btn-file">
  7. Browse&hellip;
  8. <input type="file" name="file_news[]" multiple>
  9. <input name="max_file_size" type="hidden" value="1048576" />
  10. </span>
  11. </span>
  12. <input type="text" class="form-control" readonly>
  13. </div>
  14. </div>


Chce przesylac obrazki multiple(pojedynczo dziala!) no ok, czyli wydaje mi sie ze musze uzydc do tego tablicy, ok dopisuje [] do file_news i pieknie poki co..

Teraz trzeba to jakos obsluzyc:

  1. IF(isset($_POST['add']) && ($_POST['add'])==1) {
  2.  
  3. #filtriowanie
  4. $file_size = $_FILES['file_news']['size'];//pojemnosc pliku
  5. $file_brand = $_FILES['file_news']['type']; // typ pliku
  6. $file_name = $_FILES['file_news']['name']; // nazwa pliku
  7. $file_temp = $_FILES['file_news']['tmp_name']; // chwilowa nazwa pliku
  8.  
  9. $title = filtrujDane($_POST['title']);
  10. $active = filtrujDane($_POST['active']);
  11. $categories = filtrujDane($_POST['categories']);
  12. $date_end = filtrujDane($_POST['date_end']);
  13. $content = filtrujDane($_POST['content']);
  14. $tag = filtrujDane($_POST['tag']);
  15. #koniec filtrowania
  16.  
  17. #wycinamy rozszerzenie z pobieranego pliku
  18. $x = explode(".", $file_name);
  19. $roz= array_pop($x);
  20.  
  21. /* odbieramy dane z pola ukrytego i zaokrąglamy je do 3 miejsca po przecinku/dzielimy przez 1204*1024 by było w MB*/
  22. $max_size=round(($_POST['max_file_size']/1048576),3)."MB";
  23.  
  24. //zaokrąglamy "round" do 2 miejsc po przecinku i przeliczamy rozmiar pliku na MB
  25. $poj_MB=round(($file_size/1048576),2).'MB';
  26.  
  27. //kodujemy nasz plik metodą MD5 i dodajemy date i godziną oraz rozszerzenie pliku
  28. $file_name_add = $file_name.$s;
  29. $file_name_x=(md5((md5($file_name)).uniqid().uniqid())).".".$roz;
  30. $folder="upload/news/";
  31.  
  32. IF ($file_size <= 0){
  33. header("location: admin.php?s=news&a=view&k=blad1");
  34. }
  35.  
  36. IF ($poj_MB > $max_size){
  37. header("location: admin.php?s=news&a=view&k=blad2");
  38. }
  39.  
  40. IF (file_exists($folder.$file_name_x)){
  41. header("location: admin.php?s=news&a=view&k=blad3");
  42. }
  43.  
  44. IF ( $roz != 'jpg' && $roz != 'jpeg' && $roz != 'JPG' && $roz != 'JPEG' && $roz != 'gif' && $roz != 'GIF' && $roz != 'png' && $roz != 'PNG' ){
  45. header("location: admin.php?s=news&a=view&k=blad4");
  46. }
  47.  
  48. else {
  49.  
  50. IF(!@move_uploaded_file($file_temp, $folder.$file_name_x)){
  51. header("location: admin.php?s=news&a=view&k=blad5");
  52. }
  53. else{
  54.  
  55. $today = date('Y-m-d H:m:s');
  56. IF( $date_end < $today ){
  57. header("location: admin.php?s=news&a=view&k=errdate");
  58. }
  59. else{
  60.  
  61. $query1="
  62. INSERT INTO ".$prefix."news (`id`, `users_id`, `title`, `content`, `date_add`, `date_end`, `active`)
  63. VALUES('','".$user."','".$title."','".$content."', NOW(), '".$date_end."','".$active."')";
  64. #var_dump($query1);
  65. $result = mysqli_query($link,$query1) OR die(mysqli_error());
  66.  
  67. $news = mysqli_insert_id($link);
  68.  
  69. $query2="
  70. INSERT INTO ".$prefix."news_categories (`news_id`, `categories_id`)
  71. VALUES('".$news."','".$categories."')";
  72. $result = mysqli_query($link,$query2) OR die(mysqli_error());
  73.  
  74. $query5="
  75. INSERT INTO ".$prefix."images (`id`, `name`, `name_code`, `brand`, `size`, `type`, `active`)
  76. VALUES('','".$file_name."','".$file_name_x."','".$file_brand."','".$file_size."','news','1')";
  77. $result = mysqli_query($link,$query5) OR die(mysqli_error());
  78.  
  79. $imagesx = mysqli_insert_id($link);
  80.  
  81. $query6="
  82. INSERT INTO ".$prefix."news_images (`news_id`, `images_id`)
  83. VALUES('".$news."','".$imagesx."')";
  84. $result = mysqli_query($link,$query6) OR die(mysqli_error());
  85.  
  86.  
  87.  
  88.  
  89. $work = 0;
  90. $tag=explode(',', $tag);
  91. $tag=array_map('trim', $tag);
  92. $tag=array_unique($tag);
  93. foreach($tag AS $i => $k){
  94. $tag[$work] =$k;
  95. $work=$work+1;
  96. }
  97.  
  98.  
  99.  
  100. FOR($i=0;$i<$work;$i++){
  101. $query3="
  102. INSERT INTO ".$prefix."tags (`id`, `name`, `type`)
  103. VALUES('','".$tag[$i]."','news')";
  104. $result = mysqli_query($link,$query3) OR die(mysqli_error());
  105.  
  106. $tagx = mysqli_insert_id($link);
  107.  
  108. $query4="
  109. INSERT INTO ".$prefix."news_tags (`news_id`, `tags_id`)
  110. VALUES('".$news."','".$tagx."')";
  111. $result = mysqli_query($link,$query4) OR die(mysqli_error());
  112. }
  113.  
  114. header("location: admin.php?s=news&a=wys&k=nowe");
  115. }
  116.  
  117. }
  118. }
  119. }



TO jest moj kod oblugi formularza... tak wiem zabijecie mnie dlugi i nie chcialo by sie analizowac ale prosze jednak o pomoc.

O co chodzi tak naprawde? Mam tabele news_images w bazie dodajac kilka obrazkow chce zeby zapisywaly sie tam na zasadzie id|id czyli do jednego newsa mozna doadac milion obrazkow(teoretycznie)

ale tu sa bledy po rozpoczaciu zmian,czyli przerobieniu na tablice w formularzu:
  1. Warning: explode() expects parameter 2 to be string, array given in C:\xamp\htdocs\foodbook\inc\admin\news.php on line 80
  2.  
  3. Warning: array_pop() expects parameter 1 to be array, null given in C:\xamp\htdocs\foodbook\inc\admin\news.php on line 81
  4.  
  5. Fatal error: Unsupported operand types in C:\xamp\htdocs\foodbook\inc\admin\news.php on line 87


Nie zabardzo wiem jak sie ich pozbyc, probowalem zmienne przerabiac na tablice dopisujac [] ale to tylko pogarsza sprawe.
Go to the top of the page
+Quote Post
Tomplus
post 30.09.2015, 23:06:59
Post #2





Grupa: Zarejestrowani
Postów: 1 844
Pomógł: 227
Dołączył: 20.03.2005
Skąd: Będzin

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


Dlaczego jak dodajesz tablicę, to nie robisz tego w kodzie PHP?

masz: $_FILES['file_news']['size']

a powinno być (przykład)

  1. $file_size = $_FILES['file_news']['size'][0]; // brakuje u Ciebie pętli do obsługi tablicy wielowymiarowej _FILES, teraz przypisze do zmiennej tylko pierwszy obrazek.



Przez to masz błąd w funkcji explode() w 2 parametrze, bo nie przesyłasz string, tylko tablicę.

Z Array_POP jest to samo.

W sumie wszystko ci pisze w błędach. Jak coś sprawdzaj sobie funkcją var_dump co dodajesz do danej funkcji, a jaki tym zmiennej powinna być dodana.

Ten post edytował Tomplus 30.09.2015, 23:10:11
Go to the top of the page
+Quote Post
eminiasty
post 1.10.2015, 00:29:59
Post #3





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


Cytat(Tomplus @ 1.10.2015, 00:06:59 ) *
  1. $file_size = $_FILES['file_news']['size'][0];

czyli powinno byc np.

  1. $file_size = $_FILES['file_news']['size'][size];


czyli to co w wiersza to i w kolumnach?
Go to the top of the page
+Quote Post
mar1aczi
post 1.10.2015, 08:28:34
Post #4





Grupa: Zarejestrowani
Postów: 731
Pomógł: 141
Dołączył: 9.05.2011
Skąd: śląskie

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


Tomplus już Ci podpowiadał jak sprawdzić co masz dokładnie w zmiennej.
Wstaw między linie 2 a 3 kodu, który pokazałeś
Kod
var_dump($_FILES);

i zobaczysz jak wygląda zawartość tej zmiennej.

Ma być dokładnie jak napisał Tomplus
Cytat(Tomplus)
  1. $file_size = $_FILES['file_news']['size'][0];

Indeks "[0]" będzie się zmieniał w zależności od ilości plików jakie prześlesz.

Ten post edytował mar1aczi 1.10.2015, 08:30:28


--------------------
Szanuj innych czas! Kliknij , gdy pomocną wskazówkę otrzymasz.
Go to the top of the page
+Quote Post
eminiasty
post 1.10.2015, 09:24:17
Post #5





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


  1. $len = count($_FILES['file_news']['name']);
  2.  
  3. for($i = 0; $i < $len; $i++) {
  4. $file_size = $_FILES['file_news']['size'][$i];//pojemnosc pliku
  5. $file_brand = $_FILES['file_news']['type'][$i]; // typ pliku
  6. $file_name = $_FILES['file_news']['name'][$i]; // nazwa pliku
  7. $file_temp = $_FILES['file_news']['tmp_name'][$i]; // chwilowa nazwa pliku
  8. }


mam taka petle ale jakos nie bardzo ona dziala, cos w niej nie tak? zawsze i tak dodaje sie pierwszy plik chodz w zmiennej _FILES jest nascie plikow
Go to the top of the page
+Quote Post
com
post 1.10.2015, 09:29:41
Post #6





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


a nie czasem ostatni? bo w pętli musisz mieć też dodawanie, a tak on wykona pętle i dodaje ost jej wynik wink.gif
Go to the top of the page
+Quote Post
com
post 1.10.2015, 09:47:49
Post #7





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


bo nie mogą, musi to być w jednej pętli, bo to nie to samo, zrób var_dump na te zawartość $roz i $x smile.gif
Go to the top of the page
+Quote Post
viking
post 1.10.2015, 10:12:46
Post #8





Grupa: Zarejestrowani
Postów: 6 366
Pomógł: 1115
Dołączył: 30.08.2006

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


I rzuciło mi się w oczy że sprawdzasz pliki po rozszerzeniu. Nie jest to bezpieczne. Sprawdzaj typ mime.


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 1.10.2015, 10:33:38
Post #9





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


tylko mime pliku chyba sie zmienia gdzies tak czytalem ?

Chodzi ci o cos takiego?

  1. if ( $file_brand != 'image/jpeg' && $file_brand != 'image/png' && $file_brand != 'image/gif' && $file_brand != 'image/bmp'){ header("location: admin.php?s=news&a=view&k=blad4"); }


takie cos pdf puscilo oO

Ten post edytował eminiasty 1.10.2015, 10:26:08
Go to the top of the page
+Quote Post
com
post 1.10.2015, 11:00:16
Post #10





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


a zrobiłeś na tym var_dump? rozszerzenia tym bardziej można zmienić smile.gif
Go to the top of the page
+Quote Post
mar1aczi
post 1.10.2015, 11:21:59
Post #11





Grupa: Zarejestrowani
Postów: 731
Pomógł: 141
Dołączył: 9.05.2011
Skąd: śląskie

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


Cytat(eminiasty @ 1.10.2015, 11:33:38 ) *
  1. if ( $file_brand != 'image/jpeg' && $file_brand != 'image/png' && $file_brand != 'image/gif' && $file_brand != 'image/bmp'){ header("location: admin.php?s=news&a=view&k=blad4"); }

takie cos pdf puscilo oO

Bo pdf po mime zapewne spełnił powyzszy warunek.
"!=" oznacza różne, a "&&" spójnik 'i' - w dużym uproszczeniu. Poczytaj o operatorach w php.
Wg. Twojego ifa $file_brand dla pdf'a był rożny dla wszystkich wykazanych typów.


--------------------
Szanuj innych czas! Kliknij , gdy pomocną wskazówkę otrzymasz.
Go to the top of the page
+Quote Post
Tomplus
post 1.10.2015, 12:35:38
Post #12





Grupa: Zarejestrowani
Postów: 1 844
Pomógł: 227
Dołączył: 20.03.2005
Skąd: Będzin

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


Sprawdzaj warunki, najlepiej notując sobie ołówkiem w zeszycie czy to co wrzucasz jest logiczne lub nie.

np.
brand = 'pdf';

(pdf != jpg) ^ (pdf != png) ^ (pdf != gif) ^ (pdf != bmp) => T ^ T ^ T ^ T [ bo 1*1*1*1 = 1 ]=> TRUE

brand = 'jpg';
(jpg != jpg) ^ (jpg != png) ^ (jpg != gif) ^ (jpg != bmp) => F ^ T ^ T ^ T [ bo 0*1*1*1 = 0 ]=> FALSE


A co do puszczenia PDF, to sprawdź jaki faktyczną wartość masz MIME Type. Jak nie chcesz var_dumpować wartości, to wrzuć sobie testowo do URL np. "&brand={$file_brand}"
Go to the top of the page
+Quote Post
eminiasty
post 1.10.2015, 20:38:19
Post #13





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


problem byl tego typu ze pdf przechodzil gdy na multiple byl obrazek +pdf , sam pdf nie przechodzi wiec teoretycznie ok

  1. $categories = null;
  2. $work = 0;
  3. foreach($_POST['categories'] as $kat){
  4. #filtriowanie
  5. $kat=filtrujDane($kat);
  6. #koniec filtrowania
  7. $categories[] .=$kat;
  8. $work=$work+1;
  9. }


Chce do jednego ogloszenia moc dodawac x kategorii.
mam cos takiego, wszystko dziala, ale zakomentowalem headera przekierowujacego i ..

  1. Notice: Undefined index: categories in


wywala mi notice, czy musze deklarowac jakos posta jesli przechodzi on przez petle i pochodzi z POSTA? jesli tak w jaki sposob to zrobic na moim przykladzie? moze ten blad jest ze wzgledu na wersje php, uzywam xampa wiec chyba aktualna

czy da sie tego foreach zamienic na for'a? z takim wykorzystaniem?
Go to the top of the page
+Quote Post
Tomplus
post 1.10.2015, 20:49:16
Post #14





Grupa: Zarejestrowani
Postów: 1 844
Pomógł: 227
Dołączył: 20.03.2005
Skąd: Będzin

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


Notice to tylko uwaga, a nie błąd.

Ale zadeklaruj $categories jako tablicę a nie wartość null.

$categories = array();
Go to the top of the page
+Quote Post
Pyton_000
post 1.10.2015, 20:51:26
Post #15





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

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


Cytat(Tomplus @ 1.10.2015, 21:49:16 ) *
Notice to tylko uwaga, a nie błąd.


Notice to też błąd weźcie się ludzie nauczcie tego w końcu. Równie dobrze jak Ci się w Aucie zapali Pomarańczowe Check Engine to też stwierdzisz że to tylko uwaga? Przecież auto jeździ...
Go to the top of the page
+Quote Post
eminiasty
post 1.10.2015, 21:02:20
Post #16





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


no ok.. zadeklarowalem jako array

  1. $categories = array();
  2. $work = 0;
  3. foreach($_POST['categories'] as $kat){
  4. #filtriowanie
  5. $kat=filtrujDane($_POST['categories']);
  6. #koniec filtrowania
  7. $categories[] .=$kat;
  8. $work=$work+1;
  9. }


blad w lini:

  1. $kat=filtrujDane($_POST['categories']);



  1. Warning: trim() expects parameter 1 TO be string, array given IN
  2.  
  3. Warning: trim() expects parameter 1 TO be string, array given IN
  4. string(0) ""
  5. Warning: mysqli_error() expects exactly 1 parameter, 0 given IN



Teraz tak funkcja z tej linijki ma sie tak:

  1. function filtrujDane($zmienna){
  2. $zmienna = mysql_real_escape_string(trim($zmienna));
  3. return $zmienna;
  4. }


ale ale:

  1. $kat=$_POST['categories'];


wyrzucajac funkcje i zostawiajac tylko przypisanie jest komunikatowa magia : ( na poziomie wyzej rozumiem ze blad z trimiem nie powinno sie go uzyc czy cos w ten desen)

  1. Notice: Array TO string conversion IN
  2.  
  3. Notice: Array TO string conversion IN
  4. string(5) "Array"
  5. Warning: mysqli_error() expects exactly 1 parameter, 0 given IN


Zapewne chodzi o konwersje do typu tekstowego ale czy ta tablica nie jest "JUZ" jako typ tekstowy? to po co i ew jak to przekonwertowac?

Czy nie musze filtorwac zmiennej _POST[castegories] w moze abstrakcyjny sposob ktory wymyslem?


Go to the top of the page
+Quote Post
Tomplus
post 1.10.2015, 21:18:24
Post #17





Grupa: Zarejestrowani
Postów: 1 844
Pomógł: 227
Dołączył: 20.03.2005
Skąd: Będzin

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


Cytat(Pyton_000 @ 1.10.2015, 21:51:26 ) *
Notice to też błąd weźcie się ludzie nauczcie tego w końcu. Równie dobrze jak Ci się w Aucie zapali Pomarańczowe Check Engine to też stwierdzisz że to tylko uwaga? Przecież auto jeździ...


Ja uważam że to ostrzeżenie. I tak jak kontrolka w samochodzie ostrzega, aby uniknąć błędu.

@eminiasty
Musisz kontrolować jakie typy zmiennych używasz, możesz sobie sprawdzać typ np.:

W twoim wypadku wysyłasz do funkcji filtrujDane() całą tablicę zamiast jego elementu czyli $_POST['categories'][$kat]

Zawsze możesz sprawdzić czym jest zmienna warunkami np:
  1. if (is_string($var)) echo "Tekst";
  2. if (is_array($var)) echo "Tablica";
  3. if (is_object($var)) echo "Objekt";
  4. if (is_integer($var)) echo "Liczba";
  5. if (isset($var)) echo "typ logiczny";


Zwracają ci true lub false, a takich zapytań jest więcej, is_scalar, is_bool, is_...


Ten post edytował Tomplus 1.10.2015, 21:27:05
Go to the top of the page
+Quote Post
eminiasty
post 1.10.2015, 21:34:38
Post #18





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


  1. if(!empty($_POST['categories'])) {
  2. $categories = array();
  3. $work = 0;
  4. foreach($_POST['categories'] as $kat){
  5. $kat = filtrujDane($_POST['categories'][$kat]);
  6. $categories[] .=$kat;
  7. $work=$work+1;
  8. var_dump($_POST['categories'][$kat]) ;
  9. }


1. czy jest dobry warunek skoro w name formularza jest categories[] ?
2.
  1. Notice: Undefined offset: 3

Nie mam pojecia co to pierwszy raz widze blad z jakims ofsetem
3. to:
  1. var_dump($_POST['categories'][$kat]) ;

zwraca NULL?
zas :
  1. var_dump($_POST['categories'][$work]) ;

bo wydaje mi sie ze tak powinno byc( w sensie zamiast kat -> work
6(id) null
drugi parametr zawsze wychodzi na null..?
Go to the top of the page
+Quote Post
Tomplus
post 1.10.2015, 21:46:27
Post #19





Grupa: Zarejestrowani
Postów: 1 844
Pomógł: 227
Dołączył: 20.03.2005
Skąd: Będzin

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


Mój błąd, zapomniałem się, już późno jest.

stosujesz $kat jako wynik tablicy, a celem jest aby pobrać klucz tablicy, zmień sobie pętle na

  1. foreach($_POST['categories'] as $key => $kat){
  2. // a potem wartość $kat na $key
  3. $kat = filtrujDane($_POST['categories'][$key]);
  4.  


a najlepiej na:


  1. foreach($_POST['categories'] as $key => $kat) {
  2. $categories[$key] = filtrujDane($_POST['categories'][$key]);
  3. } // takie proste a da to samo co chcesz, poniżej sprawdzenie tablic Input -> Output
  4. var_dump($_POST['categories']) ;
  5. var_dump($categories) ;
  6.  




Ten post edytował Tomplus 1.10.2015, 21:50:23
Go to the top of the page
+Quote Post
eminiasty
post 1.10.2015, 22:07:10
Post #20





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


Pytalem o tego ifa?
  1. if(!empty($_POST['categories'])) {



  1. var_dump("<br>".$categories);

Notice: Undefined variable: categories in

  1. var_dump("<br>".$_POST['categories']);

Notice: Array to string conversion in

chce sprawdzic /pobrac wartosc tego name, a warunek z mojego ifa sie nie sprawdza kiedy w name jest tablica? if musi byc w petli z iteracja?

  1. <select name="categories[]" multiple="multiple" >
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Wersja Lo-Fi Aktualny czas: 8.06.2024 - 17:38