У меня есть раскрывающийся список «#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) не отображаются какие-либо параметры, когда это необходимо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Циклу 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.
Мнение: я считаю, что dogpile и curly-brace-hell менее читабельны, чем извлечение переменных с помощью конкатенации (поэтому переменные затем цветовой код вне строк). Ооочень "немного удобнее читать" в глазах программиста :)
Извините, я пропустил проблему с массивом $options в первый раз
@RiggsFolly Я все еще не получаю ответа от сценария. Я выполнил запрос в рабочей среде mysql, и он отображает то, что я ищу. Я также проверил значение того, что передается в ft-customerpo.php, и оно верное.
Вы проверяете ответ сервера с помощью отладчика javascript в браузерах?
@RiggsFolly Я использую "XHR and Fetch" на вкладке сети в Google Chrome
Попробуйте F12, он загружает новые окна с отладчиком, в котором вы можете устанавливать точки останова и т. д. Установите точку останова в строке $('#vendponum').html(html);, и вы сможете проверить содержимое переменной html.
На стороне 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 согласен, внес изменения
@rkj, когда я пробую это, консоль выводит Uncaught SyntaxError: Unexpected identifier на new-vendor-po.php
он сказал какой-либо номер строки в php?
Я обновил код js, вы получали projectnoid в $_POST['projectnoid'] на php, но отправляли project. Я внес изменения, проверьте это
я тоже внес изменения в раздел php, просто проверьте это
@rkj говорит, что проблема связана с success:function(data){ 'Unexpected Identifier'
@rkj это была запятая после dataType: 'json'. Спасибо за помощь :)
Я действительно не понимаю, что нужно помещать HTML в объект JSON, а затем снова вынимать его. Браузер может просто получить HTML как одну строку и добавить все сразу, работа выполнена (см. Мой ответ: stackoverflow.com/a/51195301/5947043). Браузеры уже знают, как работать с HTML, нет необходимости заключать его в объект, как если бы это были необработанные данные.
Почему вы генерируете 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);
}
});
}
});
});
У меня сейчас статус 200, но ответа все еще нет. Значит ли это, что проблема, скорее всего, в запросе?