Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][HTML] Błąd przy przesyłaniu danych z formularza
melior
post 26.02.2010, 07:48:44
Post #1





Grupa: Zarejestrowani
Postów: 68
Pomógł: 3
Dołączył: 7.12.2009

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


Witam,
Mam problem nad którym siedzę już n-tą godzinę i nadal nie mogę rozgryźć.

Kod nad jakim pracuje jest częścią sklepu internetowego, problem leży w koszyku.

Tutaj jest fragment formularza (koszyk.php), którego używam do zmiany ilości zamówień przy danym produkcie.

  1. <form action="koszyk.php" method="post">
  2. <input type="text" style="width:40; text-align:center; "value="<? echo $_SESSION['koszyk'][$x]?>" name="<? echo $x ?>">
  3. <input type="hidden" name="zapisz" value="1">
  4. <input type="submit" value="Przelicz">


A tu fragment odpowiadający za zmianę tej wartości.

  1. if(isset($_POST['zapisz'])) {
  2. foreach ($_SESSION['koszyk'] as $typ_produkt => $ilosc) {
  3. if($_POST[$typ_produkt]=='0')
  4. unset($_SESSION['koszyk'][$typ_produkt]);
  5. else
  6. $_SESSION['koszyk'][$typ_produkt] = $_POST[$typ_produkt];
  7. }
  8. }


Pod zmienną "x" i zmienną typ_produkt kryje się produkt zapisywany w postaci np. 55-S-Red, tj. ID-rozmiar-kolor.

Problem:
Przy kolorze składającym się z dwóch części oddzielonych spacją, np. Soft Peach, kiedy próbuję zmienić ilość to zamiast zmiany wartość znika i mam pustego inputa.
Myślałem na początku, iż post źle coś wysyłał (np. samo "Soft", co powodowałoby że miałbym produkt 55-S-Soft, zamiast 55-S-Soft Peach i było by wszystko jasne), jednak chyba tak nie jest. Próbowałem przepuszczać "name" inputa przez specjalną funkcję, która miała zamieniać spacje na specjalny kod, lub po prostu bawiłem się ze znakami ' i ". Nie działało.

Zresztą zaraz potem wykonywał się kod
  1. if(isset($_SESSION['koszyk'])&&array_count_values($_SESSION['koszyk']))

i array_count_values wywalał mi błąd, iż musi dostać STRINGA, lub INTEGERA

Nie mam pojęcia co jest nie tak.
Może ktoś rzucić na to okiem?
Go to the top of the page
+Quote Post
mortus
post 26.02.2010, 08:36:14
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Wrzuć kod:
  1. echo '<pre>'; print_r($_POST); echo '</pre>';
  2. echo '<pre>'; print_r($_SESSION['koszyk']); echo '</pre>';

przed formularzem i przed kodem odpowiedzialnym za zmiany (tym co w Twoim poście). Wtedy zobaczysz, co kryją zmienne $_POST i $_SESSION['koszyk']. Możesz wyniki zapodać tutaj.
Go to the top of the page
+Quote Post
R4D3K
post 26.02.2010, 08:49:01
Post #3





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

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


Sprawdz co kryje w sobie $x, bo może być pusta (nigdzie nie wiedzę deklaracji).
Go to the top of the page
+Quote Post
melior
post 26.02.2010, 09:25:49
Post #4





Grupa: Zarejestrowani
Postów: 68
Pomógł: 3
Dołączył: 7.12.2009

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


Przed zmianą:

Array
(
[58-M-Soft_Peach] => 2
[zapisz] => 1
[dostawa] => koszyk.php?o=1
)

Array
(
[58-M-Soft Peach] => 1
)

Po zmianie:

Array
(
[58-S-Soft_Peach] => 3
[zapisz] => 1
[dostawa] => koszyk.php?o=1
)

Array
(
[58-S-Soft Peach] =>
)


Już widać o co chodzi. Przy wysyłaniu POSTem spacja zmienia się na znak "_" (przynajmniej tak sądzę). Dlaczego tak się dzieje? Można temu jakoś zapobiec?

