#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. извините, если последний комментарий звучит немного раздражительно — я был. В любом случае, изменено выше — возможно, это поможет, но, скорее всего, я снова пропустил главное.