克隆的选择元素在提交时不会发布

时间:2018-05-23 14:11:28

标签: javascript php html

我有一个包含表格的表单,我还有一个按钮,允许用户通过克隆第一行来添加行。这是代码:

HTML

    <button onclick="insertRow()">Add Row</button>
    <form action="save.php" method="post">
<table class="mod_table" id="mod_table">
            <thead>
            <th>ID No.</th>
            <th>Lastname</th>
            <th>Firstname</th>
            <th>M.I.</th>
            <th>Course</th>
            <th>Address</th>
            <th>Contact No.</th>
        </thead>
            <tr id="mod_table_row">
                <td><input type="text" name="id_num[]" size="8" required></td>
                <td><input type="text" name="lname[]" required></td>
                <td><input type="text" name="fname[]" required></td>
                <td><input type="text" name="mname[]" size="1" required></td>
                <td><select name="course[]" style="padding: 2px;">
                    <?php $opt = mysqli_query($con,"SELECT * FROM tblcourses");
                    while($row = mysqli_fetch_array($opt)){?>
                    <option value="<?php echo $row['course_code'] ?>"><?php echo $row['abbr'] ?></option>
                    <?php } ?>
                </select></td>
                <td><input type="text" name="address[]" required></td>
                <td><input type="text" name="contact[]" size="11" required></td>
            </tr>
        </table>
<button>save</button>
</form>

JAVASCRIPT

function insertRow(){
var row = document.getElementById('mod_table_row');
var table = document.getElementById('mod_table');
var newRow = row.cloneNode(true);

table.appendChild(newRow);
}

我的问题是,当我提交表单时,它只发布原始select元素的选定值,并且不会发布克隆的选定值。所有其他输入都很有效,只有select元素不起作用。为什么?有人可以帮忙吗?

这是PHP代码:

<?php 
include '../dbcon.php';

$lim = $_POST['id_num'];
$lastname = $_POST['lname'];
$first = $_POST['fname'];
$mid = $_POST['mname'];
$course = $_POST['course'];
$addr = $_POST['address'];
$contact = $_POST['contact'];
for($i = 0; $i < count($lim); $i++ ){

    $id=$lim[$i];
    $lname =$lastname[$i];
    $fname = $first[$i];
    $mname = $mid[$i];
    $course = $course[$i];
    $add = $addr[$i];
    $cont = $contact[$i];


    $query = mysqli_query($con,"INSERT INTO tblstudent(id,lname,fname,mname,contact,address,course) VALUES ('$id','$lname','$fname','$mname','$cont','$add','$course')") or die(mysqli_error($con));
}
if($query == true){
    echo 'saved';
}
else{
    echo 'failed';
}
?>

3 个答案:

答案 0 :(得分:0)

您的数组标识符应该在开始时 [] FNAME [] L-NAME

这实际上会在post中创建对象数组 我相信这就是你想要的。

我使用此工具来测试我的假设是否正确关于数组标识符 http://phpfiddle.org

这是示例代码

<form method=post>
<select name=same[]>
<option>1<option>
<option>2<option>
</select>
<select name=same[]>
<option>1<option>
<option>2<option>
</select>

<input type=submit value=ok>
</form>

<?php 
echo var_dump($_POST["same"]);
?>

P.S 如果要提交对象数组,则需要使用objectName [] .prop作为输入字段的名称。

答案 1 :(得分:0)

令人费解的是,我用笔快速测试了你的代码并且工作正常。我已经在select中添加了几个课程,以替换查询,并将表单操作设置为一个简单的PHP文件,它打印回收到的所有内容。正如您所期望的那样,克隆行中的所有选定课程都在阵列中完成。

所以我认为你遇到的问题可能来自一些没有价值的课程。您能否发布带有选项元素的生成的HTML?

另外,请确保在将输入保存到数据库之前清理PHP中的输入。这是一个巨大的安全漏洞。

答案 2 :(得分:-1)

提交表单数据后,每个包含name的表单字段都会提交其value。由于您要克隆第一行,因此所有后续行都会使用与第一行完全相同的元素,这意味着您有多个具有相同name的元素。您需要确保每个新元素都有自己唯一的name

此外,克隆操作发生在客户端,但克隆元素包含服务器端代码(PHP)。 PHP运行的唯一方法是,在服务器将文档发送到客户端之前,它是否存在于文档中。您需要使用AJAX调用替换该PHP以使用新服务器内容更新已呈现的页面,或者您可以将克隆代码转到服务器并请求新页面以及创建服务器的附加行 - 侧。