Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Zapis właściwości checkbox do bazy danych
Kerth
post 17.07.2016, 22:17:44
Post #1





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


Witam,
mam pewien problem. Z bazy danych pobieram zdjęcia, które tworzą pewnego rodzaju galerię(a raczej nazwy zdjęć), które później są odpowiednio wyświetlane. Obok każdego zdjęcia mam pole typu checkbox. Do każdego artykułu można będzie dodać dajmy na to 12 zdjęć. I tu pojawia się pytanie. W jaki sposób najlepiej zapisać wartość tych zdjęć do bazy danych? Z ustawieniem parametry value nie ma problemu, bo pobieram to z bazy danych i potem tylko wstawiam. Zastanawia mnie kwestia, czy do tabeli z artykułami(`article`) wstawić kolumny typu `image1`, image2`, image3` itd, czy może skorzystać z pól typu ENUM/SET?

Tak to wygląda, zdjęcia po kopiowane więc nazwy są takie same - bez znaczenia:
{{Image:edit.png}}

I teraz jak zaznaczę 2 zdjęcia to do bazy zapiszą się 2, jak 5 to 5, etc. Ma ktoś jakiś pomysł jak to rozwiązać? Czekam na kreatywne pomysły.
Pozdrawiam smile.gif

Zdecydowałem się na tą drugą opcję. W ten sposób tworzę checkbox dla każdego zdjęcia:
  1. <input type="checkbox" value="'.$getImage['name'].'" name="'.$getImage['name'].'" style="vertical-align: middle;"/>

Przypisuje mu dla atrybutu value indywidualną wartość, która ma zostać zapisana w bazie danych. Problem jest z atrybutem name. Jak go dynamicznie utworzyć?

---Edit:
W ten sposób przypisuję zmienną $_POST do metod setImage1 oraz setImage2

  1. if($rowAllImage){
  2. foreach($rowAllImage as $getImage){
  3. $news->setImage1($_POST[''.$getImage['name'].'']);
  4. $news->setImage2($_POST[''.$getImage['name'].'']);
  5. }
  6. }



Co skutkuje wyświetleniem notatek typu: Undefined variables...

Pytane brzmi, jak zapisać do bazy TYLKO TE POLA co są zaznaczone?
Go to the top of the page
+Quote Post
nospor
post 18.07.2016, 08:53:27
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Name ma miec stala nazwe tablicowa, np: images[]

<input type="checkbox" value="'.$getImage['name'].'" name="images[]" style="vertical-align: middle;"/>

A postem poleca tylko te checkboxy, ktore zostaly zaznaczone:

print_r($_POST['images']);

I wszystko jasne


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kerth
post 18.07.2016, 11:26:14
Post #3





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


Ok, niby "przesyła" zawartość zaznaczonych opcji tablicą POST, lecz pojawia się ostrzeżenie:

  1. Array ( [0] => photo3.jpg [1] => photo4.jpg )
  2. Warning: trim() expects parameter 1 to be string, array given in C:\xampp\htdocs\img\news\model\news.class.php on line 19
  3.  
  4. Warning: trim() expects parameter 1 to be string, array given in C:\xampp\htdocs\img\news\model\news.class.php on line 20


To są te 2 linijki:
public function doFilter(){
$this->subject = trim($this->subject);
$this->content = trim($this->content);
$this->status = trim($this->status);
$this->headImage = trim($this->headImage);
$this->image1 = trim($this->image1);
$this->image2 = trim($this->image2);

return $this;
}

Metody image1, image2:

  1. public function setImage1($image1){
  2. $this->image1 = $image1;
  3. return $this;
  4. }
  5. public function setImage2($image2){
  6. $this->image2 = $image2;
  7. return $this;
  8. }


Dlaczego tak się dzieje?
Go to the top of the page
+Quote Post
nospor
post 18.07.2016, 11:32:11
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No ale pokaz kod po zmianach jak teraz ustawiasz to setImage


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kerth
post 18.07.2016, 11:43:21
Post #5





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


No w ten sposób:

  1. $news->setImage1($_POST['images']);
  2. $news->setImage2($_POST['images']);
  3. print_r($_POST['images']);


