web-dev-qa-db-fra.com

PHP Attention: division par zéro

J'apprends le php et j'ai construit une calculatrice expérimentale basée sur un formulaire (utilisant également html & POST) qui renvoie des valeurs à une table. La calculatrice est fonctionnelle lorsque j'entre mes valeurs et clique sur soumettre, mais je reçois toujours deux erreurs "Division par zéro" sur la dernière ligne lorsque je lance le code pour la première fois. Je n'arrive pas à trouver une solution logique ou des explications lors de la recherche ici ou via Google. sera apprécié.

<?php 

error_reporting(E_ALL ^ E_NOTICE);

//calculate the difference in price

$itemQty = $_POST['num1'];

$itemCost = $_POST['num2'];

$itemSale = $_POST['num3'];

$shipMat = $_POST['num4'];

$diffPrice = $itemSale - $itemCost;

$actual = ($diffPrice - $shipMat) * $itemQty;

$diffPricePercent = (($actual * 100) / $itemCost) / $itemQty ;

?>
7
Chip

Vous devez encapsuler votre code de traitement de formulaire dans un conditionnel afin qu'il ne s'exécute pas lorsque vous ouvrez la page pour la première fois. Quelque chose comme ça:

if($_POST['num1'] > 0 && $_POST['num2'] > 0 && $_POST['num3'] > 0 && $_POST['num4'] > 0){

  $itemQty = $_POST['num1'];
  $itemCost = $_POST['num2'];
  $itemSale = $_POST['num3'];
  $shipMat = $_POST['num4'];

  $diffPrice = $itemSale - $itemCost;
  $actual = ($diffPrice - $shipMat) * $itemQty;
  $diffPricePercent = (($actual * 100) / $itemCost) / $itemQty ;
}
8
S.A

Essayez d'utiliser

$var = @($val1 / $val2);
7
Hussaini Ibrahim
$diffPricePercent = (($actual * 100) / $itemCost) / $itemQty ;

$ itemCost et $ itemQty renvoient zéro ou zéro, vérifiez-les avec le code à partir de l'entrée utilisateur

aussi pour vérifier s'il ne s'agit pas de données vides, ajoutez:

if(!empty($_POST['num1'])){
  itemQty = $_POST['num1'];
}

et vous pouvez vérifier ce lien pour la validation post avant de l'utiliser dans une variable

https://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/

6
Ahmed Alaa El-Din

Si une variable n'est pas définie, elle est NULL et si vous essayez de diviser quelque chose par null, vous obtiendrez une erreur divise par zéro

3
Neal

S'il ne montre une erreur que lors de la première exécution, c'est probablement parce que vous n'avez envoyé aucune donnée POST. Vous devez vérifier les variables POST avant de travailler avec Undefined, null, tableau vide, chaîne vide, etc. sont tous considérés comme faux; et lorsque PHP transforme automatiquement cette valeur booléenne fausse en un entier ou un flottant, elle devient nulle. C'est ce qui se passe avec vos variables, elles ne sont pas définies lors de la première exécution et sont donc traitées comme des zéros.

10 / $unsetVariable

devient

10 / 0

Conclusion: vérifiez si vos entrées existent et si elles sont valides avant de faire quoi que ce soit avec elles, activez également le rapport d'erreurs lorsque vous effectuez un travail local car cela vous fera gagner beaucoup de temps. Vous pouvez activer toutes les erreurs comme suit: error_reporting(E_ALL);

Pour résoudre votre problème spécifique: ne faites aucun calcul s'il n'y a pas d'entrée de votre formulaire; montrez simplement le formulaire à la place.

2
Shomz

lorsque mon diviseur a une valeur de 0

if ($divisor == 0) {
    $divisor = 1;
}
1
Sairen

Vous pouvez essayer avec ceci. Vous avez cette erreur parce que nous ne pouvons pas diviser par 'zero' (0) valeur. Nous voulons donc valider avant quand nous faisons des calculs.

if($itemCost != 0 && $itemCost != NULL && $itemQty != 0 && $itemQty != NULL){
      $diffPricePercent = (($actual * 100) / $itemCost) / $itemQty ;
}

Et nous pouvons également valider les données POST. Se référer à la suite

$itemQty = isset($_POST['num1']) ? $_POST['num1'] : 0;

$itemCost = isset($_POST['num2']) ? $_POST['num2'] : 0;

$itemSale = isset($_POST['num3']) ? $_POST['num3'] : 0;

$shipMat = isset($_POST['num4']) ? $_POST['num4'] : 0;
1
UWU_SANDUN

essaye ça

if( isset($itemCost)!='' && isset($itemQty)!='')
{
$diffPricePercent = (($actual * 100) / $itemCost) / $itemQty ;
}
else
{
echo "either of itemCost or itemQty are null ";
}
?>
0
Rahul