【问题标题】:inserting multiple fields with same name as a single record into database将具有相同名称的多个字段作为单个记录插入到数据库中
【发布时间】:2020-05-17 18:35:05
【问题描述】:

在我的应用程序中有一个具有两个选择字段的表单,其中最后一个选择设置为具有多项选择。我需要的是插入第一对选择字段作为单个记录插入到数据库中。当我尝试使用 for 循环执行此操作时,我可以将记录作为单行插入,直到并且除非我为我的第二个选择字段仅选择一个值。但是如果我选择多个字段进行第二次选择,则记录不正确。

这里用户也可以通过点击ADD按钮来添加更多的div

<div id="scope-brand-div">
    <div class="col-md-6">
        <div class="form-group">
            <label for="scope">Project Scope</label>
            <select name="scope[]" class="form-control scope-select">
                <option value=""></option>
                <option>A</option>
                <option>B</option>
                <option>C</option>
            </select>
        </div>
    </div>
    <div class="col-md-6">
        <div class="form-group">
            <label for="brands_used">Brands Used</label>
            <select multiple name="brands_used[]" class="form-control brand-select">
                <option value=""></option>
                <option>D</option>
                <option>E</option>
                <option>F</option>
            </select>
        </div>
    </div>
</div>

php

$s = $this->input->post('scope');
$b = $this->input->post('brands_used');

foreach( $s as $key => $n ) {
  $rows[] = $n.",".$b[$key];
}
print_r($rows);

场景 1

如果我为两个选择选择单个字段,输出将是:

A, D
B, E

场景 2

如果我为第二个选择选择多个字段,例如 A,(D,E) 和 B,F。在结果上方使用相同的循环将是:

A, D
B, E

如果我为第二个选择字段广告选择多个字段,我如何插入相同的字段,前提是用户可以添加更多像这样的 div。

编辑 1

<div id="scope-brand-div">
                <div class="col-md-6">
                  <div class="form-group">
                    <label for="scope"><?php echo $this->lang->line('xin_project_scope');?></label>
                    <select name="scope[]" class="form-control select-border-color border-warning scope-select" data-plugin="select_hrm" data-placeholder="<?php echo $this->lang->line('xin_project_scope');?>">
                      <option value=""></option>
                      <?php foreach($all_project_scope as $scope) { ?>
                      <option value="<?php echo $scope->scope_name; ?>"><?php echo $scope->scope_name; ?></option>
                      <?php } ?>
                    </select>
                  </div>
                </div>
                <div class="col-md-6">
                  <div class="form-group brands-ajax">
                    <label for="brands_used"><?php echo $this->lang->line('xin_brands_used');?></label>
                    <select multiple name="brands_used[]" class="form-control select-border-color border-warning brand-select" data-plugin="select_hrm" data-placeholder="<?php echo $this->lang->line('xin_brands_used');?>">
                    <option value=""></option>
                      <?php foreach($all_brands as $brands) { ?>
                      <option value="<?php echo $brands->brand_name; ?>"><?php echo $brands->brand_name; ?></option>
                      <?php } ?>
                    </select>
                  </div>
                </div>
              </div>

<script type="text/javascript">
$(document).ready(function(){
    $('#add-new').click(function(){
    var invoice_items = '<div id="scope-brand-div">'
                        + '<div class="col-md-6">'
                        +'<div class="form-group">'
                        + '<label for="scope"><?php echo $this->lang->line('xin_project_scope');?></label>'
                        +'<select name="scope[]" class="form-control scope-select"  data-placeholder="<?php echo $this->lang->line('xin_project_scope');?>">'
                        +'<option value=""></option>'
                        <?php foreach($all_project_scope as $scope) { ?>
                        +'<option value="<?php echo $scope->scope_name; ?>"><?php echo $scope->scope_name; ?></option>'
                        <?php } ?>
                        + '</select>'
                        + '</div>'
                        + '</div>'
                        + '<div class="col-md-6">'
                        + '<div class="form-group brands-ajax">'
                        + '<label for="brands_used"><?php echo $this->lang->line('xin_brands_used');?></label>'
                        +'<select name="brands_used[]" class="form-control brand-select" data-placeholder="<?php echo $this->lang->line('xin_brands_used');?>">'
                        +'<option value=""></option>'
                        <?php foreach($all_brands as $brands) { ?>
                        +'<option value="<?php echo $brands->brand_name; ?>"><?php echo $brands->brand_name; ?></option>'
                        <?php } ?>
                        +'</select>'
                        +'</div>'
                        + '</div>'
                        +'</div>'
    $('#clone-parent').append(invoice_items).fadeIn(500);
});
});
</script>

<?php
    public function add_project() {
    $s = $this->input->post('scope');
    $b = $this->input->post('brands_used');
    foreach( $s as $key => $n ) {
       $rows[] = $n.",".$b[$key];
        //insert query
      }
}

?>

编辑 2

echo var_export($this->input->post('brands_used'));

array (
0 => 
 array (
   0 => 'Opterna',
   ),
1 => 
 array (
    0 => 'Norden',
    ),
2 => 'Opterna',
)

echo var_export($this->input->post('scope'));

array (
 0 => 'ACS',
 1 => 'SMA TV',
 )

