Получить данные JSON из серверного скрипта PHP и отобразить в раскрывающемся списке

У меня есть раскрывающийся список «#pro», который при выборе отправит номер моему php-скрипту «ft-customerpo.php». Этот php-скрипт должен возвращать записи, соответствующие этому номеру проекта, и отображать результаты в другом раскрывающемся списке с именем "#custponumhold".

Мой HTML:

<label for = "txtfield">Project Number <b style = "color:red;">*</b></label>
<select id = "pro" name = "projectnoid"  class = "inputvalues" required/>
   <option disabled selected value>-- Project Number</option>
   <?php echo $options_1; ?>
</select><br>

<label>Customer PO Number <b style = "color:red;">*</b></label>
<select id = "custponumhold" style = "width: 250px;" name = "custpo" class = "inputvalues" required>

</select>

Мой Javascript:

//CHAINED COMBOBOX
$(document).ready(function() {
  $('#pro').on('change', function() {
    var project = $(this).val();
    if (project) {
      $.ajax({
        type: 'POST',
        url: 'ft-customerpo.php',
        data: 'project=' + project,
        success: function(html) {
          $('#vendponum').html(html);
        }
      });
    }
  });
});

И "ft-customerpo.php"

<?php
require "../inc/dbinfo.inc";

$i=1;
$proj = mysqli_real_escape_string($_POST['projectnoid']);

