我在一张桌子的招待所中有5个房间,用户必须检查他们想要预订的一个或多个房间,并选择他们希望拥有的选项,例如人数,早餐选项,晚餐选项和床选项。
为解释问题所在,让我举一些例子:
假设我们按出现顺序将这5个房间称为:
元素室
地球室
水室
飞机室
消防室
假设我使用任何下拉列表值检查“元素室”和“地球室”,例如:
元素室
人数:1
晚餐课程:120
早餐:70
床:国王
&&
地球室
人数:2
晚餐课程:200
早餐:70
床:2张单人床
以上内容确实给出了正确的输出。
但是现在我只选择“水”房间或显示在“元素”房间下方的任何其他房间:
我得到:
水室(或元素室以外的任何室)
人数:0
晚餐课程:0
早餐:0
床铺:选择床铺尺寸
如果我从“元素室”向下选择每个房间,则可以正确获取所有值,但是如果我选择“元素室”然后选择“空中室”(而不是选择“地球室”),则会得到以下信息:
元素室
人数:1
晚餐课程:120
早餐:70
床:国王
&&
飞机室
人数:0
晚餐课程:0
早餐:0
床铺:选择床铺尺寸
好像我的代码只会按顺序从上到下循环每个值,而不会按顺序循环其他选择的值,但是选中的房间始终是正确的,而不是选定的选项。
这是我的HTML:
<form class="booking-form" name="book-room-form" action="" id="contactForm" method="post" novalidate>
<?php foreach ( $rooms as $room ) : ?>
<input type="checkbox" class="form-check-input" name="room-selected[]" value="<?php echo $room->post_title; ?>">
<select class="num-person select-update" id="<?php echo 'r-' . $room->ID; ?>" name="people-select[]" required>
<option value="0" selected>Select Number of Persons</option>
<option value="1">1 person R600</option>
<option value="2">2 persons R800</option>
</select>
<select class="num-dinner select-update" id="<?php echo 'd-' . $room->ID; ?>" name="dinner-select[]">
<option value="0" selected>Select Dinner Course</option>
<option value="120">Two Course Dinner R120</option>
<option value="200">Three Course Dinner R200</option>
</select>
<select class="num-bf select-update" id="<?php echo 'b-' . $room->ID; ?>" name="breakfast-select[]">
<option value="0" selected>Select Breakfast Type</option>
<option value="70">Basic Breakfast R70</option>
<option value="120">Full Breakfast R120</option>
</select>
<select class="bed-select" name="bed-select[]">
<option selected>Select Bed Size</option>
<option value="King Bed">King Bed</option>
<option value="2 Single Beds">2 Single Beds</option>
</select>
<?php endforeach; ?>
<button name="submit-request" type="submit" class="btn btn-primary">Submit</button>
</form>
这是我的代码:
if(isset($_POST['submit-request'])) {
$room_selected = $_POST['room-selected'];
$numPeople = $_POST['people-select'];
$dinnerSelect = $_POST['dinner-select'];
$breakfastSelect = $_POST['breakfast-select'];
$bedSelect = $_POST['bed-select'];
$room = $room_selected;
$num = $numPeople;
$dinn = $dinnerSelect;
$bf = $breakfastSelect;
$bed = $bedSelect;
foreach ($room as $id => $key) {
//$key returns the room name
if($key) {
$result[$key] = array(
'num_person' => $num[$id],
'dinner' => $dinn[$id],
'breakfast' => $bf[$id],
'bed_type' => $bed[$id],
);
}
echo $key . '<br/>' . $num[$id] . '<br/>' . $dinn[$id] . '<br/>' . $bf[$id] . '<br/>' . $bed[$id] . '<br/>' ;
}
}
答案 0 :(得分:0)
之所以会发生这种情况,是因为只有选中的复选框会通过Post-Request发送。因此,例如,如果选中了“元素室”和“地球室”,则会得到:
$_POST[room-selected] => Array
(
[0] => Element Room
[1] => Earth Room
)
但是,如果您选择任何其他房间,则数组仍将以0索引开头。因此,按照您的示例,如果仅选择“水房间”,则会得到:
$_POST[room-selected] => Array
(
[0] => Water Room
)
但是,由于始终存在要传输的值,因此选择字段将始终为您提供一个包含所有信息的数组。这意味着第一个选中的房间将始终引用Select-Arrays的第一个元素。
您可以使用表单的字符串键来避免这种情况,例如:
<input name="room-selected[<?php echo $room->post_title; ?>]" />
此后,您还必须更改foreach-Loop或Select-Name-Arrays。