Ниже приведена таблица «Комната» в базе данных:
Room Building Capacity CW5/10 Canalside West 50 CW4/09 Canalside West 40 CW2/08 Canalside West 40 CW4/10 Canalside West 25 CE1/03 Canalside East 40
Я получаю эту ошибку:
Примечание. Неопределенный индекс: Номера в /web/stud/u0867587/Mobile_app/create_session.php в строке 374
который для этого кода:
foreach ($buildings[0]['Rooms'] as $roomId => $roomData)
Поэтому мой вопрос заключается в том, как можно устранить ошибку (я считаю, что это потому, что она пытается найти 0, хотя мои ценности для строительства – Canalside East и Canalside West).
Ниже приведен полный код:
$sql="SELECT Building, Room FROM Room WHERE Building = '".$building."'"; $sqlresult = mysql_query($sql); $buildings = array(); // easier if you don't use generic names for data while($sqlrow = mysql_fetch_array($sqlresult)) { // you need to initialise your building array cells if (!isset($buildings[$sqlrow['Building']])) { $buildings[$sqlrow['Building']] = array('Rooms' => array()); } // you can add the room to the building 'Rooms' array $buildings[$sqlrow['Building']]['Rooms'][] = $sqlrow['Room']; } $buildingHTML = ""; $buildingHTML .= '<select name="buildings" id="buildingssDrop">'.PHP_EOL; $buildingHTML .= '<option value="">Please Select</option>'.PHP_EOL; foreach ($buildings as $building => $buildingData) { $buildingHTML .= "<option value='".$building."'>" . $building . "</option>".PHP_EOL; } $buildingHTML .= '</select>'; $roomHTML = ""; $roomHTML .= '<select name="rooms" id="roomsDrop">'.PHP_EOL; $roomHTML .= '<option value="">Please Select</option>'.PHP_EOL; foreach ($buildings[0]['Rooms'] as $roomId => $roomData) { $roomHTML .= "<option value='".$roomId."'>" . $roomId . "</option>".PHP_EOL; } $roomHTML .= '</select>';
Как я могу заставить раскрывающиеся меню работать, чтобы отобразить список зданий для одного раскрывающегося меню, а во втором выпадающем списке отобразится список комнат, принадлежащих выбранному зданию, из первого выпадающего меню. На данный момент в этом коде отображаются два раскрывающихся меню, в которых есть только опция «Пожалуйста, выберите».
Вам нужно сделать намного больше, чтобы заставить это работать, как вы сказали (т. Е. Когда вы выбираете одно здание, вы можете выбрать комнаты для этого здания). Трудность заключается в том, что PHP не знает о том, что вы выбрали на странице, когда она отображает контент.
Вы можете, конечно, получить второй выпадающий список, чтобы отображать комнаты из определенного здания:
На этой строке:
$buildings[$sqlrow['Building']]['Rooms'][] = $sqlrow['Room'];
Вы устанавливаете индекс в «Building», а не 0. По этой причине $buildings[0]...
, как говорит ошибка, не определено. Если вы измените foreach на:
foreach ($buildings[<building name goes here>]['Rooms'] as $roomId => $roomData) { $roomHTML .= "<option value='".$roomId."'>" . $roomId . "</option>".PHP_EOL; }
Должно сработать.
Тем не менее, чтобы страница обновила второе раскрывающееся меню после первого изменения, вам нужно либо использовать AJAX, либо сделать первый раскрывающийся столбец ответом на страницу со значением, возможно, что-то просто:
$buildingname = $_POST['buildings']; foreach ($buildings[$buildingname]['Rooms'] as $roomId => $roomData) { $roomHTML .= "<option value='".$roomId."'>" . $roomId . "</option>".PHP_EOL; }
Затем вам нужно добавить кнопку отправки, чтобы отправить первый выбор или, возможно, некоторый javascript для отправки формы при изменении выбранного элемента –
$buildingHTML .= '<select name="buildings" id="buildingssDrop" onchange="document.getElementById(\'dropDownForm\').submit()">'.PHP_EOL;
Затем вам необходимо обернуть первый выбор в тегах формы, с атрибутами в открывающем теге –
<form action="" method="post">
И, надеюсь, если вы пройдете весь этот довольно плохо объясненный код, у вас должно получиться что-то работающее!
(Полный код – непроверенный – в случае, если мое объяснение слишком сложно выполнить: http://pastebin.com/9UGx8nTX )
Надеемся, что это решение решит вашу проблему:
function simpleOptionBuilder($description) { return sprintf('<option>%s</option>'$description); } // ... some other code here $sql="SELECT Building, Room FROM Room WHERE Building = '".$building."'"; $sqlresult = mysql_query($sql); $buildings = array(); // easier if you don't use generic names for data while($sqlrow = mysql_fetch_array($sqlresult)) { // you need to initialise your building array cells if (!isset($buildings[$sqlrow['Building']])) { $buildings[$sqlrow['Building']] = array('Rooms' => array()); } // you can add the room to the building 'Rooms' array $buildings[$sqlrow['Building']]['Rooms'][] = $sqlrow['Room']; } $buildingHTML = ""; $buildingHTML .= '<select name="buildings" id="buildingssDrop">'.PHP_EOL; $buildingHTML .= '<option value="">Please Select</option>'.PHP_EOL; join(PHP_EOL, array_map('simpleOptionBuilder', array_keys($buildings)); $buildingHTML .= '</select>'; $roomHTML = ""; $roomHTML .= '<select name="rooms" id="roomsDrop">'.PHP_EOL; $roomHTML .= '<option value="">Please Select</option>'.PHP_EOL; $firstRow = reset($buildings); join(PHP_EOL, array_map('simpleOptionBuilder', $firstRow['Rooms']); $roomHTML .= '</select>';
Я инкапсулировал форматируемый параметр в функцию и осконтивенно удалил атрибут value тега опции. Вам это не нужно, поскольку значение и описание одинаковы.
Для первого выбора вам нужны имена зданий, и я думаю, что вы можете использовать средства array_keys для использования этого.
Второй выбор должен быть содержимым, если я прав, помещения, принадлежащие зданию, выбранному в первый.
Если вам нужна первая строка массива хэшей, вы можете использовать функцию сброса, и я закодировал это решение. Однако есть проблема.
Если первый выбор показывает параметр « Выбрать», второй выбор должен быть пустым. Вам нужно восстановить выбранную опцию из массивов $ _GET, $ _POST или $ _REQUEST и использовать это значение для заполнения второго сообщения. Вы можете изменить код соответствующим образом.
// similar code above $selectedBuilding = $_REQUEST['buildings']; if (isset($buildings[$selectedBuilding]) { join(PHP_EOL, array_map('simpleOptionBuilder', $buildings[$selectedBuilding]['Rooms'] ) ); } $roomHTML .= '</select>';
EDIT: дальнейшая инкапсуляция
function simpleSelectBuilder($id, $name, $default, $optionArray) { $result = '<select name="' . $name . '" id="'. $id .'">'.PHP_EOL . '<option value="">Please Select</option>'.PHP_EOL . join(PHP_EOL, array_map( 'simpleOptionBuilder', $optionArray, array_fill(0,count($optionArray), $default)) ) . '</select>'; } function simpleOptionBuilder($description, $selectThisValue) { $selectedAttribute = $value==$selectThisValue?'selected':''; return sprintf('<option %s>%s</option>', $selectedAttribute, $description); } function param($name) { if (isset($_REQUEST[$name])) { return $_REQUEST[$name]; } return null; } // ... some other code here $sql="SELECT Building, Room FROM Room WHERE Building = '".$building."'"; $sqlresult = mysql_query($sql); $buildings = array(); // easier if you don't use generic names for data while($sqlrow = mysql_fetch_array($sqlresult)) { // you need to initialise your building array cells if (!isset($buildings[$sqlrow['Building']])) { $buildings[$sqlrow['Building']] = array('Rooms' => array()); } // you can add the room to the building 'Rooms' array $buildings[$sqlrow['Building']]['Rooms'][] = $sqlrow['Room']; } $selectedBuilding = param('buildings'); // TODO: sanity check $selectedRoom = param('rooms'); // TODO: sanity check $buildingHTML = simpleSelectBuilder( 'buildingssDrop', 'buildings', $selectedBuilding, array_keys($building) ); $roomHTML = simpleSelectBuilder( 'roomsDrop', 'rooms', $selectedRoom, $buildings[$selectedBuilding]['Rooms'] );
Теперь проблема должна быть более четкой: получить исходные данные и соответственно обновить выбор. Вы можете добавить запрос на отправку к первому select onchange event (более простое решение) или развернуть полное решение ajax, но для меня это не относится к вопросу.