if ($proj)
{
    $rs = $conn->query("SELECT PONumber 
                        FROM tblCustomerPOs 
                        WHERE ProjectNum = '$proj'");

    $options[0] = "<option disabled selected value>-- Customer PO</option>";

   while($row[$i] = $rs->fetch_assoc()) {
        $options .= "<option value='".$row['PONumber']."'>".$row['PONumber']." 
        </option>";
        $i++;
    }
    echo json_encode($options);
}
?>

В настоящее время, когда я меняю номер проекта, он отправляет запрос в порядке. Но я не получил ответа. Я думаю, проблема в моем "ft-customerpo.php". Извините, если моя логика не имеет смысла. В раскрывающемся списке Заказ клиента (#custponumhold) не отображаются какие-либо параметры, когда это необходимо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
569
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Циклу while не нужно использовать $row[$i], и когда вы это делаете, вы не используете его позже в цикле. $row будет перезагружаться с текущей строкой результатов каждый раз в цикле, поэтому массив не требуется.

Этого цикла должно хватить

$options = "<option disabled selected value = "">-- Customer PO</option>";

while($row = $rs->fetch_assoc()) {
//        ^^ changed here
    $options .= "<option value='".$row['PONumber']."'>".$row['PONumber']." 
    </option>";
}

Вы также можете сделать свой код немного более читаемым и, следовательно, поддерживать, удалив некоторые из таких конкатенаций

while($row = $rs->fetch_assoc()) {
    $options .= "<option value='$row[PONumber]'>$row[PONumber]</option>";
}

Или вот так

while($row = $rs->fetch_assoc()) {
    $options .= "<option value='{$row['PONumber']}'>{$row['PONumber']}</option>";
}

Тогда вы можете заменить

echo json_encode($options);

с простым

echo $options;

И он должен соответствовать тому, что вы делаете в javascript.

У меня сейчас статус 200, но ответа все еще нет. Значит ли это, что проблема, скорее всего, в запросе?

David 05.07.2018 17:35

Мнение: я считаю, что dogpile и curly-brace-hell менее читабельны, чем извлечение переменных с помощью конкатенации (поэтому переменные затем цветовой код вне строк). Ооочень "немного удобнее читать" в глазах программиста :)

IncredibleHat 05.07.2018 17:36

Извините, я пропустил проблему с массивом $options в первый раз

RiggsFolly 05.07.2018 17:42

@RiggsFolly Я все еще не получаю ответа от сценария. Я выполнил запрос в рабочей среде mysql, и он отображает то, что я ищу. Я также проверил значение того, что передается в ft-customerpo.php, и оно верное.

David 05.07.2018 18:34

Вы проверяете ответ сервера с помощью отладчика javascript в браузерах?

RiggsFolly 05.07.2018 18:41

@RiggsFolly Я использую "XHR and Fetch" на вкладке сети в Google Chrome

David 05.07.2018 18:47

Попробуйте F12, он загружает новые окна с отладчиком, в котором вы можете устанавливать точки останова и т. д. Установите точку останова в строке $('#vendponum').html(html);, и вы сможете проверить содержимое переменной html.

RiggsFolly 05.07.2018 18:51
Ответ принят как подходящий

На стороне PHP вы должны сделать такие изменения, сначала вы создаете массив options, но после этого вы добавили его как строку

<?php
require "../inc/dbinfo.inc";

$proj = mysqli_real_escape_string($_POST['projectnoid']);

if ($proj)
{
    $rs = $conn->query("SELECT PONumber 
                        FROM tblCustomerPOs 
                        WHERE ProjectNum = '$proj'");

    $options = [];
    $options[0] = "<option disabled selected value>-- Customer PO</option>";

    while($row = $rs->fetch_assoc()) {
        $options[] = "<option value='".$row['PONumber']."'>".$row['PONumber']."</option>";
    }
    echo json_encode($options);
}
?>

Сторона Javascript

$(document).ready(function(){
  $('#pro').on('change',function(){
      var project = $(this).val();
      if (project){
          $.ajax({
              type:'POST',
              url:'ft-customerpo.php',
              data: {projectnoid: project },
              dataType:'json',
              success: function(data) {
                  $('#custponumhold').empty();
                  for(let i = 0; i < data.length; i++){
                     $('#custponumhold').append(data[i]);
                  }
              }             
          });
        }
  });
});

Интересное изменение направления с обработкой json. Если это ему выгодно, это тоже сработает.

IncredibleHat 05.07.2018 17:42

@IncredibleHat согласен, внес изменения

rkj 05.07.2018 17:44

@rkj, когда я пробую это, консоль выводит Uncaught SyntaxError: Unexpected identifier на new-vendor-po.php

David 05.07.2018 18:23

он сказал какой-либо номер строки в php?

rkj 05.07.2018 19:01

Я обновил код js, вы получали projectnoid в $_POST['projectnoid'] на php, но отправляли project. Я внес изменения, проверьте это

rkj 05.07.2018 19:09

я тоже внес изменения в раздел php, просто проверьте это

rkj 05.07.2018 19:15

@rkj говорит, что проблема связана с success:function(data){ 'Unexpected Identifier'

David 05.07.2018 19:30

@rkj это была запятая после dataType: 'json'. Спасибо за помощь :)

David 05.07.2018 19:38

Я действительно не понимаю, что нужно помещать HTML в объект JSON, а затем снова вынимать его. Браузер может просто получить HTML как одну строку и добавить все сразу, работа выполнена (см. Мой ответ: stackoverflow.com/a/51195301/5947043). Браузеры уже знают, как работать с HTML, нет необходимости заключать его в объект, как если бы это были необработанные данные.

ADyson 09.07.2018 11:49

Почему вы генерируете HTML, а затем кодируете его как JSON, а затем на стороне клиента снова обрабатываете его как HTML (без учета того факта, что вы его закодировали как JSON)?

Вместо этого просто откажитесь от json_encode и echo $options.

Если вы собираетесь вернуть HTML, верните HTML. HTML - это готовая разметка, JSON - для необработанных данных. Не объединяйте эти два понятия. Браузер может легко работать с HTML без дополнительных затрат на его перевод в формат обмена данными и последующий возврат.

Я также внес еще несколько необходимых корректировок:

PHP:

$i=1;
$proj = mysqli_real_escape_string($_POST['projectnoid']);

if ($proj)
{
    $rs = $conn->query("SELECT PONumber 
                        FROM tblCustomerPOs 
                        WHERE ProjectNum = '$proj'");

    $options = "<option disabled selected value>-- Customer PO</option>";

   while($row = $rs->fetch_assoc()) {
        $options .= "<option value='".$row['PONumber']."'>".$row['PONumber']."</option>";
    }
    echo $options;
}
?>

JS:

      $(document).ready(function(){
          $('#pro').on('change',function(){
              var project = $(this).val();
              if (project){
                  $.ajax({
                      type:'POST',
                      url:'ft-customerpo.php',
                      data: { "project": project },
                      success:function(html){
                          $('#custponumhold').html(html);
                      }
                  });
                }
          });
      });

Другие вопросы по теме