Как мне создать вывод PHP на основе входных значений поля формы?

#php

#php

Вопрос:

Я пытаюсь создать php-скрипт, который принимает входные значения из формы, а затем выводит рекомендуемые маршруты поездок при отправке формы. Я установил метод формы как POST. Проблема в том, что я получаю пустой вывод.

Я не уверен, проблема в моем коде или в методе form POST.

 
class Truck {
    // constructor
    public function __construct($truck_name, $max_weight) {
        $this->truck_name = $truck_name;
        $this->max_weight = $max_weight;
    }   
    public function print_truck() {
        if (isset($_POST['submit'])) 
            {
               $truck_1 = new Truck($truck_name, $max_weight);
                  $this->truck_name = $_POST['truck_name'];
                  $this->max_weight = $_POST['max_weight'];
            }       
        echo $this->truck_name;
    }
} 

class Location {
    // constructor
    public function __construct($location_name, $location_weight) {
        $this->location_name = $location_name;
        $this->location_weight = $location_weight;
    }

    public function trip_1() {
        if (isset($_POST['submit'])) {
    $location_2 = new Location($location_name, $location_weight);
        $this->location_name = $_POST['location_2'];
        $this->location_weight = $_POST['package_2'];

    $location_3 = new Location($location_name, $location_weight);
        $this->location_name = $_POST['location_3'];
        $this->location_weight = $_POST['package_3'];
    }

    echo "Trip #1 n" . $this->location_2 . ", " . $this->location_3 . "n";
    }

    public function trip_2() {
    if (isset($_POST['submit'])) {
    $location_1 = new Location($location_name, $location_weight);
        $this->location_name = $_POST['location_1'];
        $this->location_weight = $_POST['package_1'];
    }
    echo "Trip #2 n" . $this->location_1;
    }
}

# Here's the output HTML:
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
  <title>Deliveries</title>
</head>

<body class="container">
  <form method="post" action="">
    <input type="text" name="truck_name" Placeholder="Truck Name" value="" required>
  <input type="number" name="max_weight" Placeholder="Max weight in lbs" value="" required>
  <h4>Delivery Locations</h4>
  <input type="text" name="location_1" Placeholder="Location 1" value="" required>
  <input type="number" name="package_1" Placeholder="Package weight in lbs" value="" required>  
  <input type="text" name="location_1" Placeholder="Location 2" value="">
  <input type="number" name="package_2" Placeholder="Package weight in lbs" value="" required>
  <input type="text" name="location_1" Placeholder="Location 3" value="" required>
  <input type="number" name="package_3" Placeholder="Package weight in lbs" value="" required>
    <input type="submit" name="submit" value="Get Trips">
    <input type="reset" name="reset" value="Reset">
  </form>

<?php
if (isset($_POST['submit'])) 
  { ?>
    <h2><?php echo "Trip Routes"; ?></h2>
<?php
   $truck_1->print_truck();   
   trip_1();
   trip_2();
  }
?>
</body>
</html>
 

Это ожидаемый результат:

Поездка 1: местоположение 2, местоположение 3

Поездка 2: местоположение 1

Комментарии:

