• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dzielenie php - sprawdzanie zera.

Object Storage Arubacloud
0 głosów
272 wizyt
pytanie zadane 1 czerwca 2022 w PHP przez elevator Nowicjusz (120 p.)

Witam serdecznie ! Po wpisaniu zera w pole edycyjne rozpoznaje je jako wartosc nie wpisana. Prosze o pomoc bo juz nie mam sily :/. Pozdrawiam wszystkich forumowiczow.

<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" type="text/css" href="styl.css">
<script type="text/javascript">
function allreset()
{
	document.getElementById("result").innerHTML = "";
	document.getElementById("dane").innerHTML = "";
}
function divide(){
	var a = document.getElementById("numA").value;
	var b = document.getElementById("numB").value;
	var d = a/b;
	if(a == "" || b == "")
	{
		document.getElementById("result").innerHTML = "fill in the fields";
	}
	else if(b == 0)
	{
		document.getElementById("result").innerHTML = "liczba a: " + a + "<br>" + " liczba b: " + b + "<br>" +"don't divide by zero";
	}
	else if(a != parseFloat(a) || b != parseFloat(b))
	{
		document.getElementById("result").innerHTML = "liczba a: " + a + "<br>" + " liczba b: " + b + "<br>" + "this is not number";
	}	
	else if(a%b < 0 || a%b > 0) // modulo
	{
		document.getElementById("result").innerHTML = "liczba a: " + a + "<br>" + " liczba b: " + b + "<br>" +"wynik: " + d.toFixed(2);
	}
	else
	{
		document.getElementById("result").innerHTML = "liczba a: " + a + "<br>" + " liczba b: " + b + "<br>" + " wynik: " + d;
	}
}
function roznica(){
	var a = document.getElementById("numA").value;
	var b = document.getElementById("numB").value;
	var d = a-b;
	
	if(a == "" || b == "")
	{
		document.getElementById("result").innerHTML = "fill in the fields";
	}
	else if(a != parseFloat(a) || b != parseFloat(b))
	{
		document.getElementById("result").innerHTML = "this is not number";
	}
	else if(a%b > 0 || a%b < 0)
	{
		document.getElementById("result").innerHTML = d.toFixed(2);
	}	
	else
	{
		document.getElementById("result").innerHTML = d;
	}
}

</script>
<title>TEST</title>
</head>
<body>
<form action="test.php" method="post">
<label>type a: <input type="number" id="numA" size=10 maxlength="5" style="border-color:red" name="numA" step="0.01"></label>
<label>type b: <input type="number" id="numB" size=10 maxlength="5" style="border-color:red" name="numB" step="0.01"></label>
<button type="button" onclick="divide()"> / </button>
<button type="button" onclick="roznica()"> - </button>
<input type="submit" value="checkPHP">
<input type="reset" onclick="allreset()" value="RESET">
</form>
<?php
if(!isset($_POST["numA"]) || !isset($_POST["numB"]) || empty($_POST["numA"]) || empty($_POST["numB"]))
{
	echo "wpisz";
	exit();
}
else if(isset($_POST["numA"]) && isset($_POST["numB"]) && $_POST["numB"] == 0 && !empty($_POST["numB"]))
{
	echo "zero";
}
else if(!isset($_POST["numA"]) || !isset($_POST["numB"]))
{
	echo "puste 1"."<br>";
	exit();
}

else
{
$numa = $_POST["numA"];
$numb = $_POST["numB"];
$suma = ((float)$numa+(float)$numb);
$roznica = ((float)$numa - (float)$numb);
$iloraz = ((float)$numa/(float)$numb);
$iloczyn = ((float)$numa * (float)$numb);
echo "<div id=\"dane\">"."liczba a: ".$numa."<br>"." liczba b: ".$numb."</div>";
echo "<div id=\"result\">"."suma: ".$suma."<br>"."roznica: ".$roznica."<br>"."iloczyn: ".$iloczyn."<br>"."iloraz: ".round((float)$numa/(float)$numb, 2)."</div>";
}
?>
<div id="dane"></div>
<div id="result"></div>
</body>
</html>

 

1 odpowiedź

0 głosów
odpowiedź 1 czerwca 2022 przez VBService Ekspert (252,660 p.)
edycja 1 czerwca 2022 przez VBService

isset($_POST[...]) tylko sprawdza czy pole w formularzu o podanej nazwie istniało (input, select, textarea itp.) i zostało zwrócone jako zmienna do $_POST w momencie wysłania formularza, nie sprawdza co "zawiera" zmienna, natomiast empty(...) uznaje wartość jako pustą, gdy zmienna zawiera (przyjęła wartość):

  • '', "",
  • null,
  • array(),
  • FALSE,
  • NULL,
  • '0', "0", 0

proponuję w ogóle zrezygnować z nich (isset, empty) w tym przypadku, na etapie pobierania wartości ze zmiennych z $_POST i użyć operatora ?? "do obsługi" ewentualnych błędów.

 

przykład (pozwoliłem sobie nieco przerobić Twój skrypt - mam nadzieje, że nie będziesz miał Mi tego za złe  wink)

