需要帮助使用 MySQL 相关的下拉菜单创建添加行功能

Posted

技术标签:

【中文标题】需要帮助使用 MySQL 相关的下拉菜单创建添加行功能【英文标题】:Need help creating add rows function with MySQL dependent dropdowns 【发布时间】:2021-12-21 16:24:42 【问题描述】:

Single Hardware Modification

Mulitple Hardware Modifications

我正在尝试使用 mysqlphpjavascript 设置设备日志。在过去的 3 个月里,我一直在努力自学。我拥有的很多东西来自我在这里或其他论坛上找到的代码。

我有一个专门用于在我们的设备上输入硬件更改的页面。 Subsystem 和 Component 下拉菜单设置为从数据库中提取子系统列表,并根据子系统选择填充组件列表。我还没有深入了解 JavaScript,所以我不完全理解这段代码的一些含义。

我已经把页面设置为输入一个修改,然后提交后,有一个链接可以返回页面添加另一个修改。此选项按预期工作。我的下拉菜单正常工作,并且我的数据按预期输入到我的数据库中。

我正在尝试设置一个页面,以便如果有多个修改,可以将它们添加到一个页面上。我在表单上的所有文本输入字段都按预期工作。我能够为子系统创建第一个下拉列表并用我的表数据填充它,但组件下拉列表不会填充。我一直在关注webslesson.com 的本教程。在其中,他使用了 1 张桌子。我一直在尝试为我正在使用的 2 个表调整它,但我得到了一些功能错误。

谁能指出我可以了解我的代码在哪里偏离轨道的正确方向?我正在努力学习,但目前我不确定如何表达我在寻找的内容。

感谢您查看此内容。请不要对我糟糕的代码太苛刻。我正在努力让它随着我的学习而变得更好。

以上是我的 CodePen.io 和 repl.it 的链接,用于我的页面的 2 个版本。我不得不

这是我的餐桌设置:

lu_subsystem |id|子系统名称| |--|--------------|

lu_component |component_id|subsystem_id|component_name| |------------|------------|--------------|

<?php

//index.php

include('database_connection.php');

?>

<!DOCTYPE html>
<html>
  <head>
    <title>Add Remove Dynamic Dependent Select Box using Ajax jQuery with PHP</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  </head>
  <body>
    <br />
    <div class="container">
      <h3 align="center">Add Remove Dynamic Dependent Select Box using Ajax jQuery with PHP</h3>
      <br />
      <h4 align="center">Enter Item Details</h4>
      <br />
      <form method="post" id="insert_form">
        <div class="table-responsive">
          <span id="error"></span>
          <table class="table table-bordered" id="item_table">
            <thead>
              <tr>
                <th>Enter Item Name</th>
                <th>Subsystem</th>
                <th>Component</th>
                <th><button type="button" name="add" class="btn btn-success btn-xs add"><span class="glyphicon glyphicon-plus"></span></button></th>
              </tr>
            </thead>
            <tbody></tbody>
          </table>
          <div align="center">
            <input type="submit" name="submit" class="btn btn-info" value="Insert" />
          </div>
        </div>
      </form>
    </div>
  </body>
