Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z przekazywaniem zmiennych w PHP
Forum PHP.pl > Forum > PHP
przemo79
Witam.
Wiem, że podobne tematy były już na forum, ale nie znalazłem tego co mi jest potrzebne lub nie umiem szukać snitch.gif . Chodzi mi o to, że mam formularz w HTML i przekazuje z niego dane do skryptu PHP. Później ten skrypt sobie coś tam oblicza. To ta łatwa część (chociaż dopiero się uczę PHP). Następnie mam drugi formularz gdzie użytkownik wybiera czy dalej kontunuować obliczenia czy wrócić do poprzedniego okna bo np. się machnął przy wprowadzaniu danych.
Teraz chcę zrobić coś takiego, żeby po wybraniu opcji dalej wyniki obliczeń mogły być użyte w tym samym skrypcie i w tym momencie utknąłem. Więc jeśli ktoś ma jakiś pomysł będę bardzo wdzięczny.
Poniżej zamieszczam kod który stworzyłem (przy wykorzystaniu pomocy wiadomości z netu):
  1. <?php
  2. //wczytanie danych z formularza
  3. if (!empty($_POST["day1"])) {$d1 = $_POST["day1"];}
  4. if (!empty($_POST['month1'])) {$m1 = $_POST['month1'];}
  5. if (!empty($_POST['year1'])) {$y1 = $_POST['year1'];}
  6.  
  7. if (!empty($_POST['day2'])) {$d2 = $_POST['day2'];}
  8. if (!empty($_POST['month2'])) {$m2 = $_POST['month2'];}
  9. if (!empty($_POST['year2'])) {$y2 = $_POST['year2'];}
  10. //sprawdzenie warunków poczatkowych
  11. if ((!$d1) || (!$m1) || (!$y1)) {echo "Podaj dzien wjazdu";}
  12. elseif (!$d2 || !$m2 || !$y2) {echo "Podaj dzien wyjazdu";}
  13. elseif (($y1 > $y2)||($m1>$m2)||($d1>$d2)) {echo "Data wyjazdu musi byc taka sama lub pozniejsza";}
  14. else
  15. $suma = $suma+licz($d1,$m1,$y1,$d2,$m2,$y2);
  16. echo "<p>Uplynelo ", $suma, " dni.</p>";
  17. function licz($d1,$m1,$y1,$d2,$m2,$y2)
  18. {
  19. // Funkcja zwraca liczbe dni miedzy dwoma przekazanymi datami.
  20. function count_days($a, $b) 
  21. {
  22. $suma=0;
  23. $dd = 0;
  24. $rok = 0;
  25. // Najpierw nalezy przeksztalcic daty na czesci skladowe:
  26. $a_dt = getdate($a);
  27. $b_dt = getdate($b);
  28. // Funkcja sprawdza, czy okreslony rok jest przestepny, czy nie:
  29. function is_leap_year($y) 
  30. {
  31. // Jesli rok dzieli sie przez 4, ale nie dzieli sie przez 100 lub dzieli sie przez
     400:
  32. return ((($y % 4) == 0) && ((($y % 100) != 0) || (($y % 400) == 0)));
  33. }
  34. // Sprawdzenie, czy lata z podanego zakresu sa przestepne:
  35. function sprawdz_rok($a, $b)
  36. {
  37. $dd = 0;
  38. foreach(range($a,$b) as $i)
  39. {
  40. if (is_leap_year($i)) 
  41. {
  42. $dd = $dd + 1;
  43. } 
  44. }
  45.  
  46. return $dd;
  47. }
  48. if ((is_leap_year($b_dt['year']) || is_leap_year($a_dt['year'])) && (($b_dt['mon'] >=|| $a_dt['mon'] >=2) && ($a_dt['mday']>28 || $b_dt['mday']>28)))
  49. {
  50. $rok = sprawdz_rok($b_dt['year'], $a_dt['year']);
  51. print $rok;
  52. print "jestem w if!!!";
  53. }
  54. // Odtworzenie znaczników czasu z wykorzystaniem poludnia kazdego dnia.
  55. // Dokladny czas nie ma znaczenia, ale musi to byc ta sama godzina w kazdym dniu.
  56. $a_new = mktime(12, 0, 0, $a_dt['mon'], $a_dt['mday'], $a_dt['year']);
  57. $b_new = mktime(12, 0, 0, $b_dt['mon'], $b_dt['mday'], $b_dt['year']);
  58. // Odjecie dwóch liczb i podzielenie przez liczbe sekund przypadajaca na dzien.
  59. // Zaokraglenie wyniku, poniewaz przekroczenie granicy zmiany czasu z letniego na 
    zimowy (lub odwrotnie)
  60. // spowoduje róznice w czasie o godzine lub dwie.
  61. return round(abs($a_new - $b_new) / 86400)+1+$rok;
  62. }
  63. $date1 = strtotime($m1."/".$d1."/".$y1);
  64. $date2 = strtotime($m2."/".$d2."/".$y2);
  65. $suma=$suma+count_days($date2, $date1);
  66.  
  67. //if (!empty($_POST["yes"])) {licz($d1,$m1,$y1,$d2,$m2,$y2);}
  68. //if (!empty($_POST['no'])) break;
  69. return $suma;
  70. }
  71. ?>
  72. <form method="post" action="dni.htm">
  73. Obliczyc ponownie?
  74. <p>
  75. <label>
  76. <input type="radio" name="ponownie" value="1">
  77. Tak</label>
  78. <br>
  79. <label>
  80. <input type="radio" name="ponownie" value="0" checked="checked">
  81. Nie</label>
  82. <br>
  83. </p>
  84. <input type=submit value=Wyslij><br>
  85. </form>
  86. <?php 
  87. //wczytanie danych z formularza
  88. if (!empty($_POST['ponownie'][0])) {$y = $_POST['ponownie'][0];}
  89. if (!empty($_POST['ponownie'][1])) {$n = $_POST['ponownie'][1];}
  90.  
  91. ?>

