php ajax依赖下拉列表不从表中加载数据

Posted

技术标签:

【中文标题】php ajax依赖下拉列表不从表中加载数据【英文标题】:php ajax dependent dropdown not loading data from table 【发布时间】:2021-03-30 11:59:09 【问题描述】:

我正在尝试使用 php 和 ajax 创建一个依赖下拉列表。我期待的是选择汽车的“制作”,相关的汽车模型应该自动加载“模型”下拉列表。我已经完成了汽车“制造”的预加载。但“模型”下拉菜单仍然为空。我使用了一个故事并在 sql 语句中使用(选择模型,其中 make= 选择制作)。这是我的代码

php

<form method="GET">
                            <div class="form-group">
                                <select class="form-control" name="make" id="make">
                                    <option value="" disabled selected>--Select Make--</option>
                                        <?php
                                            $stmt=$pdo->query("SELECT DISTINCT make FROM cars  WHERE cartype='general' ");
                                        while($row=$stmt->fetch(PDO::FETCH_ASSOC))
                                        ?>
                                        <option value="<?= $row['make']; ?>"> <?= $row['make']; ?></option>
                                        
                                        <?php   ?>
                                </select>
                            </div>
                            <div class="form-group">
                                <select class="form-control" name="model" id="model">
                                    <option value="" disabled selected>--Select Model--</option>
                                </select>
                            </div>
.......
....
.....

脚本

<script type="text/javascript">
        $(document).ready( function () 
           // alert("Hello");
        $(#make).change(function()
            var make = $(this).val();
            $.ajax(
                url:"filter_action.php",
                method:"POST",
                data:Make:make,
                success: function(data)
                    $("#model").html(data);
            );
        );
    );
    
</script>

filter_action.php

<?php 
    include('db_config2.php');
    $output='';
    $stmt=$pdo->query("SELECT DISTINCT model FROM cars  WHERE cartype='general' AND make= '".$_POST['Make']."'");
    $output .='<option value="" disabled selected>--Select Model--</option>';
        while($row=$stmt->fetch(PDO::FETCH_ASSOC))
            $output .='<option value="'.$row["model"].'">'.$row["model"].'</option>'    ;
        
        echo $output;

?>

【问题讨论】:

$(#make) 应该用引号括起来,即 :$("#make") 。另外,检查浏览器控制台是否还有其他错误? 您通过直接嵌入用户提供的输入数据使您的 SQL 容易受到注入攻击 @Swati 谢谢。是的,我已将其更改为 $("#make") 但结果仍然相同 你得到了什么结果?? @KUMAR 不,“make”下拉菜单正在工作,但“model”下拉菜单仍然为空 【参考方案1】:

Javascript 中似乎存在一些错误,这些错误在开发人员控制台中很明显,并且您的 PHP 使 mysql 服务器容易受到 sql 注入攻击。

<script>
    $(document).ready( function () 
    
        // The string should be within quotes here
        $('#make').change(function(e)
            var make = $(this).val();
            
            $.ajax(
                url:"filter_action.php",
                method:"POST",
                data:'Make':make,
                success: function(data)
                    $("#model").html(data);
                ;//this needed to be closed
            );
        );
    );
</script>

在 sql 中直接使用用户提供的数据会打开您的 db to sql 注入攻击。为了缓解这种情况,您需要采用"Prepared Statements" - 因为无论如何您都在使用 PDO,这应该是理所当然的事情。

<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_POST['Make'] ) )
    
        # The placeholders and associated values to be used when executing the sql cmd
        $args=array(
            ':type'     =>  'general',  # this could also be dynamic!
            ':make'     =>  $_POST['Make']
        );
        # Prepare the sql with suitable placeholders
        $sql='select distinct `model` from `cars`  where `cartype`=:type and `make`=:make';
        $stmt=$pdo->prepare( $sql );
        
        # commit the query
        $stmt->execute( $args );
        
        # Fetch the results and populate output variable
        $data=array('<option disabled selected hidden>--Select Model--');
        while( $rs=$stmt->fetch(PDO::FETCH_OBJ) )$data[]=sprintf('<option value="%1$s">%1$s', $rs->model );
        
        # send it to ajax callback
        exit( implode( PHP_EOL,$data ) );
    
