Неопределенное значение в раскрывающемся списке AJAX - PullRequest
0 голосов
/ 07 мая 2019

Второй выпадающий список должен быть заполнен на основе выбора в первом раскрывающемся списке, но я получаю значение "undefined" во втором раскрывающемся списке.Данные извлекаются из SQL Server.Просматривая инструменты разработчика Google, я вижу, что когда я щелкаю по некоторому элементу в первом выпадающем списке, ajaxfile.php правильно выполняет запрос.

INDEX.PHP

    <!doctype html>
  <?PHP
$server = "server";
$options = array(  "UID" => "user",  "PWD" => "pass",  "Database" => 
"database");
$conn2 = sqlsrv_connect($server, $options);
if ($conn2 === false) die("<pre>".print_r(sqlsrv_errors(), true));
echo " ";
?>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<body>
            <section id="formaT2" class="formaT2 formContent">
            <div class="row">
                <div class="col-md-2 col-3 row-color remove-mob"></div>
                <div class="col-md-5 col-9 bg-img" style="padding-left: 0; 
padding-right: 0;">
                    <h1>Form</h1>
                    <div class="rest-text">
                       <div class="contactFrm">
                          <p class="statusMsg <?php echo 
!empty($msgClass)?$msgClass:''; ?>"><?php echo $statusMsg; ?></p>

                            <form action="connection.php" method="post">
                                <div>machinery</div>     
<select id="machinery">
<option value="0">--Please Select Machinery--</option>

<?php       
// Fetch Department
$sql = "SELECT Machinery FROM T013";
$machanery_data = sqlsrv_query($conn2,$sql);
while($row = sqlsrv_fetch_array($machanery_data) ){
  $machinery = $row['Machinery'];

  // Option
  echo "<option value='".$machinery."' >".$machinery."</option>";
 }
 ?>
</div>


</select>
    <div class="clear"></div>
                <div>Sub Machinery</div>
                <select id="sub_machinery">
       <option value="0">- Select -</option>
    </select>

                                <input type="submit" name="submit" 
id="submit" class="strelka-send" value="Insert">
                                <div class="clear"> </div>
                            </form>
                        </div> 
                    </div>
                </div>
            </div> 
        </section>
        </script>
      <script type="text/javascript">
      $(document).ready(function(){

    $("#machinery").change(function(){
        var machinery_id = $(this).val();

        $.ajax({
            url:'ajaxfile.php',
            type: 'post',
            data: {machinery:machinery_id},
            dataType: 'json',
            success:function(response){

                var len = response.length;

                $("#sub_machinery").empty();
                for( var i = 0; i<len; i++){
                    var machinery_id = response[i]['machinery_id'];
                    var machinery = response[i]['machinery'];

                    $("#sub_machinery").append("<option 
value='"+machinery_id+"'>"+machinery+"</option>");

                }
            }
        });
    });

});
      </script>
</body>
</html>

AJAXFILE.PHP

<?php
    $server = "server";
    $options = array(  "UID" => "user",  "PWD" => "pass",  
    "Database" => "database");
    $conn2 = sqlsrv_connect($server, $options);
    if ($conn2 === false) die("<pre>".print_r(sqlsrv_errors(), true));
    echo " ";

        $machineryID = $_POST['machinery'];   // department id
$sql = "SELECT MachineID FROM T013 WHERE Machinery='$machineryID'";
$result = sqlsrv_query($conn2,$sql);

$machinery_arr = array();

while( $row = sqlsrv_fetch_array($result) ){
    $machinery = $row['MachineID'];

    $machinery_arr[] = array("MachineID" => $machinery);
}

// encoding array to json format
echo json_encode($machinery_arr);
?>

1 Ответ

1 голос
/ 07 мая 2019

Проблема, я думаю, была вызвана используемыми соглашениями об именах. В коде PHP в ajaxfile выходной массив добавляет новый массив для каждого результата - ключ к нему называется MachineID, но в функции обратного вызова ajax вы пытаетесь назначить machinery_id и machinery для вновь сгенерированного элементы option.

Я бы посоветовал упростить имена - сделать их четкими и легко определить, кем они могут быть. Я переписал вышеупомянутое как это - хотя конечно это не проверено:

Обычно я бы рекомендовал использовать prepared statements, так как вышеприведенный код потенциально уязвим для внедрения SQL, но я не знаю, какова поддержка подготовленных операторов с SQL Server и PHP. Если они есть в наличии - используйте их!

<script>
    $(document).ready(function(){
        $("#machinery").change(function(){
            $.ajax({
                url:'ajaxfile.php',
                type:'post',
                data:{ machinery:$(this).val()},
                dataType:'json',
                success:function(response){
                    $("#sub_machinery").empty();

                    for( let n in response ){
                        let obj=response[n];
                        $("#sub_machinery").append( new Option( obj.id, obj.id ) );
                    }
                }
            });
        });

    });
</script>

ajaxfile.php

<?php

    $server = 'server';
    $options = array( 
        'UID'       => 'user',
        'PWD'       => 'pass',
        'Database'  => 'database'
    );
    $conn2 = sqlsrv_connect($server, $options);

    if ( $conn2 === false ) die("<pre>".print_r(sqlsrv_errors(), true));


    $id = $_POST['machinery'];
    $sql = "SELECT `MachineID` FROM `T013` WHERE `Machinery`='$id'";
    $result = sqlsrv_query($conn2,$sql);

    $output=array();

    while( $row = sqlsrv_fetch_array( $result ) ){
        $output[] = array( 'id' => $row['MachineID'] );
    }


    header('Content-Type: application/json');
    exit( json_encode( $output ) );
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...