html-тег выбора опции в php (база данных Oracle)

#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’]. Возможно, это неправильно введенное имя поля формы…