Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Kalkulator w php
Forum PHP.pl > Forum > Przedszkole
djjbenus
Witam,

wraca stary temat mojego kalkulatora na którego pomysł znalazłem ale teraz mam problemy. Otóż przy naciśnięciu znaku + lub - lub * / dzieli mi przez zero. Nie mam pojęcia dlaczego.


Zamieszczam kod.


  1. <?php
  2.  
  3. function licz($tmp)
  4. {
  5. switch ($tmp)
  6. {
  7. case '1' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+1; break;
  8. case '2' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+2; break;
  9. case '3' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+3; break;
  10. case '4' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+4; break;
  11. case '5' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+5; break;
  12. case '6' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+6; break;
  13. case '7' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+7; break;
  14. case '8' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+8; break;
  15. case '9' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+9; break;
  16. case '0' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+0; break;
  17. }
  18. return $tmp;
  19. }
  20.  
  21. function liczy($tmp)
  22. {
  23. switch ($tmp)
  24. {
  25. case '1' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+1; break;
  26. case '2' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+2; break;
  27. case '3' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+3; break;
  28. case '4' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+4; break;
  29. case '5' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+5; break;
  30. case '6' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+6; break;
  31. case '7' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+7; break;
  32. case '8' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+8; break;
  33. case '9' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+9; break;
  34. case '0' : $_SESSION['liczba'] = (($_SESSION['liczba'])*10)+0; break;
  35. }
  36. return $tmp;
  37. }
  38.  
  39.  
  40. if(!isset($_SESSION['wynik']))
  41. {
  42. $_SESSION['wynik']='0';
  43. }
  44.  
  45. if(!isset($_SESSION['liczba']))
  46. {
  47. $_SESSION['liczba']='1';
  48. }
  49.  
  50. /*if(!isset($_SESSION['tmp']))
  51. {
  52. $_SESSION['tmp'] = '0';
  53. }*/
  54.  
  55. if(isset($_POST['send']))
  56. {
  57. if($_POST['wynik']==0)
  58. {
  59. licz($_POST['send']);
  60. }
  61. else
  62. {
  63. liczy($_POST['send']);
  64. }
  65. }
  66.  
  67. if(isset($_POST['sign']))
  68. {
  69. switch($_POST['sign'])
  70. {
  71. case '+' :
  72. $_SESSION['wynik']=$_SESSION['wynik']+$_SESSION['liczba'];
  73. case '-' :
  74. $_SESSION['wynik']=$_SESSION['wynik']-$_SESSION['liczba'];
  75. case '*' :
  76. $_SESSION['wynik']=$_SESSION['wynik']*$_SESSION['liczba'];
  77. case '/' :
  78. $_SESSION['wynik']=$_SESSION['wynik']/$_SESSION['liczba'];
  79. //case '=' : $_SESSION['liczba']=0;
  80. case 'RESET' :
  81. $_SESSION['liczba']=0; $_SESSION['wynik']=0;
  82. }
  83. }
  84.  
  85. ?>
  86.  
  87. <html>
  88. <head>
  89. </head>
  90. <body>
  91. <?php
  92. echo $_SESSION['liczba'];
  93. echo '<br />';
  94. echo $_SESSION['wynik'];
  95. ?>
  96. <form action="index.php" method="post">
  97. <fieldset style="width: 150px;">
  98. <input type="temp" value="<?php if($_POST['send'] == '=') { echo $_SESSION['wynik']; } else { echo $_SESSION['wynik']; } ?>" />
  99. </fieldset>
  100. <fieldset style="width: 150px;">
  101. <button type="submit" name="send" value="1">1</button>
  102. <button type="submit" name="send" value="2">2</button>
  103. <button type="submit" name="send" value="3">3</button>
  104. <button type="submit" name="sign" value="+">+</button><br/>
  105. <button type="submit" name="send" value="4">4</button>
  106. <button type="submit" name="send" value="5">5</button>
  107. <button type="submit" name="send" value="6">6</button>
  108. <button type="submit" name="sign" value="-">-</button><br/>
  109. <button type="submit" name="send" value="7">7</button>
  110. <button type="submit" name="send" value="8">8</button>
  111. <button type="submit" name="send" value="9">9</button>
  112. <button type="submit" name="sign" value="*">*</button><br/>
  113. <button type="submit" name="send" value="0">0</button>
  114. <button type="submit" name="sign" value="/">/</button>
  115. <button type="submit" name="send" value="=">=</button>
  116. <button type="submit" name="sign" value="RESET">AC</button>
  117. </fieldset>
  118. </form>
  119. </body>
  120. </html>
