Ответ на запрос PHP для заполнения выпадающего списка HTML (цикл через 2D-массив)

#javascript #php #jquery #ajax #multidimensional-array

#javascript #php #jquery #ajax #многомерный массив

Вопрос:

Я получаю именно то, что мне нужно, из моего PHP-кода и запроса; за исключением того, что мне действительно сложно перенести эти данные во внешний интерфейс, чтобы заполнить выпадающий список HTML.

Вот что у меня есть на стороне PHP; все работает нормально

 $app->get('/dlteopt', function ($request, $response, $args) {   
        
    $which = $_GET['id'];


    if ($which) {

        if ($which == 'table_1'){
            $sql = "SELECT item1 FROM daya.blahblah";
        } else if ($which == 'table_2'){
            $sql = "SELECT item2 FROM daya.blahblah2";
        } else if ($which == 'table_3'){
            $sql = "SELECT item3 FROM daya.blahblah3"; 
        }

        $stid = oci_parse($this->db, $sql);        

        $list = array();

        while ($list = oci_fetch_array($stid, OCI_ASSOC)) {
            $list[] = $list;
            var_dump($list); // this outputs the correct array I need, but cant bring it to front correctly into dropdown
        }


        if (!@oci_execute($stid)) {
            $error = oci_error($stid);

            throw new Exception($error['message']);
        } 

        oci_execute($stid);

    }
  

Вот jQuery; журнал response консоли — это только переменная flag ( which ), которую я отправляю с get запросом, который определяет, какую таблицу запрашивать через пользовательский сценарий. нужный мне массив пропущен…

  let which = $(frm).attr("id");

    $.get('dlteopt', {id: which }, function (response) { 

       console.log(response); // this just consoles as the $which var no array

       $.each(response, function(index, value) {
         // started logic to append values in option; but no array or obj found/brought in to iterate through, can handle this part if can get array
       });

    });
  

выпадающий список html; просто стандартный HTML select с заполнителем, пока не будет заполнен:

 <select name='agent' id='agent'><option>Loading...</option></select>
  

что я здесь делаю не так?или отсутствует / забыл?


Обновление: я застрял на ошибке во внешнем интерфейсе, ниже приведены console.log(response) результаты, выполняемые в моем $.get . Данные в журнале ошибок верны; Я просто не могу получить к нему правильный доступ… Проблема с 2D-массивом?


 jquery.js:502 Uncaught TypeError: Cannot use 'in' operator to search for 

'length' in ......
    array(2) {
  ["OSF_ID"]=>
  string(8) "FAI-FSDO"
  [0]=>
  array(1) {
    ["OSF_ID"]=>
    string(8) "FAI-FSDO"
  }
}
array(2) {
  ["OSF_ID"]=>
  string(8) "SAC-FSDO"
  [0]=>
  array(1) {
    ["OSF_ID"]=>
    string(8) "SAC-FSDO"
  }
} ..... etc
  

Комментарии:

1. Пожалуйста, приведите пример полезной нагрузки ответа. Что отправляется обратно в запрос GET jQuery?

2. jQuery => php Я просто отправляю which var, который определяет, какую таблицу пинговать; параметры 1/3 таблицы

3. Да, я понимаю, что вы отправляете which переменную. Я спрашиваю о том, что вы видите response . Пожалуйста, используйте консоль и сетевую консоль для просмотра ответа и полезной нагрузки. Если вы не получили массив или объект, значит, что-то не так в вашем PHP.

4. Я подозреваю, что проблема в var_dump($list); том, что это предоставит текст, а не содержимое в формате JSON, которое может интерпретировать JS / jQuery.

5. var_dump() не предназначен для использования таким образом. Пожалуйста, посмотрите ответ, который я опубликовал.

Ответ №1:

Рассмотрим следующий PHP.

 public function process($which) {
  if(isset($which)){
    if ($which == 'a_table1'){
      $sql = "SELECT a_table1 FROM data.blah1";
    } else if ($which == 'a_table2'){
      $sql = "SELECT a_table2 FROM data.blah2";
    } else if ($which == 'a_table3'){
      $sql = "SELECT a_table3 FROM data.blah3"; 
    }
 
    $stid = oci_parse($this->db, $sql);
    oci_execute($stid); 
        
    if (!@oci_execute($stid)) {
      $error = oci_error($stid);
      throw new Exception($error['message']);
    }
 
    $myData = array();
    while ($list = oci_fetch_array($stid, OCI_ASSOC)) {
      array_push($myData, $list);
    }
 
    header('Content-Type: application/json');
    echo json_encode($myData);
 
  } else {
    header('Content-Type: application/json');
    echo json_encode(array("error" => "WHICH not assigned"));
  }
}
  

Затем это должно отправить обратно JSON-данные массива.

Пример

 [{
  "A_ID":"OJC-FCT"
},{
  "A_ID":"DAL-ATCT"
},{
  "A_ID":"AFF-MIL-TWR"
},{
  "A_ID":"CNO-ATCT"
},{
  "A_ID":"GSN-FCT"
},{
  "A_ID":"CGI-NFCT"
},{
  "A_ID":"NDZ-MIL-TWR"
},{
  "A_ID":"FCS-MIL-TWR"
},{ 
  "A_ID":"LAL-FCT"
},{
  "A_ID":"LNK-ATCT"
},{
  "A_ID":"CHD-FCT"
},{
  "A_ID":"FLG-FCT"
},{
  "A_ID":"MCN-FCT"
},{
  "A_ID":"SKA-MIL-TWR"
}];
  

Затем вы можете использовать это в каждом цикле для создания параметров.

 var which = $(frm).attr("id");
$.get('dlteopt', {id: which }, function (response) { 
  console.log(response);
  $("#agent").html("");
  $.each(response, function(index, value) {
    $("<option>").html(value['A_ID']).appendTo($("#agent"));
  });
});
  

Вы также можете упростить вывод PHP, чтобы это был просто результирующий массив элементов.

 $myData = array();
while ($list = oci_fetch_array($stid, OCI_ASSOC)) {
  array_push($myData, $list['A_ID']);
}
  

Тогда ваш цикл также будет упрощен.

 $("#agent").html("");
$.each(response, function(index, value) {
  $("<option>").html(value).appendTo($("#agent"));
});
  

Комментарии:

1. Спасибо.. итак, теперь он появляется с этим, моя переменная $which не публикуется.. так что, увы, он никогда не попадает в запрос.. какие консоли подходят прямо перед $.get на стороне jQuery … странно..

2. консоли на интерфейсе; но в PHP $который возвращается как ‘false’. т.е. $which = $_GET[‘id’]; var_dump($which);

3. @TerryHall что-то не имеет смысла. Можете ли вы вставить свой PHP-код и ссылку на него.

4. @TerryHall звучит так, как будто вы все еще выводите что-то другое, кроме JSON. Опять же, пожалуйста, скопируйте / вставьте свой PHP-код в PasteBin и включите его в свой ответ.

5. @TerryHall похоже, что результат лучше. Теперь вам просто нужно обновить свой цикл для обработки более сложных данных. Через мгновение у вас будет обновление.