?>

【讨论】:

非常感谢您的时间和帮助。不幸的是,它没有用。感谢您为防止 sql 注入而准备的 stmt 的建议。基本上我复制了你的代码,但仍然没有结果。 你能打开开发控制台并报告观察到的任何错误吗? 我不确定你是否愿意。我在 cpanel 上编码,而不是在本地服务器上。 ? NFI - 从未见过 cPanel。只是想知道是否有任何js错误【参考方案2】:

我已经尝试使用php pdo

首先我创建了 3 个文件。

    db.php

    htmlDropdown.php

    modelAjax.php

这里,db.php 文件可以包含我的数据库连接代码。和htmlDropdown.php 文件包含我的汽车和模型下拉列表。和modelAjax.php 文件包含用于获取所有模型的ajax。

db.php

<?php

$host_name = 'localhost';
$user_name = 'root';
$password = '';
$db_name = '***';

$conn = new PDO("mysql:host=$host_name; dbname=$db_name;", $user_name, $password);

?>

htmlDropdown.php

<?php include "db.php"; ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cars</title>
    <!-- jQuery cdn link -->
    <script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
    <!-- Ajax cdn link -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxy/1.6.1/scripts/jquery.ajaxy.min.js" integrity="sha512-bztGAvCE/3+a1Oh0gUro7BHukf6v7zpzrAb3ReWAVrt+bVNNphcl2tDTKCBr5zk7iEDmQ2Bv401fX3jeVXGIcA==" crossorigin="anonymous"></script>
</head>
<body>
    <?php
        $car_sql = 'SELECT car_name FROM cars';  //select all cars query
        $cars_statement = $conn->prepare($car_sql);
        $cars_statement->execute();
    ?>
    <select name="car" id="car">
        <option value="">Cars</option>
        <?php
            while ($cars = $cars_statement->fetch())  // fetch all cars data
            ?>
                <option value="<?php echo $cars['car_name']; ?>"><?php echo $cars['car_name']; ?></option>
            <?php
            
        ?>
    </select><br><br>

    <select name="model" id="model">
        <option value="">Model</option>
    </select>
</body>
</html>
<script>

    $(document).ready(function () 

        $('#car').on("change", function () 

            let car = $(this).val(); // car value

            $.post("http://local.***answer1/cars/modelAjax.php",  car_name : car , function (data, status)  // ajax post send car name in modelAjax.php file
                
                let datas = JSON.parse(data); // convert string to json object

                let options = '';

                options = '<option>Model</option>';

                $.each(datas.model, function (key, value) 
                    options += "<option>"+value.modal_name+"</option>";
                );

                $('#model').html(options);

            );
        );
    );
</script>

modelAjax.php

<?php

include "db.php";

if ($_POST['car_name']) 

    $car_id_sql = "SELECT id FROM cars WHERE car_name LIKE ?"; // get id from given car name
    $id_statement = $conn->prepare($car_id_sql);
    $id_statement->execute([$_POST['car_name']]);

    $id = $id_statement->fetch();

    $model_sql = "SELECT modal_name FROM models WHERE car_id = ?"; // get model name from given id
    $model_statement = $conn->prepare($model_sql);
    $model_statement->execute([$id['id']]);

    $models = $model_statement->fetchAll();

    echo json_encode(["model" => $models]); // i have a conver array to json object


?>

【讨论】:

非常感谢。我非常感谢您的时间和精力。我需要的是将品牌和模型保持在同一个表中,并使用“make”而不是“id”。类似的东西(从制造=选定制造的汽车中选择模型)。你能帮忙吗?

以上是关于php ajax依赖下拉列表不从表中加载数据的主要内容,如果未能解决你的问题,请参考以下文章

无法在angularjs中加载下拉列表的ng-model

为啥在下拉列表中加载组件时不会触发 ngmodelChange 事件?

如何根据Angular 6同一行中的其他单元格值在AG-Grid选择下拉列表中加载不同的选项?

填充下拉列表 - PHP Ajax MySQL

在 mvc 中加载 2 个下拉列表的更好方法

onclick 使用 ajax laravel 从数据库中获取数据