【问题标题】:Undefined value in AJAX populated dropdownAJAX 填充下拉列表中的未定义值
【发布时间】:2019-05-07 07:49:46
【问题描述】:

第二个下拉列表应根据第一个下拉列表中的选择填充,但我在第二个下拉列表中得到值“未定义”。从 SQL Server 获取数据。查看 Google 开发工具,我可以看到,当我单击第一个下拉列表中的某个项目时,ajaxfile.php 会正确执行查询。

索引.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);
?>

【问题讨论】:

    标签: php sql-server ajax


    【解决方案1】:

    我认为这个问题是由使用的命名约定引起的。在ajaxfile 中的 PHP 代码中,输出数组为每个结果添加了一个新数组 - 其键名为 MachineID 但在 ajax 回调函数中,您尝试将 machinery_idmachinery 分配给新生成的选项元素。

    我的建议是简化名称 - 使它们与众不同且易于识别它们可能是什么。我像这样重写了上面的内容 - 虽然它当然是未经测试的:

    通常我建议你应该使用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 ) );
    ?>
    

    【讨论】:

    • 使用此代码,当我在第一个下拉列表中选择一个项目时出现错误:警告:sqlsrv_fetch_array() 期望参数 1 是资源,在 C:\wamp64\www\site\ajaxfile 中给出的布尔值。 php 在第 14 行。这是这一行: while( $row = sqlsrv_fetch_array( $result ) ){ $output[] = array( 'id' => $row['MachineID'] ); }
    • 编辑。我从 SELECT、FROM、WHERE 中删除了省略号。现在可以了!谢谢:)
    • :-) 很高兴它有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2011-07-17
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多