【问题标题】:How to save multiple values from same input names如何保存来自相同输入名称的多个值
【发布时间】:2023-03-27 06:29:02
【问题描述】:

如何将来自相同输入名称的值保存在多行中。

比如我的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);
    }

但都乱七八糟了,前两行没有保存成绩或科目,有些行完全丢失了。

【问题讨论】:

  • 你不需要combine()。只需使用其中一个输入数组来设置循环,然后在访问循环内的另一个数组时使用$i。而且您需要为安全/稳定性准备好声明。

标签: php sql forms mysqli


【解决方案1】:

因为您正在调用array_combine(),所以您的循环不再将子数组索引作为$i 传递。它通过subject_id 作为$igrade_id 作为$val。您可以只使用$i$val 作为要插入的值,而不是尝试使用$i 重新访问$_POST 数组。

更简洁的脚本将使用 id 作为每个 &lt;select&gt; 上的硬编码元素键,而不是传递隐藏字段。

<?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 查询。我不会费心写出所有的变体——做你喜欢的……但一定要写出稳定/安全的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2017-04-08
    • 1970-01-01
    • 2021-09-06
    相关资源
    最近更新 更多