a W klasie binduję:

  1. $img->bindValue(":image1", $this->image1, PDO::PARAM_STR);
  2. $img->bindValue(":image2", $this->image2, PDO::PARAM_STR);
Go to the top of the page
+Quote Post
nospor
post 18.07.2016, 11:44:20
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No to ci pokazalem i napisalem ze $_POST['images'] to tablica wiec czemu przypisujesz tablice jako nazwe image? Jako nazwe image masz przypisac element tej tablicy a nie tablice.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kerth
post 18.07.2016, 13:19:56
Post #7





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


A w jaki sposób mam przpypisać element z tablicy images[]?
Ja to rozumiem, tak, że jeśli tablica
  1. $_POST['images']
zwraca mi nazwy zaznaczonych checkboxów, to też chciałbym tą zawartość tablicy zapisać do bazy danych. Jak się dowiedzieć o, który konkretny element może chodzić?

Dzięki nospor. Teraz mi trybiki zaskoczyły biggrin.gif

Rozwiązanie:
  1. $news->setImage1($_POST['images'][0]);
  2. $news->setImage2($_POST['images'][1]);


Dzięki za podpowiedzi.

Link, który mi pomógł(dla potomności): http://phpedia.pl/wiki/Jak_uzyska%C4%87_do..._formularzem%3F

A jeszcze jedno pytanie, jak pozbyć się tych notatek:

  1. Notice: Undefined offset: 2 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 26
  2.  
  3. Notice: Undefined offset: 3 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 27
  4.  
  5. Notice: Undefined offset: 4 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 28
  6.  
  7. Notice: Undefined offset: 5 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 29
  8.  
  9. Notice: Undefined offset: 6 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 30
  10.  
  11. Notice: Undefined offset: 7 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 31
  12.  
  13. Notice: Undefined offset: 8 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 32
  14.  
  15. Notice: Undefined offset: 9 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 33
  16.  
  17. Notice: Undefined offset: 10 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 34
  18.  
  19. Notice: Undefined offset: 11 in C:\xampp\htdocs\img\Img\controller\edit\addEditImg.php on line 35



  1. Array ( [0] => photo7.jpg [1] => photo8.jpg )


Dzieje się tak wtedy gdy zaznaczę np. 2 zdjęcia z możliwych 12. I każdy numer w notatce odnosi się do elementu tablicy.Jeśli zaznaczę wszystkie możliwe 12 to notatek nie ma.

Mniemam, że trzeba wykorzystać jakiś warunek, żeby przesyłało tylko te, które mają checked na true:

  1. $news->setImage1($_POST['images'][0]);
  2. $news->setImage2($_POST['images'][1]);
  3. $news->setImage3($_POST['images'][2]);
  4. $news->setImage4($_POST['images'][3]);
  5. $news->setImage5($_POST['images'][4]);
  6. $news->setImage6($_POST['images'][5]);
  7. $news->setImage7($_POST['images'][6]);
  8. $news->setImage8($_POST['images'][7]);
  9. $news->setImage9($_POST['images'][8]);
  10. $news->setImage10($_POST['images'][9]);
  11. $news->setImage11($_POST['images'][10]);
  12. $news->setImage12($_POST['images'][11]);


Tylko jak takie coś zrobić?
Go to the top of the page
+Quote Post
Fred1485
post 18.07.2016, 13:46:10
Post #8





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


W pętli spróbuj wink.gif

  1.  
  2. foreach ($_POST['images'] as $image) {
  3. //dodaj
  4. }


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
Kerth
post 18.07.2016, 19:16:46
Post #9





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


Jak taka pętla powinna wyglądać poprawnie?

Próbuję w ten sposób, jednakże żadne obrazki nie są dodawane do bazy danych.
  1. foreach($_POST['images'] as $j){
  2. $img->setImage1($_POST['images'][$j]);
  3. $img->setImage2($_POST['images'][$j]);
  4. $img->setImage3($_POST['images'][$j]);
  5. $img->setImage4($_POST['images'][$j]);
  6. $img->setImage5($_POST['images'][$j]);
  7. $img->setImage6($_POST['images'][$j]);
  8. $img->setImage7($_POST['images'][$j]);
  9. $img->setImage8($_POST['images'][$j]);
  10. $img->setImage9($_POST['images'][$j]);
  11. $img->setImage10($_POST['images'][$j]);
  12. $img->setImage11($_POST['images'][$j]);
  13. $img->setImage12($_POST['images'][$j]);
  14. }