Ten post edytował melior 26.02.2010, 09:26:41
Go to the top of the page
+Quote Post
mortus
post 26.02.2010, 09:43:01
Post #5





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Przy wysyłaniu postem spacja pozostaje spacją! Problem leży gdzieś indziej.
EDIT:
Wrzuć cały kod koszyk.php!

Ten post edytował mortus 26.02.2010, 10:04:57
Go to the top of the page
+Quote Post
marins
post 26.02.2010, 10:05:26
Post #6





Grupa: Zarejestrowani
Postów: 47
Pomógł: 4
Dołączył: 12.07.2003

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


klucz w tablicy nie może zawierać spacji.
Go to the top of the page
+Quote Post
mortus
post 26.02.2010, 10:12:11
Post #7





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Kod
Array
(
[58-S-Soft Peach] =>
)

Jak nie może, skoro widzisz, że zawiera! Przecież 58-S-Soft Peach to klucz (index w tablicy)!
Go to the top of the page
+Quote Post
marins
post 26.02.2010, 10:30:34
Post #8





Grupa: Zarejestrowani
Postów: 47
Pomógł: 4
Dołączył: 12.07.2003

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


zamień spacje na podkreślenie.
Do indexa w array możesz nawet sobie polskie znaki wstawić - bo teoretycznie można, tak samo ze spacjami. Ale jest to duże ryzyko i nie praktykuje się takich znaków w indexie tablicy.

Nie krzycz.
Go to the top of the page
+Quote Post
melior
post 26.02.2010, 10:40:15
Post #9





Grupa: Zarejestrowani
Postów: 68
Pomógł: 3
Dołączył: 7.12.2009

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


Kod zminimalizowałem o elementy htmlowe, które wpływają na wygląd, a nie na funkcjonowanie fragmentu, który nas interesuje.
  1. <? session_start(); ?>
  2. <html>
  3. <body>
  4. <?
  5.  
  6. require("funkcje.php");
  7. polacz();
  8.  
  9. $produkt = $_POST['id'];
  10. $rozmiar = $_POST['size'];
  11. $kolor = $_POST['color'];
  12. $prod_ilosc = $_POST['ilosc'];
  13. $typ_produkt = $produkt.'-'.$rozmiar.'-'.$kolor;
  14.  
  15. if ($_GET['id']){
  16.  
  17. $del_id = $_GET['id'];
  18. unset($_SESSION['koszyk'][$del_id]);
  19. }
  20.  
  21.  
  22. if ($produkt){
  23. if (!isset($_SESSION['koszyk'])) {
  24. $_SESSION['koszyk'] = array();
  25. $_SESSION['calkowita_wartosc'] ='0.00';
  26. }
  27.  
  28. if(isset($_SESSION['koszyk'][$typ_produkt])) {
  29. $_SESSION['koszyk'][$typ_produkt]++;
  30. }
  31. else {
  32. $_SESSION['koszyk'][$typ_produkt] = 1;
  33. }
  34. }
  35.  
  36. if(isset($_POST['zapisz'])) {
  37. echo '<pre>'; print_r($_POST); echo '</pre>';
  38. echo '<pre>'; print_r($_SESSION['koszyk']); echo '</pre>';
  39. foreach ($_SESSION['koszyk'] as $typ_produkt => $ilosc) {
  40. if($_POST[$typ_produkt]=='0')
  41. unset($_SESSION['koszyk'][$typ_produkt]);
  42. else
  43. $_SESSION['koszyk'][$typ_produkt] = $_POST[$typ_produkt];
  44. }
  45. }
  46.  
  47.  
  48. if(isset($_SESSION['koszyk'])&&(sizeof($_SESSION['koszyk']))>0) {
  49.  
  50. $tab_koszyk = $_SESSION['koszyk'];
  51. $cena = 0;
  52.  
  53. foreach($tab_koszyk AS $x => $ilosc){
  54. $y=explode("-", $x);
  55. $id = $y[0];
  56.  
  57. $result = mysql_query("SELECT * FROM products WHERE id = $id");
  58. $row = mysql_fetch_array($result);
  59. $cena = $cena + ($row['price'] * $ilosc);
  60.  
  61. }
  62. $_SESSION['calkowita_wartosc'] = $cena ;
  63.  
  64.  
  65. ?>
  66.  
  67. <form action="koszyk.php" method="post">
  68. <?
  69. foreach ($_SESSION['koszyk'] as $x => $ilosc){
  70.  
  71. $y=explode("-", $x);
  72. $id = $y[0];
  73. $size = $y[1];
  74. $color = $y[2];
  75.  
  76. $i++;
  77. $result = mysql_query("SELECT * FROM products WHERE id = $id");
  78. $row = mysql_fetch_array($result);
  79.  
  80. echo '<pre>'; print_r($_POST); echo '</pre>';
  81. echo '<pre>'; print_r($_SESSION['koszyk']); echo '</pre>';?>
  82. <input type="text" style="width:40; text-align:center; "value="<? echo $_SESSION['koszyk'][$x]?>" name="<? echo $x ?>">
  83.  
  84. <?
  85.  
  86. }
  87. ?>
  88. <input type="hidden" name="zapisz" value="1">
  89. <input type="submit" value="Przelicz">
  90.  
  91. <?
  92. }
  93. ?>
  94. </body>
  95. </html>


