php - 如何保存来自相同输入名称的多个值
问题描述
如何将来自相同输入名称的值保存在多行中。
例如,我的 php,html 代码来自:
<form action="functions.php" method="post" name="grades">
<table>
<thead>
<tr>
<th>Subject</th>
<th>Grade</th>
</tr>
</thead>
<tbody>
<?php $unos = $baza->odradi("SELECT subject FROM subjects ORDER BY id ASC");
if (!empty($unos)) {
foreach($unos as $row=>$value){ ?>
<tr>
<td><input type="hidden" name="subject_id[]" value="<?= $unos[$row]["id"]; ?>"> <?= $unos[$row]["subject"]; ?></td>
<td>
<select class="form-control input-xs" name="grade_id[]" required>
<option selected disabled>Select grade</option>
<option value="5">excelent</option>
<option value="4">very good</option>
<option value="3">good</option>
<option value="2">ok</option>
<option value="1">bad</option>
</select>
</td>
</tr>
</tbody>
</table>
<input type="submit" name="grades" class="btn btn-success btn-lg" value="Submit grades">
</form>
需要保存的函数如下所示:
if (isset($_POST['grades'])) {
foreach (array_combine($_POST['subject_id'], $_POST['grade_id']) as $i => $val){
$subject = $_POST["subject_id"][$i];
$grade = $_POST["grade_id"][$i];
$sql = "INSERT INTO final_grade (subject_id,grade_id) VALUES ('$subject','$grade')";
$u = mysqli_query($db, $sql);
}
但这一切都搞砸了,前两行没有保存成绩或科目,而且所有一些行都完全丢失了。
解决方案
因为您正在调用array_combine()
,所以您的循环不再传递子数组索引$i
。它正在传递subject_id
as$i
和grade_id
as $val
。您可以只使用$i
and$val
作为要插入的值,而不是尝试$_POST
使用$i
.
更简洁的脚本将使用 id 作为每个上的硬编码元素键,<select>
而不是传递隐藏字段。
<?php
$options = [
5 => 'excellent',
4 => 'very good',
3 => 'good',
2 => 'ok',
1 => 'bad'
];
?>
<td><?= $unos[$row]["subject"]; ?></td>
<td><select class="form-control input-xs" name="grade[<?= $unos[$row]["id"]; ?>]" required>
<option disabled>Select grade</option>
<?php
foreach ($options as $opt_id => $opt_val) {
echo "<option value=\"{$opt_id}\">{$opt_val}</option>";
}
?>
</select>
</td>
然后您可以简单地访问关联提交。
if (isset($_POST['grade'])) {
// use prepared statement and bind variables
foreach ($_POST['grade'] as $id => $val) {
// execute prepared statement with each iteration
}
}
或者,您可以建立一批结果并执行一次 INSERT(我可能会这样做)。
建议的批量插入代码:
$placeholders = [];
$params = ['']; // instantiate with no types in first element
foreach ($_POST['grade'] as $subject_id => $grade_id) {
$placeholders[] = '(?,?)'; // all necessary placeholders for the row
$params[0] .= 'ii'; // because you are passing 2 integer values per batch
array_push($params, $subject_id, $grade_id);
}
// execute single batch of inserts
$query = "INSERT INTO final_grade (subject_id,grade_id) VALUES " . implode(',', $placeholders);
$stmt = $conn->prepare($query);
$stmt->bind_param($params);
$stmt->execute();
事实上,您可以通过多种方式从表单中传递数据,并且可以通过多种方式执行 INSERT 查询。我不会费心写出所有的变化——做你喜欢的……但一定要写稳定/安全的查询。
推荐阅读
- java - 使用 spring Kafka 连接到多个 Kafka 集群
- python - Google Colab Fine Tuning BERT Base Cased with Transformers and PyTorch 中的间歇性“RuntimeError: CUDA out of memory”错误
- python - Pandas 用正则表达式分成列
- android - Android 通知单击保持堆栈并在需要时将应用程序置于最前面。如果特定活动在顶部,则传递数据
- linux - 构建 Xerces-C 时缺少 Plo 文件
- testing - UnhandledPromiseRejectionWarning:错误:协议错误(Runtime.callFunctionOn):已收集承诺
- flutter - 无效参数:在 URI 文件中未指定主机:///p1
- python - Python:从 web 的 zipfile 中提取文件,无需先下载并保存
- reactjs - how to get the data where id is equal to the id of other json data?
- html - 如何在 Kendo Multiselect 组件中从上显示/打开下拉列表以获取角度