【问题标题】:Javascript Ajax are not getting data in the dropdown Select tag in php (PDO)Javascript Ajax 未在 php (PDO) 中的下拉选择标记中获取数据
【发布时间】:2016-10-13 04:51:29
【问题描述】:

我的一个脚本有问题,我想在下拉选择标签上显示数据,但它们是我的 javascript 的问题,即使 alert() 没有响应也无法正常工作,可能是因为我编写的函数.顺便说一句,php数据很好,并且以数组格式从页面中获取输出

home.php

                                      <div class="form-group">
                    <span class="label label-default">Country</span>
                                    <select class="form-control"  id="country1">

                                    <div class="form-group">
                                    <span class="label label-default" >Province</span>
                                    <select class="form-control"id="province1">
                                                                            </select>
                                    </div>

现在是产生问题的 Javascript 代码

           <script type="text/javascript">
          function country() {
           $('#country1').empty();
          $('#country1').append("<option> Loading --- </option>");
           $('#province1').append("<option value='0'>--Select Province-- </option>");
            $.ajax({
            type:"POST",
           url:"country_dropdown.php",
            contentType:"application/json; charset=utf-8",
           datatype:"json",
          success: fuction(data) {
          $('#country1').empty();
          $('#country1').append("<option value='0'>-- Select Country---</option>");
         $.each(data,function(i,item){
           $('#country1').append('<option value="'+data[i].CountryID + '">'+ data[i].CountryName +'</option>');
            });
             },

         complete : function() {

            }
           });
             }
            $(document).ready(function(){

                country();

               });

             function province(id) {
               $('#province1').empty();
             $('#province1').append("<option> Loading --- </option>");
            $.ajax ({
            type:"POST",
              url:"province_dropdown.php?id"+id,
            contentType:"application/json"
            charset:"utf-8",
            dataType:"json",
             success: function(data){
              $('#province1').empty();
             $('#province1').append("<option value='0'> --Select Province-- </option>");
            $.each(data,function(i.item)
            $('#province1').append('<option value="'+data[i].ProvinceID+'">'+data[i].ProvinceName+'</option>');
             });
           complete: function() {

            }
             });

              }

             </script>

我的数据库连接似乎很好,因为两个文件都得到了结果 country_dropdown.php

                <?php
              include('config.php');
                include('class.user.php');
               try {
              $obj = new USER();
             $stmt = $obj->getCountry();
             echo "{";
             while($result=$stmt->fetch(PDO::FETCH_ASSOC)){
            echo '"'.$result['CountryID'].'":"'.$result['CountryName'].'",';
                }
          echo '"0":"Select Country"}';
            }
           catch(PDOException $e) {
            echo "Error: " . $e->getMessage();
            }
           $conn = null;
           header('Content-type: application/json');
           ?>

province_dropdown.php

                   <?php
                 include('config.php');
                  include('class.user.php');
                  try {
                $obj = new USER();
                 $stmt = $obj->getProvince();
                  echo "{";
                   while($result=$stmt->fetch(PDO::FETCH_ASSOC)){
               echo '"'.$result['ProvinceID'].'":"'.$result['ProvinceName'].'",';

                   }
                     echo '"0":"Select Province"}';
                   }
                catch(PDOException $e) {
                   echo "Error: " . $e->getMessage();
                  }
                 $conn = null;
                header('Content-type: application/json');
                ?>

class.user.php 文件,它具有查询数据的功能,它们也可以正常工作,但我认为它也应该考虑,因为任何可能的问题都可能从一开始就出现 class.user.php

          public function getCountry() {
         $stmt =$this->conn->prepare("SELECT * FROM country");
         $stmt->execute();
           return $stmt;
           }
          public function getProvince(){
            $stmt =$this->conn->prepare("SELECT * FROM province WHERE Country_CountryID='".$_GET["id"]."'");

            $stmt->execute();
              return $stmt;
              }

问题出在这里,因为这两个选择标签都无法获取值,因为国家值索引对应于省,因此省取决于国家