oraz formularz html:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  2. "http://www.w3.org/TR/html4/loose.dtd">
  3. <title>Program do liczenia dni pobytu</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  5. </head>
  6.  
  7. <form action="licz_dni.php" method="POST">
  8. Dzien wjazdu:
  9. Dzień: <input type=text name=day1 maxsize=2>
  10. Miesiąc : <input type=text name=month1 maxsize=2>
  11. Rok : <input type=text name=year1 maxsize=4><br><br>
  12. Dzien wyjazdu:
  13. Dzień:<input type=text name=day2 maxsize=2>
  14. Miesiąc : <input type=text name=month2 maxsize=2>
  15. Rok : <input type=text name=year2 maxsize=4><br><br>
  16. <input type=submit value=Oblicz><br>
  17. </form>
  18. </body>
  19. </html>
kossa
po wywołaniu drugiego formularza po wykonaniuobliczen przekaz do niego dane z pierwszego kroku (te wyliczone) do pol np. typu hidden lub zapisz do sesji i powyslaniu przez usera drugiego formularza (krok 2) bedziesz te dane mogl odczytac albo z sesji albo jak wszystko z drugiej formy $_POST

Łukasz
przemo79
OKI. Zrobiłem pole typu hidden i przekazuję tam moją zmienną, ale jest mały problem. Jak chcę odpalić stronę 1 z formularzem wyskakuje następujący błąd:
Cannot modify header information - headers already sentby (output started at /home.../licz_dni.php:11) in /home.../licz_dni.php:104. Czyli oznacza to, że informacje już wysłała strona i nie może być modyfikowana(przynajmniej mi się tak zdaje) a potrzebuję tej strony do wprowadzenia kolejnych danych.
Nie wiem jak mam to ugryźć. POMOCY!!!
Cezar708
Cytat(przemo79 @ 6.08.2007, 11:33:45 ) *
Cannot modify header information - headers already sent by (output started at /home.../licz_dni.php:11) in /home.../licz_dni.php:104


to oznacza, że już coś wysłałeś do przeglądarki, a nagle chcesz zmienić nagłówek (który już jest wysłany). Szczerze mówiąc w tych kodach o tu przedstawiłeś nie ma informacji o zmianie headera (lub ja się nie zorientowałem gdzie to jest).

Możesz to trochę obejść włączając buforowanie:
np:
  1. <?php
  2. // Twój skrypt
  3. ?>


Powinno pomóc.

więcej na temat: ob_start()
przemo79
Też tak próbowałem i niestety nic z tego. Sprawdzam w phpinfo i output buffering nie jest ustawiony. A co do kodu to on jest z wczoraj a dzisiaj dodałem kilka linijek np. wywołuję pierwszy formularz metodą header. Na początku skryptu mam ob_start(); a na końcu ob_end_flush(). Tylko zauważyłem, że jak piszę jakieś wywołanie funkcji to edytor podświetla mi ją na żółto a te dwie nie. Może tu jest jakiś problem?? MOże muszę zmienić coś w pliku php.ini??

Po wielu trudach i bojach w końcu się prawie udało smile.gif Został tylko jeden problem do rozwiązania. Jak przekazać zmienną pomiędzy formularzami w html. Może ktoś ma jakiś pomysł. Będę wdzięczny za wszelkie idee, pomoce itp.
Cezar708
no zapisz ja na przykład w polu typu hidden:

przykład:

pierwszy formularz:
  1. <form action=act_1.php method=post>
  2. <input name='do_przekazania'>
  3. <input type=submit value='Kliknyj na to'>
  4. </form>


skrypt akcji act_1.php wyświetla drugi formularz:
  1. <form action=act_2.php method=post>
  2. <input type=hidden name='do_przekazania' value='<?php echo $_POST['do_przekazania'] ?>' >
  3. <input type=submit value='Kliknyj na to'>
  4. </form>


no i tak możesz w nieskończoność, a w skrypcie act_2.php możesz odczytać wartość tej zmiennej formularza:

  1. <?php
  2. echo $_POST['do_przekazania'];
  3. ?>
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.