1. Поставьте условие else для if(isset($_POST[‘submit’]) в стороне, чтобы else что-то повторяло, делая это, вы узнаете, есть ли успешный запрос POST или нет.

2. У меня нет возможности отредактировать вопрос. Как еще я могу поделиться формой html?

3. вы можете отредактировать вопрос, внимательно посмотрите, и вы найдете ссылки

4. Есть ли у вашей формы действие

5. @PraveenPanishetti Я добавил условие else, по-прежнему получая пустой вывод.

Ответ №1:

Вы не создаете экземпляр ни одного из своих классов, прежде чем пытаться вызвать методы. Вам нужно создать экземпляр класса, например, $truck = new truck(); и оттуда вызывать ваши методы.

Ответ №2:

Как я упоминал в комментарии (затем удален) и было указано — приведенный выше код на самом деле не имеет особого смысла. Я ценю, что вы изучаете PHP, но способ создания экземпляров объектов класса и присвоения им значений неверен. class constructor Вызов в классе method выполняется задом наперед. class Должен быть создан экземпляр с любыми требуемыми параметрами, а затем он methods вызывается. Класс может быть задан в качестве аргумента для другого класса — что я и сделал ниже, где я создал новый класс с именем Trip и присвоил ему экземпляр truck and location …. Я, вероятно, пропустил главное, но надеюсь, что это немного поможет.

 <?php

    class Truck {
        private $truck_name;
        private $truck_weight;

        public function __construct($name=false, $weight=false) {
            $this->truck_name = $name;
            $this->max_weight = $weight;
        }
        public function get_name(){
            return $this->truck_name;
        }
        public function get_max_weight(){
            return $this->max_weight;
        }
    }


    class Location {
        private $location_name;
        private $location_weight;

        public function __construct($name=false, $weight=false) {
            $this->location_name = $name;
            $this->location_weight = $weight;
        }
        public function get_location(){
            return $this->location_name;
        }
        public function get_location_weight(){
            return $this->location_weight;
        }
    }

    class Trip{
        private $truck;
        private $locations;

        public function __construct( Truck $truck, $locations=array() ){
            $this->truck=$truck;
            $this->locations=$locations;
        }
        public function display(){
            if( !empty( $this->locations ) ){

                $dots=str_repeat('-',25);

                printf(
                    "<h2>Trip Routes</h2>
                    <pre>%snTruck: %snMax-Weight: %sn%sn",
                    $dots,
                    $this->truck->get_name(),
                    $this->truck->get_max_weight(),
                    $dots
                );

                $total_locations_weight = 0;

                foreach( $this->locations as $index => $location ){
                    $total_locations_weight  = floatval( $location->get_location_weight() );
                    printf( 
                        "[Drop: %d]nLocation: %snLocation-Weight: %snn",
                        $index 1,
                        $location->get_location(),
                        $location->get_location_weight()
                    );
                }
                printf("%s</pre>",$dots);

                /* Is there too much weight for the truck? */
                if( $total_locations_weight > $this->truck->get_max_weight() ){
                    printf(
                        "<pre><h1 style='color:red;margin:0;'>Maximum Weight Exceded</h1><div>Total weight is: %s</div><div>Limit exceded by: %s:</div>n%s</pre>",
                        $total_locations_weight,
                        $total_locations_weight - $this->truck->get_max_weight(),
                        $dots
                    );
                }
            }
        }
    }

?>

<!DOCTYPE HTML>
<html lang="en">
    <head>
      <title>Deliveries</title>
    </head>
    <body class="container">
      <form method="post" action="">

        <input type="text" name="truck_name" placeholder="Truck Name" value="" required>
        <input type="number" name="max_weight" placeholder="Max weight in lbs" value="" required>

        <h4>Delivery Locations</h4>

        <input type="text" name="location_1" placeholder="Location 1" value="" required>
        <input type="number" name="package_1" placeholder="Package weight in lbs" value="" required>  

        <input type="text" name="location_2" placeholder="Location 2" value="">
        <input type="number" name="package_2" placeholder="Package weight in lbs" value="" required>

        <input type="text" name="location_3" placeholder="Location 3" value="" required>
        <input type="number" name="package_3" placeholder="Package weight in lbs" value="" required>


        <input type="submit" name="submit" value="Get Trips">
        <input type="reset" name="reset" value="Reset">
      </form>

    <?php


        if( $_SERVER['REQUEST_METHOD']=='POST' amp;amp; isset( $_POST['submit'] ) ){

            $truck_name = filter_input( INPUT_POST, 'truck_name', FILTER_SANITIZE_STRING );
            $max_weight = filter_input( INPUT_POST, 'max_weight', FILTER_SANITIZE_STRING );

            $location_1 = filter_input( INPUT_POST, 'location_1', FILTER_SANITIZE_STRING );
            $location_2 = filter_input( INPUT_POST, 'location_2', FILTER_SANITIZE_STRING );
            $location_3 = filter_input( INPUT_POST, 'location_3', FILTER_SANITIZE_STRING );

            $package_1 = filter_input( INPUT_POST, 'package_1', FILTER_SANITIZE_STRING );
            $package_2 = filter_input( INPUT_POST, 'package_2', FILTER_SANITIZE_STRING );
            $package_3 = filter_input( INPUT_POST, 'package_3', FILTER_SANITIZE_STRING );







            $truck=new Truck( $truck_name, $max_weight );

            $loc_1=new Location( $location_1, $package_1 );
            $loc_2=new Location( $location_2, $package_2 );
            $loc_3=new Location( $location_3, $package_3 );

            $trip=new Trip( $truck, array( $loc_1, $loc_2, $loc_3 ) );
            $trip->display();
        }
    ?>
    </body>
</html>
 

И типичный вывод может быть:

 Trip Routes
-------------------------
Truck: The Crushinator
Max-Weight: 2500
-------------------------
[Drop: 1]
Location: London
Location-Weight: 1500

[Drop: 2]
Location: Glasgow
Location-Weight: 1500

[Drop: 3]
Location: Edinburgh
Location-Weight: 550

-------------------------
Maximum Weight Exceded
Total weight is: 3550
Limit exceded by: 1050:
-------------------------
 

Комментарии:

1. спасибо за это. это определенно дало мне представление о том, над чем мне нужно работать, чтобы получить ожидаемый результат. Я скоро обновлю окончательный результат. Еще раз спасибо!

2. Я хотел бы отобразить 2 местоположения за одну поездку. например $trip_1=new Trip( $truck, $loc_1, $loc_2 ); $trip_1->display(); , как я могу это сделать с настройкой вашего кода?

3. " it has definitely given me an idea for what i need to work on to get the expected output" … действительно? Пытались ли вы применить что-либо из вышеперечисленного (что, кстати, не должно было быть фактическим кодом, а скорее предложением), и если да, то где это? Исходный код был настолько испорчен, что сделал его практически бесполезным (извините). Вы могли бы, возможно, только в качестве предложения — указать МНОГО местоположений в массиве / объекте в качестве 2-го аргумента для Trip класса и обработать это ??!?

4. Я очень хорошо знаю, что ваш код был предложением. Я использовал его в качестве руководства для правильного создания экземпляров моих функций. Вот как я настраиваю с помощью магии __set и __get методов. Trip класс: class Trip{ private $truck; private $location; public function __construct( Truck $truck, $locs=array() ){ $this->truck=$truck; $this->location=$locs; } } . инициализированный: $trip_1 = new Trip(array("location1" => "$loc_1")); $trip_1->location1; Мой предыдущий вопрос не был хорошо сформулирован. Я только пытаюсь понять, где я неправильно обрабатываю массив.

5. извините, если последний комментарий звучит немного раздражительно — я был. В любом случае, изменено выше — возможно, это поможет, но, скорее всего, я снова пропустил главное.