Php 将与单个记录同名的多个字段插入数据库
在我的应用程序中,有一个表单具有两个选择字段,其中最后一个选择设置为具有多个选择。我需要的是将第一对select字段作为单个记录插入数据库。当我尝试使用for循环执行此操作时,我能够将记录作为单行插入,直到并且除非我为第二个选择字段仅选择一个值。但是如果我为第二次选择选择多个字段,则记录不正确 在这里,用户还可以通过单击“添加”按钮添加更多div 情景1 如果我为两个select选择单个字段,则输出将为:Php 将与单个记录同名的多个字段插入数据库,php,mysql,Php,Mysql,在我的应用程序中,有一个表单具有两个选择字段,其中最后一个选择设置为具有多个选择。我需要的是将第一对select字段作为单个记录插入数据库。当我尝试使用for循环执行此操作时,我能够将记录作为单行插入,直到并且除非我为第二个选择字段仅选择一个值。但是如果我为第二次选择选择多个字段,则记录不正确 在这里,用户还可以通过单击“添加”按钮添加更多div 情景1 如果我为两个select选择单个字段,则输出将为: A, D B, E A, D B, E 情景2 如果我为第二个选择选择多个字段,如a、
A, D
B, E
A, D
B, E
情景2
如果我为第二个选择选择多个字段,如a、D、E和B、F。使用上面的相同循环,结果将是:
A, D
B, E
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
}
}
?>
关于你的html
标签中的for仅在与字段的id属性关联时才能正常工作。
在文本和value属性中具有相同值的标记可以完全删除它们的value属性-它在提交时的工作方式完全相同,但会从html中删除bloat。
我在id后面添加了一个计数器,在最外层添加了clonable类,以帮助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>
这意味着您可以使用相同的第一级键访问相关的范围和使用的值。在遍历数据时,作用域数据将是一个字符串,而使用的是一个数组
要迭代:
// 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表结构,并且希望为每个表行写入一个范围值和一个brand_used值,那么在循环之前设置准备好的语句和绑定变量,然后从内部循环调用execute
这是100%未测试的,但插入样本数据的预期结果将是以下新行:
('ACS', 'Opterna'),
('ACS', 'Norden'),
('SMA TV', 'Opterna')
你能发布你的完整代码吗?请看我的编辑。我已经添加了代码。我想你正在考虑制作一个更深的$\u post数组结构,这样你就可以将数据组分开。从范围[]的角度考虑。我认为您需要一个计数器变量来声明第一级分组索引,否则自动递增将不符合需要。这只是猜测/暗示-不是答案。可以安全地减少到添加到我的编辑@Mick这是我可以从我的手机和您提供的详细信息做的最好的事情。如果这不符合要求,我将尝试调整我的答案,但您需要非常清楚我的答案是如何失败的,并提供任何客户端或服务器端错误消息。在测试我的代码之前,我在原始文件中创建了相同的场景,只是为了获得您提到的帖子结构。数组0=>array 0=>'Opterna',1=>'Opterna',2=>'Opterna',3=>'Norden',这是我对$\u POST['brands\u used']的结果。我已将brands_used[]更改为brands_used[0][]每次克隆Foeld时,[0]必须递增-这将保持分组。这就是js block打算做的。
// 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();
}
}
('ACS', 'Opterna'),
('ACS', 'Norden'),
('SMA TV', 'Opterna')