Necsord
Nie wnikam w reszte kodu, ale w poniższym switch'u brakuje break'ów.
  1. if(isset($_POST['sign']))
  2. {
  3. switch($_POST['sign'])
  4. {
  5. case '+' :
  6. $_SESSION['wynik']=$_SESSION['wynik']+$_SESSION['liczba'];
  7. case '-' :
  8. $_SESSION['wynik']=$_SESSION['wynik']-$_SESSION['liczba'];
  9. case '*' :
  10. $_SESSION['wynik']=$_SESSION['wynik']*$_SESSION['liczba'];
  11. case '/' :
  12. $_SESSION['wynik']=$_SESSION['wynik']/$_SESSION['liczba'];
  13. //case '=' : $_SESSION['liczba']=0;
  14. case 'RESET' :
  15. $_SESSION['liczba']=0; $_SESSION['wynik']=0;
  16. }
  17. }
djjbenus
Rozwiązało to problem niepotrzebnego dzielenia przez zero. Jednak do zmiennej $_SESSION['liczba'] nic nie jest zapisywane. W czym tkwi problem w moim rozumowaniu?
Necsord
  1. if(isset($_POST['send']))
  2. {
  3. if($_POST['wynik']==0)
  4. {
  5. licz($_POST['send']);
  6. }
  7. else
  8. {
  9. liczy($_POST['send']);
  10. }
  11. }


W formularzu nie widze żadnego pola "wynik", chyba chodziło tobie o $_SESSION. Swoja drogą masz dużo notice'ów "undefined index" ( Temat: PHP Notice Undefined index ).
peter13135
Po co robisz takie bycze switche ?Przecież to w jednej linijce da się zrobić.
Tomplus
Upewnij się czy po prostu funkcjach licz/liczy zapisują się informacje do sesji liczba.
peter13135
A ja se tak myślę... najpierw masz funkcje, które zapisują coś do sesji, a potem dopiero session_start() tongue.gif
SmokAnalog
Kod Twojego kalkulatora jest straszny. Ale to mnie najbardziej rozbawiło: (pomijając nawet fakt że te funkcje są źle skonstruowane działając bezpośrednio na zmiennej sesji)
  1. switch ($tmp)
  2. {
  3. case '1' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+1; break;
  4. case '2' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+2; break;
  5. case '3' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+3; break;
  6. case '4' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+4; break;
  7. case '5' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+5; break;
  8. case '6' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+6; break;
  9. case '7' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+7; break;
  10. case '8' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+8; break;
  11. case '9' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+9; break;
  12. case '0' : $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+0; break;
  13. }
  14. return $tmp;

I jeszcze jeden podobny switch. Przecież wystarczy:
  1. if(preg_match('#^\d$#', $tmp)) {
  2. $_SESSION['wynik'] = (($_SESSION['wynik'])*10)+$tmp;
  3. }
  4. return $tmp;

Zresztą sama idea sesji dla tego kalkulatora wydaje mi się średnio trafiona. Wystarczyłby input hidden.
djjbenus
@peter13135

Próbowałem ale mi nie wyszło dlatego jest jak jest. Jeśli masz jakiś pomysł to chętnie spróbuje.

Hmmm wydawało mi się że nie ma znaczenia gdzie zadeklaruje funkcje.

@Tomplus

Niby funkcja licz oddaje to co powinno być ale już funkcja liczy nie spełnia założeń.

@SmokAnalog

Wydawało mi się że tak ponieważ przy zwykłym formularzu mi się nie udało skontruować nic konkretnego.
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.