Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][HTML] Błąd przy przesyłaniu danych z formularza
Forum PHP.pl > Forum > PHP
melior
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?
mortus
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.
R4D3K
Sprawdz co kryje w sobie $x, bo może być pusta (nigdzie nie wiedzę deklaracji).
melior
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?
mortus
Przy wysyłaniu postem spacja pozostaje spacją! Problem leży gdzieś indziej.
EDIT:
Wrzuć cały kod koszyk.php!
marins
klucz w tablicy nie może zawierać spacji.
mortus
Kod
Array
(
[58-S-Soft Peach] =>
)

Jak nie może, skoro widzisz, że zawiera! Przecież 58-S-Soft Peach to klucz (index w tablicy)!
marins
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.
melior
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.

mortus
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
R4D3K
Ż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
mortus
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.
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.