【问题讨论】:

    标签: javascript php jquery ajax pdo


    【解决方案1】:

    脚本中有一些错误,我无法使用 chrome 控制台测试 ajax 响应,我发现有问题。我已经尝试替换您的脚本,它不会在控制台中给出错误,希望对您有所帮助。

         function country() {
          $('#country1').empty();
          $('#country1').append("<option> Loading --- </option>");
          $('#province1').append("<option value='0'>--Select Province-- </option>");
          $.ajax({
              type: "POST",
              url: "country_dropdown.php",
              contentType: "application/json; charset=utf-8",
              datatype: "json",
              success: function(data) {
                  $('#country1').empty();
                  $('#country1').append("<option value='0'>-- Select Country---</option>");
                  $.each(data, function(i, item) {
                      $('#country1').append('<option value="' + data[i].CountryID + '">' + data[i].CountryName + '</option>');
                  });
              },
    
              complete: function() {
    
              }
          });
      };
    
      $(document).ready(function() {
    
          country();
    
      });
    
      function province(id) {
          $('#province1').empty();
          $('#province1').append("<option> Loading --- </option>");
          $.ajax({
                  type: "POST",
                  url: "province_dropdown.php?id=" + id,
                  contentType: "application/json"
                  charset: "utf-8",
                  dataType: "json",
                  success: function(data) {
                      $('#province1').empty();
                      $('#province1').append("<option value='0'> --Select Province-- </option>");
                      $.each(data, function(i,item) {
                              $('#province1').append('<option value="' + data[i].ProvinceID + '">' + data[i].ProvinceName + '</option>');
                          }),
                          complete: function() {
    
                          }
                  }
                 } );
    
          };
    

    【讨论】:

    • 不,伙计,它不工作。我已经尝试过,也是的,控制台上的错误已被删除,但我不明白为什么数据没有通过 javascript 解析为 html 标签
    • 我已经更新了省方法,我忘记了一个括号。也许可以解决问题,否则我会尝试招待其他人:)
    • 好的,我发现了一点语法错误,我刚刚更新了我的代码。问题,也许:),是你在 ajax 的第一个成功块中编写“函数”的方式
    • 你能检查我的jsfiddle,我在哪里进行了测试。现在,进入我的控制台,只有一个错误,即对 ajax url 的调用,这自然是行不通的。抱歉,我没有其他想法
    • 好的,我调查了一下。你能放弃我的问题吗?我会很感激的。
    【解决方案2】:

    首先,当您更改国家/地区时,您的事件处理程序在哪里?

    其次,您的代码中有一堆类似拼写错误的错误。

    这里有一些修复:

    $(document).ready(function() {
    
        // cache the elements that you will be re-using
        var $country = $('#country1'), $province = $('#province1');
    
        // renamed
        function getCountries() {
            $country.html("<option> Loading --- </option>");
            $province.html("<option value='0'>--Select Province-- </option>");
            $.ajax({
                type: "POST",
                url: "country_dropdown.php",
                // typo: datatype:"json"
                dataType: "json",
                // error: success: fuction (data) {
                success: function (data) {
                    $country.html("<option value='0'>-- Select Country---</option>"); // simplified
                    $.each(data, function (i, item) {
                        $country.append('<option value="' + item.CountryID + '">' + item.CountryName + '</option>');
                    });
                    // attach event listener to the country dropdown, so that when the country changes, we load the related provinces
                    $country.on('change', getProvinces);
                    // trigger event listener ^ to get related country's provinces
                    $country.trigger('change');
                }
            });
        }
    
        // renamed
        function getProvinces() {
            $province.html("<option> Loading --- </option>"); // simplified
            $.ajax ({
                type: "POST",
                url: "province_dropdown.php?id" + $(this).val(),
                dataType: "json",
                success: function (data) {
                    $province.html("<option value='0'> --Select Province-- </option>"); // simplified
                    // error: $.each(data, function(i.item)
                    $.each(data, function (i, item) {
                        // error: ('#province1').append(...) 
                        $province.append('<option value="' + item.ProvinceID + '">' + item.ProvinceName + '</option>');
                    });
                }
            });
        }
    
        // load the countries
        getCountries();
    });
    

    另外,使用prepare() 的全部目的是避免SQL 注入。您在第二个功能中使用它的方式是错误的。

    class.user.php

    public function getCountry() {
        $stmt = $this->conn->query("SELECT * FROM country"); // no need to use prepare() as you are not using any untrusted data
        return $stmt;
    }
    
    // renamed
    public function getProvinceByCountry($id) {
        $stmt = $this->conn->prepare("SELECT * FROM province WHERE Country_CountryID = ?"); // notice the '?' ?
        $stmt->execute(array($id));
        return $stmt;
    }
    

    您不需要构建 JSON 对象。使用json_encode()

    country_dropdown.php

    <?php
    include('config.php');
    include('class.user.php');
    
    try {
        $obj = new USER();
        $stmt = $obj->getCountry();
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        echo "Error: " . $e->getMessage();
    }
    
    $conn = null; //unnecessary
    
    header('Content-type: application/json');
    echo json_encode($results);
    ?>
    

    province_dropdown.php

    <?php
    include('config.php');
    include('class.user.php');
    
    try {
        $obj = new USER();
        $stmt = $obj->getProvinceByCountry($_GET["id"]);
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        echo "Error: " . $e->getMessage();
    }
    
    $conn = null; //unnecessary
    
    header('Content-type: application/json');
    echo json_encode($results);
    ?>
    

    【讨论】:

    • 你的解决方案看起来很有希望,但它仍然有一些错误,我试过这个 json_encode();方法并且它有效,但在 home.php 上获取数据的问题仍然完好无损。 while($result=$stmt->fetch(PDO::FETCH_ASSOC)){ $arr = array ($result['CountryID']=>$result['CountryName']);回声 json_encode($arr); }
    • 为什么要遍历结果集并存储到数组中?结果集已经是一个关联数组。
    • 由于某些原因,它会显示带有
      标签等类型的错误消息的未识别变量并显示国家/地区。与下一个索引国家相同
    【解决方案3】:

    您的 class.user.php 代码中的 getProvince() 函数在此处包含语法错误:='".$_GET["id"]."'" - 它应该是 ="'".$_GET["id"]."'"。此外,在编写数据库和列名时,我认为它应该是句号而不是下划线,但我对此不是 100% 确定。

    【讨论】:

    • 那么 class.user.php 文件不包含任何错误,getProvince() 函数也不包含任何错误,否则数据不会解析到 country_dropdown.php 页面和 json 。
    • @JahanxbKhan,哦,对不起。你说得对。当我查看代码时,我正在使用我的新平板电脑。我的眼睛不习惯这么小的屏幕。现在我在我的桌面上,我可以看到你是对的。
    猜你喜欢
    • 2020-12-06
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多