В чем ошибка в коде с if и else?

96
28 ноября 2019, 19:20

Выводит на экран в любом случае "Введите коректное число1" Код на PHP :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ПХП ООП</title>
</head>
<body>
    <form action="index.php" method="POST">
        <input type="text" name="chil">
        <button type="submit" name="do_sum"><p>Решить</p></button>
    </form>
<?php 
    trait Prim {
        public $numse = 15;
        public function SumLinePrim($numse)
        {
            return $this->numse * $this->get();
        }
    } 
    abstract class HtmlError 
    {
        public static function Error()
        {
             if(! is_int());
        }
    }
    class Glava extends Exception
    {
        use Prim;
        public $resheno;
        function __construct($resheno)
        {
            $this->resheno = $resheno;
        }
        public function get()
        {
            return $this->resheno;
        }
        public function getOtvet()
        {
            if(is_string($this->get($this->resheno))) {
                return print "Введите коректное число";
            } else {
                return $this->get() + $this->SumLinePrim($this->numse);
            }
        }
    }
    $data = $_POST;
    $errors = array();
    if(isset($data['do_sum'])) {
        $doc7 = new Glava($data['chil']);
        print "{$doc7->getOtvet()}";
    }
?>

Answer 1

Значение переданное POST запросом из формы

$data['chil']

всегда будет строкой, что бы вы не ввели, соответственно

is_string($this->get()) 

всегда будет true и всегда будет срабатывать

if(is_string($this->get($this->resheno))) {
    return print "Введите коректное число";
}
Answer 2

Предполагаю (нет возможности быстро проверить), что данные приходящие в $data['chil'] всегда являются строкой ('5' - строка, 5 - число, и $data['chil'] содержит '5'), поэтому условие is_string($this->get($this->resheno)) всегда True (кстати, метод get у Вас не принимает аргументов, можно написать is_string($this->get()) или is_string($this->resheno)).

Можно преобразовать строку в число, но перед этим нужно проверить, можно ли строку преобразовать в число или нет, простой пример:

$a = '654654.6465';  //  $a - строка с числом ('654654.6465')
echo('Type $a: ');
var_dump($a); 
//  is_numeric проверяет, можно ли строку преобразовать в число или нет. 
echo("Можно преобразовать в число?: " . (int)is_numeric($a) . "\n");  
$a = (float)$a;  //  Преобразовываем; $a - число (654654.6465)
echo('Type $a: ');
var_dump($a);
echo("\n\n");
$a = 'string';  //  $a - просто строка
echo('Type $a: ');
var_dump($a);
// Т.к. $a нелься преобразовать в числу, is_numeric возвращает false
echo("Можно преобразовать в число?: " . (int)is_numeric($a) . "\n"); 
$a = (float)$a;  // Теперь $a содержит 0, что тоже число, и это может привести 
                 // к ОШИБКАМ в программе, поэтому перед преобразованием ВСЕГДА 
                 // НУЖНО проверять строку ф-ией is_numeric
echo('Type $a: ');
var_dump($a);

Вывод:

Type $a: string(11) "654654.6465"
Можно преобразовать в число?: 1
Type $a: float(654654.6465)

Type $a: string(6) "string"
Можно преобразовать в число?: 0
Type $a: float(0)

Документация: https://secure.php.net/manual/ru/function.is-numeric.php

READ ALSO
Объединение 4 таблиц Laravel MySQL

Объединение 4 таблиц Laravel MySQL

Я начал изучать фреймворк Laravel 58 и столкнулся с проблемой

88
Защита серверной части php

Защита серверной части php

У меня есть серверная часть написанная на php, мне нужно её максимально защитить от XSS и подобных атак

123
Скрываем /?taxonomy=

Скрываем /?taxonomy=

Как скрыть в адресной строке таксономию?

153