Go to the top of the page
+Quote Post
Fred1485
post 18.07.2016, 20:01:18
Post #10





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


Nie wiem po co ci do każdego image osobny setter wink.gif
Przykładowa implementacja. Oczywiście ty masz swoją klasę Images, ja użyłem tylko dla testów.

  1. class Images
  2. {
  3. private $image1;
  4. private $image2;
  5. private $image3;
  6. private $image4;
  7. private $image5;
  8. private $image6;
  9. private $image7;
  10. private $image8;
  11. private $image9;
  12. private $image10;
  13. private $image11;
  14. private $image12;
  15.  
  16.  
  17. public function setImage1($image1)
  18. {
  19. $this->image1 = $image1;
  20. }
  21.  
  22. public function setImage2($image2)
  23. {
  24. $this->image2 = $image2;
  25. }
  26.  
  27. public function setImage3($image3)
  28. {
  29. $this->image3 = $image3;
  30. }
  31.  
  32. public function setImage4($image4)
  33. {
  34. $this->image4 = $image4;
  35. }
  36.  
  37. public function setImage5($image5)
  38. {
  39. $this->image5 = $image5;
  40. }
  41.  
  42. public function setImage6($image6)
  43. {
  44. $this->image6 = $image6;
  45. }
  46.  
  47. public function setImage7($image7)
  48. {
  49. $this->image7 = $image7;
  50. }
  51.  
  52. public function setImage8($image8)
  53. {
  54. $this->image8 = $image8;
  55. }
  56.  
  57. public function setImage9($image9)
  58. {
  59. $this->image9 = $image9;
  60. }
  61.  
  62. public function setImage10($image10)
  63. {
  64. $this->image10 = $image10;
  65. }
  66.  
  67. public function setImage11($image11)
  68. {
  69. $this->image11 = $image11;
  70. }
  71.  
  72. public function setImage12($image12)
  73. {
  74. $this->image12 = $image12;
  75. }
  76.  
  77. public function getImages()
  78. {
  79. $response =[];
  80. for ($i = 1; $i <= 12; $i++) {
  81. if ($this->{'image'.$i} !== null) {
  82. $response[] = $this->{'image'.$i};
  83. }
  84. }
  85. return $response;
  86. }
  87. }
  88.  
  89. $_POST['images'] = [
  90. 0 => 'image1',
  91. 4 => 'image5',
  92. 5 => 'image6',
  93. 8 => 'image9',
  94. 11 => 'image12',
  95. ];
  96.  
  97. $images = new Images();
  98.  
  99. foreach ($_POST['images'] as $index => $image) {
  100. $images->{'setImage'.++$index}($image);
  101. }
  102.  
  103. echo '<pre>';
  104.  
  105. print_r($images->getImages());


Ten post edytował Fred1485 18.07.2016, 20:01:33


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
Kerth
post 18.07.2016, 20:53:59
Post #11





Grupa: Zarejestrowani
Postów: 250
Pomógł: 1
Dołączył: 6.08.2012

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


Kod bardzo podobny do mojego. Po podstawieniu metody od Ciebie pojawia się Fatal error:

  1. Fatal error: Uncaught Error: Call to a member function getImages() on string in
  2. C:\xampp\htdocs\img\controller\edit\addEditImg.php:21 Stack trace: #0
  3. C:\xampp\htdocs\img\view\edit_Img.php(30): require_once() #1 {main} thrown in
  4. C:\xampp\htdocs\img\controller\edit\addEditImg.php on line 21


Odnosi się to właśnie do tej metody. Wiesz co zrobić?
Go to the top of the page
+Quote Post
Fred1485
post 19.07.2016, 08:39:39
Post #12





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


Wklej cały kod na http://pastebin.com/ jak możesz i daj linka.


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post

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: 31.07.2025 - 08:43