#php #html #oracle
#php #HTML #Oracle
Вопрос:
У меня проблема с тем, чтобы сделать тег select в php-коде динамичным. Я создаю веб-сайт (домашнее задание) с использованием php и подключаюсь к базе данных Oracle, в которой есть вся необходимая информация. У каждого agency
есть список vehicules
.
Я создал select option
тег для agencies
и для vehicules
. Я хочу, чтобы данные для транспортных средств менялись в зависимости от того, какое агентство выберет пользователь. Таким образом, если пользователь выбирает agency A
, транспортные средства, которые должны быть доступны в select option
теге для транспортных средств, должны принадлежать agency A1
и никакому другому агентству. Пока что у меня есть все транспортные средства всех агентств в select
теге.
Я попытался создать функцию, которая проверяет введенные пользователем данные и выбирает транспортное средство из агентства, которое выбрал пользователь. Затем он инициализирует $query
функцию in. А затем используйте этот запрос, чтобы заполнить мой select
тег. Вот код
function chooseVehicule(){
if( ($_POST['agence'])=='CARPORT'){
$query='SELECT marque, modele, nom_agence, num_immatriculation from vehicules v, agences ag
WHERE v.id_agence=ag.id_agence
AND ag.nom_agence=="CARPORT"';
}
}
затем
chooseVehicule();
Но это выдает мне Undefined index: agence
ошибку.
Пожалуйста, есть идеи? Вот мой полный код.
<?php
function chooseVehicule(){
if( ($_POST['agence'])=='CARPORT'){
$query='SELECT v.marque, modele, ag.nom_agence, v.num_immatriculation from vehicules v, agences ag
WHERE v.id_agence=ag.id_agence
AND ag.nom_agence=="CARPORT"';
}
}
echo '<h3>'; echo 'Pour la location d'une vehicule, veuillez remplir ce formulaire';echo'</h3>';
/*CLIENTS*/
$query="SELECT nom_client from CLIENTS";
$state=oci_parse($conn, $query);
oci_execute($state, OCI_COMMIT_ON_SUCCESS);
echo '
<form action="location.php" method="post">
<p><label for="client">Select your Name</label>
<select name="client" id="client">';
while(($row = oci_fetch_array($state, OCI_BOTH))){
echo'<option value="'.$row[0].'">'.$row[0]; echo'</option>';
}
echo'</select></p>';
echo '</form>';
/*AGENCES*/
$query="SELECT nom_agence from AGENCES";
$state=oci_parse($conn, $query);
oci_execute($state, OCI_COMMIT_ON_SUCCESS);
echo '
<form action="location.php" method="post">
<p><label for="agence">Select a Company</label>
<select name="agence" id="agence">';
while(($row = oci_fetch_array($state, OCI_BOTH))){
echo '<option value="'.$row[0].'">'.$row[0]; echo'</option>';
}
echo '</select></p>';
echo '</form>';
/*VEHICULES*/
$query="SELECT marque, modele, nom_agence, num_immatriculation from vehicules v, agences ag
WHERE v.id_agence=ag.id_agence
AND type_vehicule='UTILITAIRE'
order by nom_agence";
$state=oci_parse($conn, $query);
oci_execute($state, OCI_COMMIT_ON_SUCCESS);
echo '
<form action="location.php" method="post">
<p><label for="vehicule">Select a Vehicule</label>
<select name="vehicule" id="vehicule">';
echo '<optgroup label="Utilitaire">';
while(($row = oci_fetch_array($state, OCI_BOTH))){
echo '<option value="'.$row[3].'">'.$row[2]. ' ' . $row[0] . ' ' . $row[1]; echo '</option>';
}
echo '</optgroup>';
$query="SELECT v.marque, v.modele, ag.nom_agence, v.num_immatriculation from vehicules v, agences ag
WHERE v.id_agence=ag.id_agence
AND type_vehicule='VOITURE'
order by nom_agence";
echo '<optgroup label="Voiture">';
$state=oci_parse($conn, $query);
oci_execute($state, OCI_COMMIT_ON_SUCCESS);
while(($row = oci_fetch_array($state, OCI_BOTH))){
echo '<option value="'.$row[3].'">'.$row[2]. ' ' . $row[0] . ' ' . $row[1]; echo '</option>';
}
echo '</optgroup>';
echo'</select></p>';
echo '</form>';
oci_free_statement($state);
oci_close($conn);
?>
Я не использовал функцию chooseVehicule
, поскольку она выдает мне ошибку.
Спасибо.
Ответ №1:
Ключи в $_POST
суперглобальном файле будут отправлены на сервер с теми же именами, что и поля формы. Если эта форма отправляется самой себе, вам нужно будет отправить поле с именем agence
, чтобы избежать этой ошибки. PHP выдает ошибку, потому что в agence
массиве $_POST
нет ключа.
Чтобы обойти эту проверку, поскольку на этой странице обрабатывается множество форм, вы можете сначала установить каждый ключ, прежде чем выполнять проверку по нему:
if( isset($_POST['agence']) amp;amp; $_POST['agence'])=='CARPORT'){
$query='SELECT marque, modele, nom_agence, num_immatriculation from vehicules v, agences ag
WHERE v.id_agence=ag.id_agence
AND ag.nom_agence=="CARPORT"';
}
Вы должны сделать это для всех форм, которые отправляются выборочно.
Редактировать:
Вам нужно будет поместить на страницу некоторое состояние, «state» в смысле того, как далеко пользователь продвинулся в процессе выбора. Давайте сделаем так, чтобы форма для транспортных средств отображалась только в том случае, если пользователь уже выбрал агентство. Эта форма должна быть заключена в условное.
оберните всю логику для формы транспортных средств в это условное:
if(isset($_POST['agence'])){
$query="SELECT nom_agence from AGENCES";
$state=oci_parse($conn, $query);
oci_execute($state, OCI_COMMIT_ON_SUCCESS);
echo '
<form action="location.php" method="post">
<p><label for="agence">Select a Company</label>
<select name="agence" id="agence">';
while(($row = oci_fetch_array($state, OCI_BOTH))){
echo '<option value="'.$row[0].'">'.$row[0]; echo'</option>';
}
echo '</select></p>';
echo '</form>';
}
Поскольку эта страница является процедурной, это сделает так, что после того, как будет сделан выбор для агентства, тогда и только тогда появится форма транспортного средства.
Нам нужно будет сделать так, чтобы запрос для транспортных средств содержал предложение WHERE, которое отражает выбор, сделанный пользователем. Похоже, что вы объединяетесь по идентификатору в двух таблицах, поэтому в предложении where потребуется либо выполнить поиск по идентификатору агентства, либо по названию агентства, в зависимости от структуры базы данных.
Если форма транспортного средства задана в условном виде, подобном этому, мы можем быть уверены, что пользователь уже сделал выбор агентства и перешел ко второму «состоянию» формы. Затем вам нужно будет параметризовать свой оператор sql и передать выбранный идентификатор.
Комментарии:
1. Да, страница публикуется сама по себе (это та же страница). Я не понимаю, что вы имеете в виду под
change the select name attr from client to agence
2. @mkab — Отредактировано, я не заметил, что у вас было несколько разных элементов формы.
3. Спасибо. Забыл об использовании
isset
. Позвольте мне попробовать это, и я вернусь к вам. Редактировать: я думаю, что есть проблема со скобками после$_POST['agence']
4. По-прежнему не работает. У меня больше нет ошибки, но
select
тег работает не так, как я хочу.5. Не могли бы вы немного подробнее описать, что вы хотите, чтобы делал тег выбора? Просто предположу, я предполагаю, что вы хотите, чтобы он выбирал значение по умолчанию на основе первой отправки. В этом случае вам пришлось бы сравнить значения вашего запроса с теми, что находятся в цикле, и повторить ‘selected’ для правильного.
Ответ №2:
По какой-то причине для этого не задано значение $_POST[‘agence’]. Если вы выполните isset($_POST[‘agence’]), он вернет false.
Комментарии:
1. Да, он возвращает false и
$query
не был инициализирован. У вас есть какие-нибудь идеи?2. $_POST[‘agence’] необходимо установить в каком-либо месте вашего кода; прежде всего, проверьте с помощью isset и избегайте, если возвращает false; и узнайте, где находится значение, которое вам нужно приписать в $ _POST [‘agence’]. Возможно, это неправильно введенное имя поля формы…