</html>
<script>
    $(document).ready(function()
      
      var count = 0;

      $(document).on('click', '.add', function()
        count++;
        var html = '';
        html += '<tr>';
        html += '<td><input type="text" name="item_name[]" class="form-control item_name" /></td>';
        html += '<td><select name="subsystem_id[]" class="form-control subsystem_id" data-subsystem_id="'+count+'"><option value="">Select Subsystem</option><?php echo fill_select_box($connect, "0"); ?></select></td>';
        html += '<td><select name="item_component_id[]" class="form-control item_component_id" id="item_component_id'+count+'"><option value="">Select Component</option></select></td>';
        html += '<td><button type="button" name="remove" class="btn btn-danger btn-xs remove"><span class="glyphicon glyphicon-minus"></span></button></td>';
        $('tbody').append(html);
      );

      $(document).on('click', '.remove', function()
        $(this).closest('tr').remove();
      );

      $(document).on('change', '.subsystem_id', function()
        var id = $(this).val();
        var component_id = $(this).data('component_id');
        $.ajax(
          url:"fill_sub_category.php",
          method:"POST",
          data:subsystem_id:subsystem_id,
          success:function(data)
          
            var html = '<option value="">Select Component</option>';
            html += data;
            $('#item_component_id'+component_id).html(html);
          
        )
      );

      $('#insert_form').on('submit', function(event)
        event.preventDefault();
        var error = '';
        $('.item_name').each(function()
          var count = 1;
          if($(this).val() == '')
          
            error += '<p>Enter Item name at '+count+' Row</p>';
            return false;
          
          count = count + 1;
        );

        $('.item_category').each(function()
          var count = 1;

          if($(this).val() == '')
          
            error += '<p>Select Item Category at '+count+' row</p>';
            return false;
          

          count = count + 1;

        );

        $('.item_component_id').each(function()

          var count = 1;

          if($(this).val() == '')
          
            error += '<p>Select Item Sub category '+count+' Row</p> ';
            return false;
          

          count = count + 1;

        );

        var form_data = $(this).serialize();

        if(error == '')
        
          $.ajax(
            url:"insert.php",
            method:"POST",
            data:form_data,
            success:function(data)
            
              if(data == 'ok')
              
                $('#item_table').find('tr:gt(0)').remove();
                $('#error').html('<div class="alert alert-success">Item Details Saved</div>');
              
            
          );
        
        else
        
          $('#error').html('<div class="alert alert-danger">'+error+'</div>');
        

      );
      
    );
</script>
<?php

//database_connection.php

$connect = new PDO("mysql:host=localhost; dbname=bunker_logs;", "root", "");

function fill_select_box($connect, $id)

 $query = "
  SELECT * FROM lu_subsystem
  ";

 $statement = $connect->prepare($query);

 $statement->execute();

 $result = $statement->fetchAll();

 $output = '';

 foreach($result as $row)
 
  $output .= '<option value="'.$row["id"].'">'.$row["subsystem_name"].'</option>';
 

 return $output;


function fill_component_box($connect, $component_id)

 $query = "
  SELECT * FROM lu_component
  WHERE component_id ='".$id."'
  ";

 $statement = $connect->prepare($query);

 $statement->execute();

 $result = $statement->fetchAll();

 $output = '';

 foreach($result as $row)
 
  $output .= '<option value="'.$row["component_id"].'">'.$row["component_name"].'</option>';
 

 return $output;


?>
<?php

//fill_component.php

include('database_connection.php');


echo fill_component_box($connect, $_POST["subsystem_id"]);
?>

【问题讨论】:

有人向我指出其中一个 PHP 文件丢失了。我将多输入链接更新为包含 PHP 文件代码的 repl.it。 我在不同的教程之后尝试了不同的方法。我更新了我的代码和我的 replit。 【参考方案1】:

我一直在研究你的代码,老实说,我在 jQuery 方面做得不多。但是,我仍然想给您一个示例,说明如何根据我的经验在您的页面上实施信息:

您可以使用 PHP 直接从数据库中提取信息,而无需使用 JavaScript。如果为此使用 PDO,则会得到一个多维数组。

然后您可以使用 foreach 循环“遍历”数组

$select ='<select id='yourChoice'>';
foreach($array as $component)
    $name = component['name'];
    $select.="<option value='$name'> $name </option>;
;
$select.='</select>';

在这种情况下,$array 是数据库的完整打印输出,并遍历每一行($component)

然后它选择列名,并填写它。

如果你想用 JavaScript 做同样的事情,你可以用 JSON 来做,遍历那个数组。 不幸的是,我目前还没有为该示例准备好的示例。

【讨论】:

以上是关于需要帮助使用 MySQL 相关的下拉菜单创建添加行功能的主要内容,如果未能解决你的问题,请参考以下文章

如何向我创建的这个自定义 flexbox 导航栏添加下拉菜单?

Bootstrap 3 下拉菜单不更新

如何创建使用 PHP 从数据库中删除行的下拉菜单?

如何使用phpmyadmin和mysql从web下拉菜单中修复搜索功能? [重复]

如何使用通过数据模型排序的下拉菜单值查询 Mongoose?

如何在 Grafana 中添加下拉菜单?