【问题标题】:Update dropdown list after adding a new data into the database将新数据添加到数据库后更新下拉列表
【发布时间】:2015-08-15 20:06:10
【问题描述】:

我有一个下拉列表,通过<select>,它是由一个javascript代码生成的,它也来自我的数据库:

function dirfunc(){

  var dirdiv = document.getElementById("dirdiv");
  var ahref = document.getElementById("href");
  var directidarr = new Array();
  var directorarr = new Array();

  <?php

    include("../conn.php");
    if($stmt = $con->prepare("SELECT directorid,directorname FROM directortb")){
      $stmt->execute();
      $stmt->bind_result($directorid,$directorname);
      $counter = 0;
      while($stmt->fetch()){
        ?>
          directidarr[<?php echo $counter; ?>] = "<?php echo $directorid; ?>";
          directorarr[<?php echo $counter; ?>] = "<?php echo $directorname; ?>";
        <?php
        $counter = $counter + 1;
      }
      $stmt->close();
    }
  ?>

  var div = document.createElement("div");
  div.setAttribute("class","form-group");

  var label = document.createElement("label");
  label.setAttribute("class","col-sm-2 control-label");
  label.appendChild(document.createTextNode("Director"));

  var div2 = document.createElement("div");
  div2.setAttribute("class","col-sm-9");

  var sel = document.createElement("select");
  sel.setAttribute("name","director");
  sel.setAttribute("class","form-control");

  for (var x = 0; x < directidarr.length; x++){
    var opt = document.createElement("option");
    opt.appendChild(document.createTextNode(directorarr[x]));
    opt.setAttribute("value", directidarr[x]);
    sel.appendChild(opt);
  }

  var div3 = document.createElement("div");
  div3.setAttribute("class","col-sm-1");

  var div4 = document.createElement("div");
  div4.setAttribute("class","input-group");

  div2.appendChild(sel);
  div3.appendChild(ahref);
  div.appendChild(label);
  div.appendChild(div2);
  div.appendChild(div3);
  dirdiv.appendChild(div);

}

在我的 HTML 代码中,它生成下拉菜单,在其右侧是一个显示模式的按钮。在此模式中,是一种允许用户为选择下拉列表添加更多选项的表单。

这是我用来添加数据而不刷新页面的脚本:

$(function() {
    $("#adddirector").click(function(e) {
        e.preventDefault();
        var directorname = $("#directorname").val();
        var dataString = 'directorname=' + directorname;

        if(directorname == '')
        {
            $('.success').fadeOut(200).hide();
            $('.error').fadeIn(200).show();
        }
        else
        {
            $.ajax({
                type: "POST",
                url: "../action.php",
                data: dataString,
                success:{
                    $('.success').fadeIn(200).show();
                    $('.error').fadeOut(200).hide();
                }
            });
        }
        return false;
    });
}); 

使用这种形式:

<form class="form-horizontal" action="../action.php" method="POST">
  <div class="form-group">
    <label for="inputEmail3" class="col-sm-2 control-label">Director's Name</label>
    <div class="col-sm-10" id="ccdiv">
      <input type="text" class="form-control" name="directorname" id="directorname" value="" required>
    </div>
  </div>
  <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
      <button type="submit" class="btn btn-default" name="adddirector" id="adddirector">Add Director <span class="glyphicon glyphicon-plus"></span></button>
    </div>
  </div>
</form>

但是添加新数据后,通过表单或后端/phpmyadmin,下拉列表没有更新。用户仍然必须刷新页面才能更新下拉列表。我缺少什么或应该对我的脚本做什么?

【问题讨论】:

  • 我认为问题在于您的包含include("../conn.php");。记住文件仅在页面加载时包含。这就是它在刷新时起作用的原因,尝试在你的函数之外添加include
  • 您的添加导演代码在哪里?页面加载时给定的代码只执行一次。
  • @LuthandoLoot - 实际上,这不是问题。我连接良好,它可以顺利获取数据。而连接文件其实就在这个文件的pre-folder里面。
  • @Sachink - 同时,我正在通过后端/phpmyadmin 向directortb 添加数据。
  • 没错,您的 php 代码在页面加载时只执行一次。您需要 ajax 来获取更新的数据。对,刷新页面后就可以了'

标签: javascript php mysql ajax twitter-bootstrap


【解决方案1】:

我假设创建新 Director 的表单在提交时发送一个 ajax 请求,该请求由一些 PHP 代码处理,该代码将使用这个新条目更新数据库。

我建议,在此 PHP 代码中,您返回新插入条目的 id。然后,您可以在您的 ajax 调用中添加一个“成功”函数,该函数在插入后将接收该新 id,因此您可以使用它将新行添加到您的选择框。

编辑:

$(function() {
    $("#adddirector").click(function(e) {
        e.preventDefault();
        var directorname = $("#directorname").val();
        //in jQuery you can pass an object, directorname will now show up as $_POST['directorname'] in your PHP handler.
        var dataObj = {'directorname': directorname}

        if(directorname == '')
        {
            $('.success').fadeOut(200).hide();
            $('.error').fadeIn(200).show();
        }
        else
        {
            $.ajax({
                type: "POST",
                url: "../action.php",
                data: dataObj,
                //success function should receive the id back as result
                success: function(result){
                    var newId = result;

                    // create and append the new option here with the new id and the given name.
                    var newOption = $('<option></option>');
                    newOption.val(result);
                    newOption.html(directorname);
                    $('.form-control[name="director"]').append(newOption)

                    $('.success').fadeIn(200).show();
                    $('.error').fadeOut(200).hide();
                }
            });
        }
        return false;
    });
}); 

并确保您的 php 文件 action.php 在文件末尾回显新 id!如果您想让我看一下,请将代码也发布到该文件中。 这是来自stackoverflow的一个问题可能会帮助您使用php。 Getting insert id with insert PDO MySQL

【讨论】:

  • 用固定的 ajax 代码更新,确保你也改变你的 php 来回显新插入的 id。您必须了解,除非您使用某种框架,否则这些动态更新不会自行发生,您需要自己编写整个链(发送请求、处理请求、接收响应、更新页面)。
  • 谢谢!无需通过 javascript 打印下拉列表,只需应用 ajax。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多