【问题讨论】:

  • 你能发布你的完整代码吗
  • 请看我的编辑。我已经添加了代码。
  • 认为您正在考虑制作更深的$_POST 数组结构,以便您可以将数据组分开。考虑scope[][]。我认为您需要一个计数器变量来声明第一级分组索引——否则自动递增将不会如所愿。这只是一个猜测/提示——不是答案。
  • &lt;option value=""&gt;&lt;/option&gt; 可以安全地缩减为&lt;option&gt;&lt;/option&gt;
  • 添加到我的编辑@mick

标签: php mysql


【解决方案1】:

关于您的 html...

  • 标签中的 for 仅在与字段的 id 属性关联时才能正常工作。
  • &lt;option&gt; 标签在文本和value 属性中具有相同的值,可以完全删除其value 属性——它在提交时的工作方式完全相同,但会从您的html 中消除膨胀。
  • 我将一个计数器附加到 idclonable 类到最外面的 &lt;div&gt; 以帮助 javascript 克隆过程。
  • brands_used[][] 需要为 brands_used[0][] 以防止第一级索引出现不必要的增量。

重写:

<div id="scope-brand-div0" class="clonable">
    <div class="col-md-6">
        <div class="form-group">
            <label for="scope0"><?php echo $this->lang->line('xin_project_scope'); ?></label>
            <select id="scope0" name="scope[]" class="form-control select-border-color border-warning scope-select" data-plugin="select_hrm" data-placeholder="<?php echo $this->lang->line('xin_project_scope'); ?>">
                <option></option>
                <?php foreach ($all_project_scope as $scope) {
                    echo "<option>{$scope->scope_name}</option>";
                } ?>
            </select>
        </div>
    </div>
    <div class="col-md-6">
        <div class="form-group brands-ajax">
            <label for="brands_used0"><?php echo $this->lang->line('xin_brands_used'); ?></label>
            <select multiple id="brands_used0" name="brands_used[0][]" class="form-control select-border-color border-warning brand-select" data-plugin="select_hrm" data-placeholder="<?php echo $this->lang->line('xin_brands_used'); ?>">
                <option></option>
                <?php foreach ($all_brands as $brands) {
                    echo "<option>{$brands->brand_name}</option>";
                } ?>
            </select>
        </div>
    </div>
</div>

至于您的克隆 javascript... 我建议您使用 clone() 来清理您的脚本。或许可以从https://stackoverflow.com/a/8018242/2943403 中汲取灵感。

您需要确保实施了“计数器”。原始/硬编码的字段集将以0 作为计数器;所有其他字段集应将所有 0 值替换为下一个增量整数。这将在提交时将所有相关字段保留在其相关组中。

具体来说:

  • &lt;div id="scope-brand-div0"&gt;(如果你真的需要的话)会变成&lt;div id="scope-brand-div1"&gt;
  • &lt;label for="scope0"&gt; 将变为 &lt;label for="scope1"&gt;
  • &lt;select id="scope0"&gt; 将变为 &lt;select id="scope1"&gt;
  • &lt;label for="brands_used0"&gt; 将变为 &lt;label for="brands_used1"&gt;
  • &lt;select multiple id="brands_used0" name="brands_used[0][]" 将变为 &lt;select multiple id="brands_used1" name="brands_used[1][]"

当然,如果再次单击“添加”按钮,则所有 1 都需要变为 2


至于处理您的$_POST 数据,我希望收到这样的结构:(在提供最合适的结构之前不要停止调整您的表单)

$_POST = [
    'scope' => [
        'ACS',
        'SMA TV'
     ],
     'brands_used' => [
         [
             'Opterna',
             'Norden'
         ],
         [
             'Opterna'
         ]
     ]
];

这意味着您可以使用相同的一级键来访问相关的scopebrands_used 值。当您遍历数据时,scope 数据将是一个字符串,brands_used 将是一个数组。

迭代:

// make an object-oriented mysqli connection ($mysqli)
$stmt = $mysqli->prepare("INSERT INTO tablensme (scope, brand_used) VALUES (?, ?)");
$stmt->bind_param('ss', $scope, $brand_used);
$posted = $this->input->post();
foreach ($posted['scope'] as $index => $scope) {
    // use $scope string
    foreach ($posted['brands_used'][$index] as $brand_used) {
        // use $brand_used string
        $stmt->execute();
    }
}

假设您有一个规范化的 db 表结构,并且希望为每个表行写入一个范围值和一个品牌使用值,请在循环之前设置准备好的语句和绑定变量,然后从内部循环调用 execute()

这是 100% 未测试,但插入示例数据的预期结果将是以下新行:

('ACS', 'Opterna'),
('ACS', 'Norden'),
('SMA TV', 'Opterna')

【讨论】:

  • 这是最好的,我可以通过我的手机和您提供的详细信息来完成。如果这不能按预期工作,我会尝试调整我的答案,但您需要非常清楚我的答案是如何失败的,并提供任何客户端或服务器端错误消息。
  • 在测试我的代码之前,我在原始文件中创建了相同的场景,只是为了获得您提到的 POST 结构。数组 ( 0 => 数组 ( 0 => 'Opterna', 1 => 'Opterna', 2 => 'Opterna', 3 => 'Norden', ), ) 这是我的 $_POST['brands_used'] 结果。我已将brands_used[] 更改为brands_used[0][]
  • 每次克隆文件时,[0] 必须递增——这样可以保持分组。这就是 js 块打算做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2017-11-06
相关资源
最近更新 更多