<?php

  // var_dump($_POST); // Dla "podejrzenia" danych przysłanych z formularza
  
  $data_show = $result_show = '';
  $numA = $numB = 0;

  function checkInputs($a, $b)
  {
    $error_message = '';

    if (trim($a) == '' || trim($b) == '')
      $error_message = 'some of the fields are empty, fill in the fields';
    else if (!is_numeric($a) || !is_numeric($b))
      $error_message = 'enter only numbers, please';
    else if ($a == 0 && $b == 0)
      $error_message = 'both of the filds contain zero value';

    if ($error_message)
      return $error_message;
    else
      return null;
  }
      
  // wykonaj kod tylko, gdy skrypt został uruchomiony przez
  // wysłanie formularza po naciśnięciu przycisku submit ( checkPHP )  
  if ($_SERVER["REQUEST_METHOD"] == "POST") 
  {
    $numA = $_POST["numA"] ?? null;
    $numB = $_POST["numB"] ?? null;

    if (! $result_show = checkInputs($numA, $numB))
    {
           $add = ((float)$numA + (float)$numB);
      $subtract = ((float)$numA - (float)$numB);
       $divided = ($numB == 0) ? '<span class="error">division by zero error</span>': ((float)$numA / (float)$numB);
      $multiply = ((float)$numA * (float)$numB);

      $data_show = "For <b>{$numA}</b> and <b>{$numB}</b>";
      $result_show = 'Addition: ' . (($add % 1 == 0) ? $add : number_format($add, 2)) . '<br>'
                   . 'Subtraction: ' . (($subtract % 1 == 0) ? $subtract : number_format($subtract, 2)) . '<br>'
                   . 'Division: ' . ((!is_numeric($divided)) ? $divided : (($divided % 1 == 0) ? $divided : number_format($divided, 2))) . '<br>'
                   . 'Multiplication: ' . (($multiply % 1 == 0) ? $multiply : number_format($multiply, 2));
    }
  }

?>
<!DOCTYPE html>
<html lang="pl-PL">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

    <link rel="stylesheet" href="styl.css">
    <title>TEST</title>

    <style>
      input[type="number"] {
        border: 1px solid red;        
        margin-right: 0.5em;
        width: 5em;
      }
      span.error {
        font: 700 0.9em/1 monospace;
        color: orangered; 
      }
    </style>
  </head>
  <body>

    <form action="" method="post">
      <label for="numA">type a:</label> 
      <input type="number" id="numA" name="numA" min="0" max="99999" step="0.01" value="" required>
      <label for="numB">type b:</label> 
      <input type="number" id="numB" name="numB" min="0" max="99999" step="0.01" value="" required>

      <button type="button" id="divide">/</button>
      <button type="button" id="subtraction">-</button>
      
      <input type="submit" value="checkPHP">
      <input type="reset" value="RESET">
    </form>

    <div id="data"><?php echo $data_show; ?></div>
    <div id="result"><?php echo $result_show; ?></div>

    <script>
      let timeoutId;

      const divide_button = document.querySelector('#divide');
      divide_button.addEventListener('click', divide);

      const subtraction_button = document.querySelector('#subtraction');
      subtraction_button.addEventListener('click', subtraction);

      const reset_button = document.querySelector('input[type="reset"]');
      reset_button.addEventListener('click', allReset);

      const data_show = document.querySelector('#data'),
            result_show = document.querySelector('#result');


      function divide()
      {
        const numA = document.querySelector('#numA').value,
              numB = document.querySelector('#numB').value;

        if (checkInputs(numA, numB))
        {
           if (numB == 0)
           {
             showMessage('division by zero error');
             return false; // natychmiastowe opuszczenie funkcji
           }

           const result = numA / numB;
           showResult(result);
        }
      }

      function subtraction()
      {
        const numA = document.querySelector('#numA').value,
              numB = document.querySelector('#numB').value;

        if (checkInputs(numA, numB))
        {
           const result = numA - numB;
           showResult(result);
        }
      }

      function showResult(result)
      {
        if (Number.isInteger(result)) // result % 1 === 0
          result_show.innerHTML = result;
        else
          result_show.innerHTML = result.toFixed(2);
      }

      function checkInputs(a, b)
      {
        let error_message = '';

        if (a === null || a === '' || b === null || b === '' )
          error_message = 'some of the fields are empty, fill in the fields';
        else if (Number.isNaN(a) || Number.isNaN(b))
          error_message = 'enter only numbers, please';
        else if (a == 0 && b == 0)
          error_message = 'both of the filds contain zero value';

        if (error_message)
        {
          showMessage(error_message); 
          return false;
        } else {
          return true;
        }
      }

      function showMessage(message)
      {
         allReset();
         result_show.innerHTML = message;
         clearTimeout(timeoutId);
         timeoutId = setTimeout(allReset, 3000); // po 3 sekundach "wyczyść" komunikat
      }

      function allReset()
      {
        data_show.innerHTML = '';
        result_show.innerHTML = '';
      }
    </script>
  </body>
</html>

 

 

BTW,

Show a number to two decimal places

Use round() if you are expecting a number in float format only, else use number_format()

 

How do I check that a number is float or integer? ]
PHP Ternary Operator - $result = condition ? value1 : value2; ]
What does double question mark (??) operator mean in PHP ]

1
komentarz 1 czerwca 2022 przez elevator Nowicjusz (120 p.)
Dziekuje serdecznie za pomoc. Pelny profesjonalizm ! Czeka mnie teraz spora analiza tego co napisales :) gdyz dopiero sie ucze php (w zasadzie pod katem egzaminu ee09).

Podobne pytania

0 głosów
2 odpowiedzi 185 wizyt
pytanie zadane 3 listopada 2019 w PHP przez orande Nowicjusz (160 p.)
0 głosów
7 odpowiedzi 730 wizyt
pytanie zadane 20 kwietnia 2015 w Rozwój zawodowy, nauka, praca przez konradbaran Nowicjusz (240 p.)
0 głosów
0 odpowiedzi 106 wizyt
pytanie zadane 3 lutego w Algorytmy przez kio41 Nowicjusz (120 p.)

92,540 zapytań

141,382 odpowiedzi

319,481 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...