marins:
Teoretycznie mogę tak zrobić, ale musiałbym zmienić to w wielu miejscach strony, czy bazy danych. Co więcej musiałbym przy wyświetlaniu zamieniać "_" na " " i zastanawiam się czy nie ma na to jakiejś prostszej rady.

Go to the top of the page
+Quote Post
mortus
post 26.02.2010, 11:40:37
Post #10





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Cytat(marins @ 26.02.2010, 10:30:34 ) *
zamień spacje na podkreślenie.
Do indexa w array możesz nawet sobie polskie znaki wstawić - bo teoretycznie można, tak samo ze spacjami. Ale jest to duże ryzyko i nie praktykuje się takich znaków w indexie tablicy.

Nie krzycz.

Podaj źródło, które nie zaleca, bo w Manualu nic na ten temat nie ma.
Wracając do tematu.
Miałeś jednak rację
Cytat
Już widać o co chodzi. Przy wysyłaniu POSTem spacja zmienia się na znak "_" (przynajmniej tak sądzę). Dlaczego tak się dzieje? Można temu jakoś zapobiec?
Choć moje stwierdzenie
Cytat
Przy wysyłaniu postem spacja pozostaje spacją! Problem leży gdzieś indziej.
jest słuszne, to jednak odnosi się do wartości pola.
Wytłumaczę na podstawie poniższego kodu:
  1. <input type="text" name="nazwa_pola" value="wartość pola" />
Zgodnie ze specyfikacją html, atrybut name elementu formuarza nie może posiadać spacji, znaków narodowych i znaków specjalnych (poza pewnymi wyjątkami). Spacja zostanie zamieniona na znak _, ale nie przez sam PHP, tylko przez silnik przeglądarki. Natomiast value elementu formularza może już być dowolny. Odpowiedź na drugie pytanie - nie można temu zapobiec, ponieważ tak po prostu jest. Wniosek: TRZEBA ZROBIĆ INACZEJ!
@marins: Połowicznie miałeś rację, ale nie chodzi o tablicę PHP-owską, tylko o tablicę DOM elementów formularza.
Zwracam honor i obiecuję, że następnym razem lepiej się będę przyglądał wstydnis.gif
Go to the top of the page
+Quote Post
R4D3K
post 26.02.2010, 12:19:13
Post #11





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

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


Żeby upewnić się na 100% zainstaluj sobie mozile +FireBug. Weź odpal aplikacje przejdz do formularza i uruchom FireBuga najedz myszką na tego inputa i zobacz Co Ci konsola pokazuje .... jak coś to wklej to tutaj i dalej pomyślimy
Go to the top of the page
+Quote Post
mortus
post 26.02.2010, 12:33:06
Post #12





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Tu już nie ma nad czym myśleć. Pierwotnie parametr name inputa ma wartość np. 48-S-Soft Peach. A źródła wyraźnie mówią:
Cytat
ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").

Odsyłam do źródeł
Oczywiście firebuga pod FF warto zainstalować, bo zdecydowanie ułatwia programowanie.
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: 19.07.2025 - 13:01